Search in sources :

Example 1 with SlotContract

use of com.icodici.universa.contract.services.SlotContract in project universa by UniversaBlockchain.

the class SlotContractTest method serializeSmartContract.

@Test
public void serializeSmartContract() throws Exception {
    final PrivateKey key = new PrivateKey(Do.read(rootPath + "_xer0yfe2nn1xthc.private.unikey"));
    Contract simpleContract = new Contract(key);
    simpleContract.seal();
    Contract paymentDecreased = createSlotPayment();
    Contract smartContract = new SlotContract(key);
    assertTrue(smartContract instanceof SlotContract);
    ((SlotContract) smartContract).putTrackingContract(simpleContract);
    ((SlotContract) smartContract).setNodeInfoProvider(nodeInfoProvider);
    smartContract.addNewItems(paymentDecreased);
    smartContract.seal();
    smartContract.check();
    smartContract.traceErrors();
    assertTrue(smartContract.isOk());
    Binder b = BossBiMapper.serialize(smartContract);
    Contract desContract = DefaultBiMapper.deserialize(b);
    assertSameContracts(smartContract, desContract);
    assertEquals(NSmartContract.SmartContractType.SLOT1.name(), desContract.getDefinition().getExtendedType());
    assertEquals(NSmartContract.SmartContractType.SLOT1.name(), desContract.get("definition.extended_type"));
    assertTrue(desContract instanceof SlotContract);
    Multimap<String, Permission> permissions = desContract.getPermissions();
    Collection<Permission> mdp = permissions.get("modify_data");
    assertNotNull(mdp);
    assertTrue(((ModifyDataPermission) mdp.iterator().next()).getFields().containsKey("action"));
    assertEquals(simpleContract.getId(), ((SlotContract) desContract).getTrackingContract().getId());
    assertEquals(simpleContract.getId(), TransactionPack.unpack(((SlotContract) desContract).getPackedTrackingContract()).getContract().getId());
    Binder trackingHashesAsBase64 = desContract.getStateData().getBinder("tracking_contract");
    for (String k : trackingHashesAsBase64.keySet()) {
        byte[] packed = trackingHashesAsBase64.getBinary(k);
        if (packed != null) {
            Contract c = Contract.fromPackedTransaction(packed);
            assertEquals(simpleContract.getId(), c.getId());
        }
    }
    Contract copiedContract = smartContract.copy();
    assertSameContracts(smartContract, copiedContract);
    assertEquals(NSmartContract.SmartContractType.SLOT1.name(), copiedContract.getDefinition().getExtendedType());
    assertEquals(NSmartContract.SmartContractType.SLOT1.name(), copiedContract.get("definition.extended_type"));
    assertTrue(copiedContract instanceof SlotContract);
    permissions = copiedContract.getPermissions();
    mdp = permissions.get("modify_data");
    assertNotNull(mdp);
    assertTrue(((ModifyDataPermission) mdp.iterator().next()).getFields().containsKey("action"));
    assertEquals(simpleContract.getId(), ((SlotContract) copiedContract).getTrackingContract().getId());
    assertEquals(simpleContract.getId(), TransactionPack.unpack(((SlotContract) copiedContract).getPackedTrackingContract()).getContract().getId());
    trackingHashesAsBase64 = copiedContract.getStateData().getBinder("tracking_contract");
    for (String k : trackingHashesAsBase64.keySet()) {
        byte[] packed = trackingHashesAsBase64.getBinary(k);
        if (packed != null) {
            Contract c = Contract.fromPackedTransaction(packed);
            assertEquals(simpleContract.getId(), c.getId());
        }
    }
}
Also used : Binder(net.sergeych.tools.Binder) PrivateKey(com.icodici.crypto.PrivateKey) ModifyDataPermission(com.icodici.universa.contract.permissions.ModifyDataPermission) ModifyDataPermission(com.icodici.universa.contract.permissions.ModifyDataPermission) Permission(com.icodici.universa.contract.permissions.Permission) NSmartContract(com.icodici.universa.contract.services.NSmartContract) SlotContract(com.icodici.universa.contract.services.SlotContract) SlotContract(com.icodici.universa.contract.services.SlotContract) Test(org.junit.Test)

