Exemplo n.º 1
0
        public ActionResult CallOption()
        {
            var createCallOption = new CreateCallOption();

            createCallOption.Numeraire.SetValue(Request["numeraire"]);
            createCallOption.Oracle.SetValue(Request["oracle"]);
            createCallOption.Underlying.SetValue(Request["underlying"]);
            createCallOption.Price.SetValue(Request["price"]);
            createCallOption.Strike.SetValue(Request["strike"]);
            createCallOption.MinimumCollateralRatio.SetValue(Request["minimumCollateralRatio"]);
            //createCallOption.OwnerPubKey.SetValue(Request["ownerPubKey"]);

            if (createCallOption.Invalid)
            {
                return(View("CallOption", createCallOption));
            }
            else
            {
                try {
                    var callOptionParameters = new ContractExamples.QuotedContracts.CallOptionParameters(
                        createCallOption.Numeraire.Address.Bytes,
                        new byte[] { },
                        new byte[] { },
                        createCallOption.Oracle.Address.Bytes,
                        createCallOption.Underlying.Value,
                        createCallOption.Price.Decimal,
                        createCallOption.Strike.Decimal,
                        createCallOption.MinimumCollateralRatio.Decimal,
                        new byte[] { } /*createCallOption.OwnerPubKey.PublicKey*/);

                    //var contract = ContractExamples.QuotedContracts.callOptionFactory(callOptionParameters);
                    //var contractCode = ContractExamples.Execution.quotedToString(contract);
                    var tpl = Utils.GetTemplate("CallOption");

                    var metadata = new
                    {
                        contractType           = "calloption",
                        numeraire              = Convert.ToBase64String(callOptionParameters.numeraire),
                        oracle                 = Convert.ToBase64String(callOptionParameters.oracle),
                        underlying             = callOptionParameters.underlying,
                        price                  = "" + callOptionParameters.price,
                        strike                 = "" + callOptionParameters.strike,
                        minimumCollateralRatio = "" + callOptionParameters.minimumCollateralRatio,
                        ownerPubKey            = Convert.ToBase64String(callOptionParameters.ownerPubKey)
                    };
                    var jsonHeader = "//" + JsonConvert.SerializeObject(metadata);
                    var underlying = Enumerable.Repeat((byte)0, 32).ToArray();
                    Encoding.ASCII.GetBytes(callOptionParameters.underlying).CopyTo(underlying, 0);
                    var contractCode = tpl
                                       .Replace("__numeraire__", Convert.ToBase64String(callOptionParameters.numeraire))
                                       .Replace("__oracle__", Convert.ToBase64String(callOptionParameters.oracle))
                                       .Replace("__underlying__", Convert.ToBase64String(underlying))
                                       .Replace("__price__", "" + callOptionParameters.price)
                                       .Replace("__strike__", "" + Math.Round(callOptionParameters.strike).ToString())
                                       .Replace("__minimumCollateralRatio__", "" + callOptionParameters.minimumCollateralRatio);
                    // .Replace("__ownerPubKey__", Convert.ToBase64String(callOptionParameters.ownerPubKey));
                    contractCode += "\n" + jsonHeader;

                    var code         = Utils.Dos2Unix(contractCode);
                    var contractHash = Consensus.Merkle.innerHash(Encoding.ASCII.GetBytes(contractCode));

                    ViewBag.Code = code;
                    ViewBag.Hash = Convert.ToBase64String(contractHash);

                    var file = $"{HttpServerUtility.UrlTokenEncode(contractHash)}";

                    Directory.CreateDirectory(Path.Combine("db", "contracts"));
                    Directory.CreateDirectory(Path.Combine("db", "asset-metadata"));

                    if (!System.IO.File.Exists(file))
                    {
                        System.IO.File.WriteAllText(Path.ChangeExtension(Path.Combine("db", "contracts", file), ".txt"), contractCode);
                    }

                    System.IO.File.WriteAllText(Path.ChangeExtension(Path.Combine("db", "asset-metadata", file), ".json"), JsonConvert.SerializeObject(new AssetMetadata()
                    {
                        name = Request["assetName"]
                    }));
                } catch (Exception e) {
                    ViewBag.Message = "Error creating contract: " + e.Message;
                }

                return(View("Result"));
            }
        }
