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")); } }
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); }