Example 2 with SlotContract

use of com.icodici.universa.contract.services.SlotContract in project universa by UniversaBlockchain.

the class SlotContractTest method keepRevisions.

@Test
public void keepRevisions() throws Exception {
    final PrivateKey key = new PrivateKey(Do.read(rootPath + "_xer0yfe2nn1xthc.private.unikey"));
    Contract simpleContract = new Contract(key);
    simpleContract.seal();
    Contract paymentDecreased = createSlotPayment();
    Contract smartContract = new SlotContract(key);
    assertTrue(smartContract instanceof SlotContract);
    ((SlotContract) smartContract).putTrackingContract(simpleContract);
    ((SlotContract) smartContract).setNodeInfoProvider(nodeInfoProvider);
    ((SlotContract) smartContract).setKeepRevisions(2);
    smartContract.addNewItems(paymentDecreased);
    smartContract.seal();
    smartContract.check();
    smartContract.traceErrors();
    assertTrue(smartContract.isOk());
    assertEquals(1, ((SlotContract) smartContract).getTrackingContracts().size());
    assertEquals(simpleContract.getId(), ((SlotContract) smartContract).getTrackingContract().getId());
    assertEquals(simpleContract.getId(), TransactionPack.unpack(((SlotContract) smartContract).getPackedTrackingContract()).getContract().getId());
    Binder trackingHashesAsBase64 = smartContract.getStateData().getBinder("tracking_contract");
    for (String k : trackingHashesAsBase64.keySet()) {
        byte[] packed = trackingHashesAsBase64.getBinary(k);
        if (packed != null) {
            Contract c = Contract.fromPackedTransaction(packed);
            assertEquals(simpleContract.getId(), c.getId());
        }
    }
    Contract simpleContract2 = simpleContract.createRevision(key);
    simpleContract2.seal();
    ((SlotContract) smartContract).putTrackingContract(simpleContract2);
    smartContract.seal();
    smartContract.check();
    smartContract.traceErrors();
    assertTrue(smartContract.isOk());
    assertEquals(2, ((SlotContract) smartContract).getTrackingContracts().size());
    assertEquals(simpleContract2.getId(), ((SlotContract) smartContract).getTrackingContract().getId());
    assertEquals(simpleContract2.getId(), TransactionPack.unpack(((SlotContract) smartContract).getPackedTrackingContract()).getContract().getId());
    trackingHashesAsBase64 = smartContract.getStateData().getBinder("tracking_contract");
    for (String k : trackingHashesAsBase64.keySet()) {
        byte[] packed = trackingHashesAsBase64.getBinary(k);
        if (packed != null) {
            Contract c = Contract.fromPackedTransaction(packed);
            assertThat(c.getId(), Matchers.anyOf(equalTo(simpleContract.getId()), equalTo(simpleContract2.getId())));
        }
    }
    Contract simpleContract3 = simpleContract2.createRevision(key);
    simpleContract3.seal();
    ((SlotContract) smartContract).putTrackingContract(simpleContract3);
    smartContract.seal();
    smartContract.check();
    smartContract.traceErrors();
    assertTrue(smartContract.isOk());
    assertEquals(2, ((SlotContract) smartContract).getTrackingContracts().size());
    assertEquals(simpleContract3.getId(), ((SlotContract) smartContract).getTrackingContract().getId());
    assertEquals(simpleContract3.getId(), TransactionPack.unpack(((SlotContract) smartContract).getPackedTrackingContract()).getContract().getId());
    trackingHashesAsBase64 = smartContract.getStateData().getBinder("tracking_contract");
    for (String k : trackingHashesAsBase64.keySet()) {
        byte[] packed = trackingHashesAsBase64.getBinary(k);
        if (packed != null) {
            Contract c = Contract.fromPackedTransaction(packed);
            assertThat(c.getId(), Matchers.anyOf(equalTo(simpleContract.getId()), equalTo(simpleContract2.getId()), equalTo(simpleContract3.getId())));
        }
    }
}
Also used : Binder(net.sergeych.tools.Binder) PrivateKey(com.icodici.crypto.PrivateKey) NSmartContract(com.icodici.universa.contract.services.NSmartContract) SlotContract(com.icodici.universa.contract.services.SlotContract) SlotContract(com.icodici.universa.contract.services.SlotContract) Test(org.junit.Test)