Exemplo n.º 2
0
        public void CanCompileCallOptionCodeFromTemplate()
        {
            var tpl = GetTemplate("CallOption");

            var controlAssetReturn = Wallet.core.Data.Key.Create().Address.Bytes;
            var controlAsset       = Wallet.core.Data.Key.Create().Address.Bytes;
            var oracleAddress      = Wallet.core.Data.Key.Create().Address.Bytes;
            var underlying         = "GOOG";
            var price  = 10M;
            var strike = 900M;
            var minimumCollateralRatio = 1;
            var ownerPubKey            = Wallet.core.Data.Key.Create().Public;

            var callOptionsParams = new ContractExamples.QuotedContracts.CallOptionParameters(
                Consensus.Tests.zhash,
                controlAsset,
                controlAssetReturn,
                oracleAddress,
                underlying,
                price,
                strike,
                minimumCollateralRatio,
                ownerPubKey
                );

            var code = tpl
                       .Replace("__numeraire__", Convert.ToBase64String(callOptionsParams.numeraire))
                       .Replace("__controlAsset__", Convert.ToBase64String(callOptionsParams.controlAsset))
                       .Replace("__controlAssetReturn__", Convert.ToBase64String(callOptionsParams.controlAssetReturn))
                       .Replace("__oracle__", Convert.ToBase64String(callOptionsParams.oracle))
                       .Replace("__underlying__", callOptionsParams.underlying)
                       .Replace("__price__", "" + callOptionsParams.price)
                       .Replace("__strike__", "" + callOptionsParams.strike)
                       .Replace("__minimumCollateralRatio__", "" + callOptionsParams.minimumCollateralRatio)
                       .Replace("__ownerPubKey__", Convert.ToBase64String(callOptionsParams.ownerPubKey));

            var metadata = new {
                contractType       = "calloption",
                numeraire          = Convert.ToBase64String(callOptionsParams.numeraire),
                controlAsset       = Convert.ToBase64String(callOptionsParams.controlAsset),
                controlAssetReturn = Convert.ToBase64String(callOptionsParams.controlAssetReturn),
                oracle             = Convert.ToBase64String(callOptionsParams.oracle),
                underlying         = callOptionsParams.underlying,
                price  = "" + callOptionsParams.price,
                strike = "" + callOptionsParams.strike,
                minimumCollateralRatio = "" + callOptionsParams.minimumCollateralRatio,
                ownerPubKey            = Convert.ToBase64String(callOptionsParams.ownerPubKey)
            };

            var jsonHeader = "//" + JsonConvert.SerializeObject(metadata);

            code += "\n" + jsonHeader;

            var compiled = ContractExamples.Execution.compile(code);

            Assert.That(compiled, Is.Not.Null, "should compile code");
            Assert.That(FSharpOption <byte[]> .get_IsNone(compiled), Is.False, "should compile code");

            var metadataParsed = ContractExamples.Execution.metadata(code);

            Assert.That(FSharpOption <ContractExamples.Execution.ContractMetadata> .get_IsNone(metadataParsed), Is.False, "should parse metadata");
            Assert.That(metadataParsed.Value, Is.TypeOf(typeof(ContractExamples.Execution.ContractMetadata.CallOption)));

            Assert.That((metadataParsed.Value as ContractExamples.Execution.ContractMetadata.CallOption).Item.numeraire, Is.EquivalentTo(Consensus.Tests.zhash));
            Assert.That((metadataParsed.Value as ContractExamples.Execution.ContractMetadata.CallOption).Item.controlAsset, Is.EquivalentTo(controlAsset));
            Assert.That((metadataParsed.Value as ContractExamples.Execution.ContractMetadata.CallOption).Item.controlAssetReturn, Is.EquivalentTo(controlAssetReturn));
            Assert.That((metadataParsed.Value as ContractExamples.Execution.ContractMetadata.CallOption).Item.oracle, Is.EquivalentTo(oracleAddress));
            Assert.That((metadataParsed.Value as ContractExamples.Execution.ContractMetadata.CallOption).Item.underlying, Is.EquivalentTo(underlying));
            Assert.That((metadataParsed.Value as ContractExamples.Execution.ContractMetadata.CallOption).Item.price, Is.EqualTo(price));
            Assert.That((metadataParsed.Value as ContractExamples.Execution.ContractMetadata.CallOption).Item.strike, Is.EqualTo(strike));
            Assert.That((metadataParsed.Value as ContractExamples.Execution.ContractMetadata.CallOption).Item.minimumCollateralRatio, Is.EqualTo(minimumCollateralRatio));
            Assert.That((metadataParsed.Value as ContractExamples.Execution.ContractMetadata.CallOption).Item.ownerPubKey, Is.EqualTo(ownerPubKey));

            object deserialized = null;

            try
            {
                deserialized = ContractExamples.Execution.deserialize(compiled.Value);
            }
            catch
            {
            }
            Assert.That(deserialized, Is.Not.Null);
        }