public void MapTransferInfo_Success()
        {
            var network             = new SmartContractsRegTest();
            var primitiveSerializer = new ContractPrimitiveSerializerV2(network);

            var stateRoot = new Mock <IStateRepositoryRoot>();

            stateRoot.Setup(r => r.GetCodeHash(It.IsAny <uint160>())).Returns(uint256.Zero.ToBytes());

            var assemblyCache    = new Mock <IContractAssemblyCache>();
            var contractAssembly = new Mock <IContractAssembly>();

            var serializer = new ApiLogDeserializer(primitiveSerializer, network, stateRoot.Object, assemblyCache.Object);

            var transferInfos = new List <TransferInfo>
            {
                new TransferInfo(uint160.Zero, uint160.One, 12345),
                new TransferInfo(uint160.One, uint160.Zero, 12345),
            };

            List <SmartContracts.Models.TransferResponse> result = serializer.MapTransferInfo(transferInfos.ToArray());

            for (var i = 0; i < transferInfos.Count; i++)
            {
                Assert.Equal(transferInfos[i].From.ToBase58Address(network), result[i].From);
                Assert.Equal(transferInfos[i].To.ToBase58Address(network), result[i].To);
                Assert.Equal(transferInfos[i].Value, result[i].Value);
            }
        }
Ejemplo n.º 2
0
        public IActionResult LocalCallSmartContractTransaction([FromBody] LocalCallContractRequest request)
        {
            if (!this.ModelState.IsValid)
            {
                return(ModelStateErrors.BuildErrorResponse(this.ModelState));
            }

            // Rewrite the method name to a property name
            this.RewritePropertyGetterName(request);

            try
            {
                ContractTxData txData = this.smartContractTransactionService.BuildLocalCallTxData(request);

                var height = request.BlockHeight.HasValue ? request.BlockHeight.Value : (ulong)this.chainIndexer.Height;

                ILocalExecutionResult result = this.localExecutor.Execute(
                    height,
                    request.Sender?.ToUint160(this.network) ?? new uint160(),
                    !string.IsNullOrWhiteSpace(request.Amount) ? (Money)request.Amount : 0,
                    txData);

                var deserializer = new ApiLogDeserializer(this.primitiveSerializer, this.network, result.StateRoot, this.contractAssemblyCache);

                var response = new LocalExecutionResponse
                {
                    InternalTransfers = deserializer.MapTransferInfo(result.InternalTransfers.ToArray()),
                    Logs         = deserializer.MapLogResponses(result.Logs.ToArray()),
                    GasConsumed  = result.GasConsumed,
                    Revert       = result.Revert,
                    ErrorMessage = result.ErrorMessage,
                    Return       = result.Return // All return values should be primitives, let default serializer handle.
                };

                return(this.Json(response, new JsonSerializerSettings
                {
                    ContractResolver = new ContractParametersContractResolver(this.network)
                }));
            }
            catch (MethodParameterStringSerializerException e)
            {
                return(this.Json(ErrorHelpers.BuildErrorResponse(HttpStatusCode.InternalServerError, e.Message,
                                                                 "Error deserializing method parameters")));
            }
        }