Example 3 with SlotContract

use of com.icodici.universa.contract.services.SlotContract in project universa by UniversaBlockchain.

the class ScriptEngineTest method latestHttpContractFromSlot1.

@Test
public void latestHttpContractFromSlot1() throws Exception {
    System.out.println("============= start nodes...");
    TestSpace testSpace = prepareTestSpace(TestKeys.privateKey(0));
    testSpace.nodes.forEach(m -> m.config.setIsFreeRegistrationsAllowedFromYaml(true));
    System.out.println("============= start nodes done\n\n\n");
    Contract contractServer = new Contract(TestKeys.privateKey(0));
    String js = "";
    js += "var jsApiEvents = new Object();";
    js += "jsApiEvents.httpHandler_getVersion = function(request, response){" + "  response.setBodyAsJson({" + "    version: 1" + "  });" + "};";
    contractServer.getState().setJS(js.getBytes(), "client script.js", new JSApiScriptParameters(), true);
    RoleLink issuerLink = new RoleLink("issuer_link", "issuer");
    contractServer.registerRole(issuerLink);
    Permission perm = new ModifyDataPermission(issuerLink, Binder.of("fields", Binder.of("scripts", null)));
    contractServer.addPermission(perm);
    contractServer.seal();
    contractServer = Contract.fromPackedTransaction(contractServer.getPackedTransaction());
    ItemResult itemResult = testSpace.client.register(contractServer.getPackedTransaction(), 5000);
    assertEquals(ItemState.APPROVED, itemResult.state);
    // put contractServer rev1 into slot1
    SlotContract slotContract = ContractsService.createSlotContract(new HashSet<>(Arrays.asList(TestKeys.privateKey(0))), new HashSet<>(Arrays.asList(TestKeys.publicKey(0))), nodeInfoProvider);
    slotContract.setNodeInfoProvider(nodeInfoProvider);
    slotContract.putTrackingContract(contractServer);
    Contract stepaU = InnerContractsService.createFreshU(100000000, new HashSet<>(Arrays.asList(TestKeys.publicKey(0))));
    itemResult = testSpace.client.register(stepaU.getPackedTransaction(), 5000);
    System.out.println("stepaU : " + itemResult);
    assertEquals(ItemState.APPROVED, itemResult.state);
    Parcel parcel = ContractsService.createPayingParcel(slotContract.getTransactionPack(), stepaU, 1, 100, new HashSet<>(Arrays.asList(TestKeys.privateKey(0))), false);
    testSpace.client.registerParcelWithState(parcel.pack(), 5000);
    itemResult = testSpace.client.getState(slotContract.getId());
    System.out.println("slot : " + itemResult);
    assertEquals(ItemState.APPROVED, itemResult.state);
    // start http server
    JSApiHttpServerRoutes routes = new JSApiHttpServerRoutes();
    routes.setPortToListen(8880);
    routes.addNewRoute("/contract1/getVersion", "httpHandler_getVersion", contractServer, "client script.js", null, slotContract.getId());
    JSApiHttpServer httpServer = new JSApiHttpServer(routes, new JSApiExecOptions(), hashId -> {
        try {
            return testSpace.client.getState(hashId).state == ItemState.APPROVED;
        } catch (ClientError e) {
            e.printStackTrace();
            return false;
        }
    }, (slotId, originId) -> {
        try {
            Binder slotInfo = testSpace.client.querySlotInfo(slotId);
            return testSpace.client.queryContract(slotId, originId, null);
        } catch (ClientError e) {
            e.printStackTrace();
            return null;
        }
    });
    // here can be any http client. JSApiHttpClient used just for easiness
    JSApiScriptParameters scriptParameters = new JSApiScriptParameters();
    scriptParameters.domainMasks.add("localhost:*");
    JSApiHttpClient httpClient = new JSApiHttpClient(scriptParameters);
    // http access to contractServer rev1
    List httpRes = httpClient.sendGetRequest("http://localhost:8880/contract1/getVersion", JSApiHttpClient.RESPTYPE_JSON);
    System.out.println("httpRes: " + httpRes);
    assertEquals(1l, ((HashMap) httpRes.get(1)).get("version"));
    // create and register contractServer rev2
    Contract contractServer2 = contractServer.createRevision();
    contractServer2.addSignerKey(TestKeys.privateKey(0));
    String js2 = "";
    js2 += "var jsApiEvents = new Object();";
    js2 += "jsApiEvents.httpHandler_getVersion = function(request, response){" + "  response.setBodyAsJson({" + "    version: 2" + "  });" + "};";
    contractServer2.getState().setJS(js2.getBytes(), "client script.js", new JSApiScriptParameters(), true);
    contractServer2.seal();
    contractServer2 = Contract.fromPackedTransaction(contractServer2.getPackedTransaction());
    ItemResult itemResult2 = testSpace.client.register(contractServer2.getPackedTransaction(), 5000);
    assertEquals(ItemState.APPROVED, itemResult2.state);
    assertEquals(ItemState.REVOKED, testSpace.client.getState(contractServer.getId()).state);
    // force update server contracts from slot1
    httpServer.checkAllContracts();
    // http access to contractServer rev2
    httpRes = httpClient.sendGetRequest("http://localhost:8880/contract1/getVersion", JSApiHttpClient.RESPTYPE_JSON);
    System.out.println("httpRes: " + httpRes);
    assertEquals(2l, ((HashMap) httpRes.get(1)).get("version"));
    System.out.println("\n\n\n============= shutdown...");
    testSpace.nodes.forEach(m -> m.shutdown());
    httpServer.stop();
}
Also used : RoleLink(com.icodici.universa.contract.roles.RoleLink) Parcel(com.icodici.universa.contract.Parcel) SlotContract(com.icodici.universa.contract.services.SlotContract) Binder(net.sergeych.tools.Binder) ItemResult(com.icodici.universa.node.ItemResult) JSApiChangeNumberPermission(com.icodici.universa.contract.jsapi.permissions.JSApiChangeNumberPermission) JSApiPermission(com.icodici.universa.contract.jsapi.permissions.JSApiPermission) JSApiSplitJoinPermission(com.icodici.universa.contract.jsapi.permissions.JSApiSplitJoinPermission) Contract(com.icodici.universa.contract.Contract) NSmartContract(com.icodici.universa.contract.services.NSmartContract) SlotContract(com.icodici.universa.contract.services.SlotContract) ClientError(com.icodici.universa.node2.network.ClientError) Test(org.junit.Test)

