コード例 #1
0
        public ActionResult PrepareAction()
        {
            var action  = Request["Action"];
            var address = Request["ActiveContract.Address"];

            var contractInteraction = new ContractInteraction()
            {
                Action  = action,
                Address = address
            };

            return(View(contractInteraction));
        }
コード例 #2
0
        public async Task <ActionResult> Action()
        {
            var  action = Request["Action"];
            var  args   = new Dictionary <string, string>();
            byte opcode = 0x01;

            var address = Request["Address"];

            var contractHash = new Address(address).Bytes;

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

            string contractCode = null;
            var    codeFile     = Path.ChangeExtension(Path.Combine("db", "contracts", file), ".txt");

            if (System.IO.File.Exists(codeFile))
            {
                contractCode = System.IO.File.ReadAllText(codeFile);
            }

            var contractInteraction = new ContractInteraction()
            {
                Action  = action,
                Address = new Address(contractHash, AddressType.Contract).ToString()
            };

            ContractMetadata contractMetadata = null;

            try
            {
                var _metadata = ContractExamples.Execution.metadata(contractCode);

                if (FSharpOption <ContractMetadata> .get_IsNone(_metadata))
                {
                    contractInteraction.Message = "No metadata";
                }
                else
                {
                    contractMetadata = _metadata.Value;
                }
            }
            catch
            {
                contractInteraction.Message = "Error getting metadata";
                return(View(contractInteraction));
            }

            if (contractMetadata.IsCallOption)
            {
                var callOptionParameters =
                    (ContractExamples.Execution.ContractMetadata.CallOption)contractMetadata;
                switch (action)
                {
                case "Collateralize":
                    //var pkAddress = new PKAddressField();
                    //pkAddress.SetValue(Request["return-address"]);

                    //if (pkAddress.Invalid)
                    //{
                    //             contractInteraction.Message = "Invalid return address";
                    //	return View(contractInteraction);
                    //}

                    //args.Add("returnPubKeyAddress", pkAddress.Value);
                    opcode = OPCODE_COLLATERALIZE;
                    break;

                case "Exercise":
                    var pkExerciseReturnAddress = new PKAddressField();
                    pkExerciseReturnAddress.SetValue(Request["exercise-return-address"]);

                    if (pkExerciseReturnAddress.Invalid)
                    {
                        contractInteraction.Message = "Invalid send address";
                        return(View(contractInteraction));
                    }

                    args.Add("returnPubKeyAddress", pkExerciseReturnAddress.Value);

                    string oracleData;     //GetOracleCommitmentData(callOptionParameters.Item.underlying, DateTime.Now.ToUniversalTime()).Result;

                    if (GetLastData(callOptionParameters.Item.underlying, out oracleData))
                    {
                        args.Add("oracleRawData", oracleData);
                    }
                    else
                    {
                        contractInteraction.Message = "Error getting oracle data";
                        return(View(contractInteraction));
                    }

                    opcode = OPCODE_EXERCISE;
                    break;

                case "Buy":
                    var pkSendAddress = new PKAddressField();
                    pkSendAddress.SetValue(Request["buy-send-address"]);

                    if (pkSendAddress.Invalid)
                    {
                        contractInteraction.Message = "Invalid send address";
                        return(View(contractInteraction));
                    }

                    args.Add("returnPubKeyAddress", pkSendAddress.Value);
                    opcode = OPCODE_BUY;
                    break;
                    //case "Close":
                    //	opcode = OPCODE_CLOSE;
                    //	break;
                }
            }

            var argsMap = new FSharpMap <string, string>(args.Select(t => new Tuple <string, string>(t.Key, t.Value)));
            var result  = await Client.Send <GetContractPointedOutputsResultPayload>(_address, new GetContractPointedOutputsPayload()
            {
                ContractHash = contractHash
            });

            var utxos = GetContractPointedOutputsResultPayload.Unpack(result.PointedOutputs);
            var data  = ContractUtilities.DataGenerator.makeJson(contractMetadata, utxos, opcode, argsMap);

            if (data.IsError)
            {
                contractInteraction.Message = data.ErrorValue.ToString();
            }
            else
            {
                contractInteraction.Data = data.ResultValue.JsonValue.ToString();
            }

            return(View(contractInteraction));
        }
コード例 #3
0
 private bool Equals(ContractInteraction other)
 {
     return ID == other.ID;
 }
コード例 #4
0
 private bool Equals(ContractInteraction other)
 {
     return(ID == other.ID);
 }