Example 4 with SlotContract

use of com.icodici.universa.contract.services.SlotContract in project universa by UniversaBlockchain.

the class ScriptEngineTest method initHttpRoutesFromSlot1.

@Test
public void initHttpRoutesFromSlot1() throws Exception {
    System.out.println("============= start nodes...");
    TestSpace testSpace = prepareTestSpace(TestKeys.privateKey(0));
    testSpace.nodes.forEach(m -> m.config.setIsFreeRegistrationsAllowedFromYaml(true));
    System.out.println("============= start nodes done\n\n\n");
    Contract contractServer = new Contract(TestKeys.privateKey(0));
    String js = "";
    js += "var jsApiEvents = new Object();";
    js += "jsApiEvents.httpHandler_getVersion = function(request, response){" + "  response.setBodyAsJson({" + "    version: 1" + "  });" + "};";
    contractServer.getState().setJS(js.getBytes(), "client script.js", new JSApiScriptParameters(), true);
    RoleLink issuerLink = new RoleLink("issuer_link", "issuer");
    contractServer.registerRole(issuerLink);
    Permission perm = new ModifyDataPermission(issuerLink, Binder.of("fields", Binder.of("scripts", null)));
    contractServer.addPermission(perm);
    contractServer.seal();
    contractServer = Contract.fromPackedTransaction(contractServer.getPackedTransaction());
    ItemResult itemResult = testSpace.client.register(contractServer.getPackedTransaction(), 5000);
    assertEquals(ItemState.APPROVED, itemResult.state);
    // put contractServer rev1 into slot1
    SlotContract slotContract = ContractsService.createSlotContract(new HashSet<>(Arrays.asList(TestKeys.privateKey(0))), new HashSet<>(Arrays.asList(TestKeys.publicKey(0))), nodeInfoProvider);
    slotContract.setNodeInfoProvider(nodeInfoProvider);
    slotContract.putTrackingContract(contractServer);
    Contract stepaU = InnerContractsService.createFreshU(100000000, new HashSet<>(Arrays.asList(TestKeys.publicKey(0))));
    itemResult = testSpace.client.register(stepaU.getPackedTransaction(), 5000);
    System.out.println("stepaU : " + itemResult);
    assertEquals(ItemState.APPROVED, itemResult.state);
    Parcel parcel = ContractsService.createPayingParcel(slotContract.getTransactionPack(), stepaU, 1, 100, new HashSet<>(Arrays.asList(TestKeys.privateKey(0))), false);
    testSpace.client.registerParcelWithState(parcel.pack(), 5000);
    itemResult = testSpace.client.getState(slotContract.getId());
    System.out.println("slot : " + itemResult);
    assertEquals(ItemState.APPROVED, itemResult.state);
    JSApiHttpServer.ISlot1Requestor slot1Requestor = (slotId, originId) -> {
        try {
            Binder slotInfo = testSpace.client.querySlotInfo(slotId);
            return testSpace.client.queryContract(slotId, originId, null);
        } catch (ClientError e) {
            e.printStackTrace();
            return null;
        }
    };
    // start http server
    String routesJsonString = "{\n" + "  \"listenPort\": \"8880\",\n" + "  \"routes\": [\n" + "    {\"endpoint\": \"/contract1/getVersion\", \"handlerName\": \"httpHandler_getVersion\", \"scriptName\": \"client script.js\", \"slotId\":\"" + slotContract.getId().toBase64String() + "\", \"originId\":\"" + contractServer.getOrigin().toBase64String() + "\"}\n" + "  ]\n" + "}\n";
    String tmpdir = System.getProperty("java.io.tmpdir");
    String strPathRoutes = tmpdir + "/" + "routes.json";
    Files.deleteIfExists(Paths.get(strPathRoutes));
    new File(strPathRoutes).createNewFile();
    Files.write(Paths.get(strPathRoutes), routesJsonString.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.WRITE);
    JSApiHttpServerRoutes routes = new JSApiHttpServerRoutes(strPathRoutes, slot1Requestor);
    JSApiHttpServer httpServer = new JSApiHttpServer(routes, new JSApiExecOptions(), hashId -> {
        try {
            return testSpace.client.getState(hashId).state == ItemState.APPROVED;
        } catch (ClientError e) {
            e.printStackTrace();
            return false;
        }
    }, slot1Requestor);
    // here can be any http client. JSApiHttpClient used just for easiness
    JSApiScriptParameters scriptParameters = new JSApiScriptParameters();
    scriptParameters.domainMasks.add("localhost:*");
    JSApiHttpClient httpClient = new JSApiHttpClient(scriptParameters);
    // http access to contractServer rev1
    List httpRes = httpClient.sendGetRequest("http://localhost:8880/contract1/getVersion", JSApiHttpClient.RESPTYPE_JSON);
    System.out.println("httpRes: " + httpRes);
    assertEquals(1l, ((HashMap) httpRes.get(1)).get("version"));
    // create and register contractServer rev2
    Contract contractServer2 = contractServer.createRevision();
    contractServer2.addSignerKey(TestKeys.privateKey(0));
    String js2 = "";
    js2 += "var jsApiEvents = new Object();";
    js2 += "jsApiEvents.httpHandler_getVersion = function(request, response){" + "  response.setBodyAsJson({" + "    version: 2" + "  });" + "};";
    contractServer2.getState().setJS(js2.getBytes(), "client script.js", new JSApiScriptParameters(), true);
    contractServer2.seal();
    contractServer2 = Contract.fromPackedTransaction(contractServer2.getPackedTransaction());
    ItemResult itemResult2 = testSpace.client.register(contractServer2.getPackedTransaction(), 5000);
    assertEquals(ItemState.APPROVED, itemResult2.state);
    assertEquals(ItemState.REVOKED, testSpace.client.getState(contractServer.getId()).state);
    // force update server contracts from slot1
    httpServer.checkAllContracts();
    // http access to contractServer rev2
    httpRes = httpClient.sendGetRequest("http://localhost:8880/contract1/getVersion", JSApiHttpClient.RESPTYPE_JSON);
    System.out.println("httpRes: " + httpRes);
    assertEquals(2l, ((HashMap) httpRes.get(1)).get("version"));
    System.out.println("\n\n\n============= shutdown...");
    testSpace.nodes.forEach(m -> m.shutdown());
    httpServer.stop();
}
Also used : NashornScriptEngineFactory(jdk.nashorn.api.scripting.NashornScriptEngineFactory) JSApiRole(com.icodici.universa.contract.jsapi.roles.JSApiRole) java.util(java.util) JSApiChangeNumberPermission(com.icodici.universa.contract.jsapi.permissions.JSApiChangeNumberPermission) Client(com.icodici.universa.node2.network.Client) Binder(net.sergeych.tools.Binder) SimpleRole(com.icodici.universa.contract.roles.SimpleRole) JSApiStorage(com.icodici.universa.contract.jsapi.storage.JSApiStorage) BigDecimal(java.math.BigDecimal) com.icodici.universa.contract.permissions(com.icodici.universa.contract.permissions) PublicKey(com.icodici.crypto.PublicKey) Contract(com.icodici.universa.contract.Contract) com.icodici.universa.contract.jsapi(com.icodici.universa.contract.jsapi) NSmartContract(com.icodici.universa.contract.services.NSmartContract) ClassFilter(jdk.nashorn.api.scripting.ClassFilter) ContractsService(com.icodici.universa.contract.ContractsService) Before(org.junit.Before) ScriptException(javax.script.ScriptException) ItemResult(com.icodici.universa.node.ItemResult) PrivateKey(com.icodici.crypto.PrivateKey) TestKeys(com.icodici.universa.TestKeys) Files(java.nio.file.Files) InnerContractsService(com.icodici.universa.contract.InnerContractsService) JSApiPermission(com.icodici.universa.contract.jsapi.permissions.JSApiPermission) KeyAddress(com.icodici.crypto.KeyAddress) Do(net.sergeych.tools.Do) StandardOpenOption(java.nio.file.StandardOpenOption) Test(org.junit.Test) IOException(java.io.IOException) ClientError(com.icodici.universa.node2.network.ClientError) Bytes(net.sergeych.utils.Bytes) Field(java.lang.reflect.Field) JSApiSplitJoinPermission(com.icodici.universa.contract.jsapi.permissions.JSApiSplitJoinPermission) ItemState(com.icodici.universa.node.ItemState) File(java.io.File) Base64(net.sergeych.utils.Base64) Parcel(com.icodici.universa.contract.Parcel) HashId(com.icodici.universa.HashId) Ignore(org.junit.Ignore) Invocable(javax.script.Invocable) Paths(java.nio.file.Paths) ScriptEngine(javax.script.ScriptEngine) RoleLink(com.icodici.universa.contract.roles.RoleLink) ScriptObjectMirror(jdk.nashorn.api.scripting.ScriptObjectMirror) Assert(org.junit.Assert) SlotContract(com.icodici.universa.contract.services.SlotContract) RoleLink(com.icodici.universa.contract.roles.RoleLink) Parcel(com.icodici.universa.contract.Parcel) SlotContract(com.icodici.universa.contract.services.SlotContract) Binder(net.sergeych.tools.Binder) ItemResult(com.icodici.universa.node.ItemResult) JSApiChangeNumberPermission(com.icodici.universa.contract.jsapi.permissions.JSApiChangeNumberPermission) JSApiPermission(com.icodici.universa.contract.jsapi.permissions.JSApiPermission) JSApiSplitJoinPermission(com.icodici.universa.contract.jsapi.permissions.JSApiSplitJoinPermission) Contract(com.icodici.universa.contract.Contract) NSmartContract(com.icodici.universa.contract.services.NSmartContract) SlotContract(com.icodici.universa.contract.services.SlotContract) ClientError(com.icodici.universa.node2.network.ClientError) File(java.io.File) Test(org.junit.Test)

Example 5 with SlotContract

use of com.icodici.universa.contract.services.SlotContract in project universa by UniversaBlockchain.

the class Contract method fromSealedBinary.

public static Contract fromSealedBinary(byte[] sealedBinary, TransactionPack tp) throws IOException {
    Binder data = Boss.unpack(sealedBinary);
    if (!data.getStringOrThrow("type").equals("unicapsule"))
        throw new UnicapsuleExpectedException("wrong object type, unicapsule required");
    byte[] contractBytes = data.getBinaryOrThrow("data");
    // This must be explained. By default, Boss.load will apply contract transformation in place
    // as it is registered BiSerializable type, and we want to avoid it. Therefore, we decode boss
    // data without BiSerializer and then do it by hand calling deserialize:
    Binder payload = Boss.load(contractBytes, null);
    // contract can be extended type - we need know about it before
    String extendedType = payload.getBinder("contract").getBinder("definition").getString("extended_type", null);
    NSmartContract.SmartContractType scType = null;
    if (extendedType != null) {
        try {
            scType = NSmartContract.SmartContractType.valueOf(extendedType);
        } catch (IllegalArgumentException e) {
        }
    }
    Contract result;
    // and if extended type of contract is allowed - create extended contrac, otherwise create simple contract
    if (scType != null) {
        switch(scType) {
            case N_SMART_CONTRACT:
                result = new NSmartContract(data, tp);
                break;
            case SLOT1:
                result = new SlotContract(data, tp);
                break;
            case UNS1:
                result = new UnsContract(data, tp);
                break;
            case UNS2:
                result = new UnsContract(data, tp);
                break;
            case FOLLOWER1:
                result = new FollowerContract(data, tp);
                break;
            default:
                // unknwon extended type. create simple contract
                // TODO: should we throw?
                result = new Contract(data, tp);
        }
    } else {
        result = new Contract(data, tp);
    }
    result.sealedBinary = sealedBinary;
    return result;
}
Also used : Binder(net.sergeych.tools.Binder) NSmartContract(com.icodici.universa.contract.services.NSmartContract) FollowerContract(com.icodici.universa.contract.services.FollowerContract) UnsContract(com.icodici.universa.contract.services.UnsContract) NSmartContract(com.icodici.universa.contract.services.NSmartContract) UnsContract(com.icodici.universa.contract.services.UnsContract) FollowerContract(com.icodici.universa.contract.services.FollowerContract) SlotContract(com.icodici.universa.contract.services.SlotContract) SlotContract(com.icodici.universa.contract.services.SlotContract)

Aggregations

NSmartContract (com.icodici.universa.contract.services.NSmartContract)7 SlotContract (com.icodici.universa.contract.services.SlotContract)7 Binder (net.sergeych.tools.Binder)7 Test (org.junit.Test)6 PrivateKey (com.icodici.crypto.PrivateKey)5 ModifyDataPermission (com.icodici.universa.contract.permissions.ModifyDataPermission)3 Permission (com.icodici.universa.contract.permissions.Permission)3 Contract (com.icodici.universa.contract.Contract)2 Parcel (com.icodici.universa.contract.Parcel)2 JSApiChangeNumberPermission (com.icodici.universa.contract.jsapi.permissions.JSApiChangeNumberPermission)2 JSApiPermission (com.icodici.universa.contract.jsapi.permissions.JSApiPermission)2 JSApiSplitJoinPermission (com.icodici.universa.contract.jsapi.permissions.JSApiSplitJoinPermission)2 RoleLink (com.icodici.universa.contract.roles.RoleLink)2 ItemResult (com.icodici.universa.node.ItemResult)2 ClientError (com.icodici.universa.node2.network.ClientError)2 KeyAddress (com.icodici.crypto.KeyAddress)1 PublicKey (com.icodici.crypto.PublicKey)1 HashId (com.icodici.universa.HashId)1 TestKeys (com.icodici.universa.TestKeys)1 ContractsService (com.icodici.universa.contract.ContractsService)1