Esempio n. 1
0
        public async Task<HttpResponseMessage> PostImage()
        {
            var context = new StorageContext();

            // Check if the request contains multipart/form-data.
            if (!Request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            // Get and create the container
            var blobContainer = context.BlobClient.GetContainerReference(CONTAINER);
            blobContainer.CreateIfNotExists();

            string root = HttpContext.Current.Server.MapPath("~/App_Data");
            var provider = new MultipartFormDataStreamProvider(root);

            try
            {
                // Read the form data and return an async task.
                await Request.Content.ReadAsMultipartAsync(provider);

                // This illustrates how to get the file names for uploaded files.
                foreach (var fileData in provider.FileData)
                {
                    var filename = fileData.Headers.ContentDisposition.Name.Replace("\"", "");
                    var blob = blobContainer.GetBlockBlobReference(filename);
                    blob.Properties.ContentType = fileData.Headers.ContentType.MediaType;
                    using (var filestream = File.OpenRead(fileData.LocalFileName))
                    {
                        blob.UploadFromStream(filestream);
                    }
                    File.Delete(fileData.LocalFileName);
                }

                return Request.CreateResponse(HttpStatusCode.OK);
            }
            catch (System.Exception e)
            {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
            }
        }
 public static bool SetDeal(StorageContext context, byte[] hashDeal, string key, object value)
 {
     Storage.Put(context, hashDeal.Concat(key.AsByteArray()), (byte[])value);
     return(true);
 }
 public static bool SetAvailableForWithdrawalSTM(StorageContext context, BigInteger availableForWithdrawalSTM)
 {
     Storage.Put(context, AVAILABLE_FOR_WITHDRAWAL_STM_KEY, availableForWithdrawalSTM);
     return(true);
 }
 public AgentRepository(StorageContext context, ILogger <Agent> logger, IHttpContextAccessor httpContextAccessor) : base(context, logger, httpContextAccessor)
 {
 }
Esempio n. 5
0
 public static void Put(StorageContext context, string key, string value)
 {
     Put(context, Op.String2Bytes(key), value);
 }
Esempio n. 6
0
 public static void Put(StorageContext context, byte[] key, BigInteger value)
 {
     Put(context, key, Op.BigInt2Bytes(value));
 }
Esempio n. 7
0
 public DbOwnersRepository(StorageContext context)
 {
     _dbContext = context;
 }
Esempio n. 8
0
 public DBKittensRepository(StorageContext context)
 {
     _dbContext = context;
 }
Esempio n. 9
0
 public VMObject InvokeScript(StorageContext storage, byte[] script)
 {
     return(InvokeScript(storage, script, Timestamp.Now));
 }
Esempio n. 10
0
 public VMObject InvokeContract(StorageContext storage, string contractName, string methodName, params object[] args)
 {
     return(InvokeContract(storage, contractName, methodName, Timestamp.Now, args));
 }
Esempio n. 11
0
        // NOTE this lists only nfts owned in this chain
        public BigInteger[] GetOwnedTokens(StorageContext storage, string tokenSymbol, Address address)
        {
            var ownership = new OwnershipSheet(tokenSymbol);

            return(ownership.Get(storage, address).ToArray());
        }
Esempio n. 12
0
        public BigInteger GetTokenSupply(StorageContext storage, string symbol)
        {
            var supplies = new SupplySheet(symbol, this, Nexus);

            return(supplies.GetTotal(storage));
        }
Esempio n. 13
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure <BlockcoreDataVaultSettings>(this.Configuration.GetSection("Blockcore"));

            var camelCaseConventionPack = new ConventionPack {
                new CamelCaseElementNameConvention()
            };

            ConventionRegistry.Register("CamelCase", camelCaseConventionPack, type => true);

            //BsonClassMap.RegisterClassMap<Entity>();

            //BsonClassMap.RegisterClassMap<BsonDocument>(cm => {
            //    cm.AutoMap();
            //    cm.SetIdMember(cm.GetMemberMap("Id"));
            //    //cm.SetIdMember(cm.GetMemberMapForElement("Id"));
            //    cm.IdMemberMap.SetIdGenerator(GuidGenerator.Instance);
            //});

            var config = new ServerConfig();

            Configuration.Bind(config);

            services.AddResponseCompression();
            services.AddMemoryCache();

            var todoContext = new StorageContext(config.MongoDB);
            var repo        = new StorageRepository(todoContext);

            services.AddSingleton <IStorageRepository>(repo);

            // Add service and create Policy to allow Cross-Origin Requests
            services.AddCors
            (
                options =>
            {
                options.AddPolicy
                (
                    "CorsPolicy",

                    builder =>
                {
                    var allowedDomains = new[] { "http://localhost", "http://localhost:4200", "http://localhost:8080" };

                    builder
                    .WithOrigins(allowedDomains)
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                }
                );
            });

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = ApiKeyAuthenticationOptions.DefaultScheme;
                options.DefaultChallengeScheme    = ApiKeyAuthenticationOptions.DefaultScheme;
            })
            .AddApiKeySupport(options => { });

            services.AddSingleton <IAuthorizationHandler, OnlyUsersAuthorizationHandler>();
            services.AddSingleton <IAuthorizationHandler, OnlyAdminsAuthorizationHandler>();
            services.AddSingleton <IGetApiKeyQuery, AppSettingsGetApiKeyQuery>();

            services.AddControllersWithViews(options =>
            {
                options.Filters.Add(typeof(LoggingActionFilter));
            }).AddNewtonsoftJson(options =>
            {
                // Serializer.RegisterFrontConverters(options.SerializerSettings);
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            });

            services.AddSwaggerGen(
                options =>
            {
                string assemblyVersion = typeof(Startup).Assembly.GetName().Version.ToString();

                string description = "Access to the Blockcore Data Vault.";

                description += " Authorization is enabled on this API. You must have API key to perform calls that are not public. Future versions will require DID, not API key.";

                options.AddSecurityDefinition(ApiKeyConstants.HeaderName, new OpenApiSecurityScheme
                {
                    Description = "API key needed to access the endpoints. Vault-Api-Key: YOUR_KEY",
                    In          = ParameterLocation.Header,
                    Name        = ApiKeyConstants.HeaderName,
                    Type        = SecuritySchemeType.ApiKey
                });

                options.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                    {
                        new OpenApiSecurityScheme
                        {
                            Name      = ApiKeyConstants.HeaderName,
                            Type      = SecuritySchemeType.ApiKey,
                            In        = ParameterLocation.Header,
                            Reference = new OpenApiReference
                            {
                                Type = ReferenceType.SecurityScheme,
                                Id   = ApiKeyConstants.HeaderName
                            },
                        },
                        new string[] {}
                    }
                });

                options.SwaggerDoc("dv", // "dv" = Data Vault, "edv" = Encrypted Data Vault
                                   new OpenApiInfo
                {
                    Title       = "Blockcore Data Vault API",
                    Version     = assemblyVersion,
                    Description = description,
                    Contact     = new OpenApiContact
                    {
                        Name = "Blockcore",
                        Url  = new Uri("https://www.blockcore.net/")
                    }
                });

                SwaggerApiDocumentationScaffolder.Scaffold(options);

                options.DescribeAllEnumsAsStrings();

                options.DescribeStringEnumsInCamelCase();

                options.EnableAnnotations();
            });

            services.AddSwaggerGenNewtonsoftSupport(); // explicit opt-in - needs to be placed after AddSwaggerGen()

            // services.AddControllersWithViews();

            // In production, the Angular files will be served from this directory
            services.AddSpaStaticFiles(configuration =>
            {
                configuration.RootPath = "ClientApp/dist";
            });
        }
Esempio n. 14
0
 public Bot(CommandService commandService, StorageContext prefixContext, ICustomLogger customLogger)
 {
     _commandService = commandService;
     _prefixContext  = prefixContext;
     _customLogger   = customLogger;
 }
Esempio n. 15
0
 public DbPicturesRepository(StorageContext context)
 {
     _dbContext = context;
 }
Esempio n. 16
0
 public List <Marker> GetAllMarkers(bool includeDeleted = false)
 {
     using (var ctx = new StorageContext()) {
         return(ctx.Markers.Where(m => includeDeleted || m.Deleted.HasValue == false).ToList());
     }
 }
Esempio n. 17
0
 public DbOwnersRepository(StorageContext context)
 {
     _dbContext = context;
 }
Esempio n. 18
0
 public bool IsContractDeployed(StorageContext storage, string name)
 {
     return(IsContractDeployed(storage, SmartContract.GetAddressForName(name)));
 }
 public UserAgreementRepository(StorageContext context, ILogger <UserAgreement> logger) : base(context, logger)
 {
 }
Esempio n. 20
0
        private StorageList GetSwapListForAddress(StorageContext storage, Address address)
        {
            var key = ByteArrayUtils.ConcatBytes(Encoding.UTF8.GetBytes(".swapaddr"), address.ToByteArray());

            return(new StorageList(key, storage));
        }
Esempio n. 21
0
 public static byte[] Get(StorageContext context, string key) => Get(context, Op.String2Bytes(key));
Esempio n. 22
0
        private StorageMap GetSwapMap(StorageContext storage)
        {
            var key = Encoding.UTF8.GetBytes(".swapmap");

            return(new StorageMap(key, storage));
        }
Esempio n. 23
0
 public static void Put(StorageContext context, byte[] key, string value)
 {
     Put(context, key, Op.String2Bytes(value));
 }
Esempio n. 24
0
        public Hash[] GetSwapHashesForAddress(StorageContext storage, Address address)
        {
            var list = GetSwapListForAddress(storage, address);

            return(list.All <Hash>());
        }
Esempio n. 25
0
 public static void Delete(StorageContext context, string key)
 {
     Delete(context, Op.String2Bytes(key));
 }
Esempio n. 26
0
        public void CloseBlock(Block block, StorageContext storage)
        {
            var rootStorage = this.IsRoot ? storage : Nexus.RootStorage;

            if (block.Height > 1)
            {
                var prevBlock = GetBlockByHash(block.PreviousHash);

                if (prevBlock.Validator != block.Validator)
                {
                    block.Notify(new Event(EventKind.ValidatorSwitch, block.Validator, "block", Serialization.Serialize(prevBlock)));
                }
            }

            var balance        = new BalanceSheet(DomainSettings.FuelTokenSymbol);
            var blockAddress   = Address.FromHash("block");
            var totalAvailable = balance.Get(storage, blockAddress);

            var targets = new List <Address>();

            if (Nexus.HasGenesis)
            {
                var validators = Nexus.GetValidators();

                var totalValidators = Nexus.GetPrimaryValidatorCount();

                for (int i = 0; i < totalValidators; i++)
                {
                    var validator = validators[i];
                    if (validator.type != ValidatorType.Primary)
                    {
                        continue;
                    }

                    targets.Add(validator.address);
                }
            }
            else
            if (totalAvailable > 0)
            {
                targets.Add(Nexus.GetGenesisAddress(rootStorage));
            }

            if (targets.Count > 0)
            {
                if (!balance.Subtract(storage, blockAddress, totalAvailable))
                {
                    throw new BlockGenerationException("could not subtract balance from block address");
                }

                var amountPerValidator = totalAvailable / targets.Count;
                var leftOvers          = totalAvailable - (amountPerValidator * targets.Count);

                foreach (var address in targets)
                {
                    BigInteger amount = amountPerValidator;

                    if (address == block.Validator)
                    {
                        amount += leftOvers;
                    }

                    // TODO this should use triggers when available...
                    if (!balance.Add(storage, address, amount))
                    {
                        throw new BlockGenerationException($"could not add balance to {address}");
                    }

                    var eventData = Serialization.Serialize(new TokenEventData(DomainSettings.FuelTokenSymbol, amount, this.Name));
                    block.Notify(new Event(EventKind.TokenClaim, address, "block", eventData));
                }
            }
        }
 public static BigInteger AvailableForWithdrawalSTM(StorageContext context)
 {
     return(Storage.Get(context, AVAILABLE_FOR_WITHDRAWAL_STM_KEY).AsBigInteger());
 }
Esempio n. 28
0
 private void GetCharacterById(ICommunicationMessage e, Guid characterId)
 {
     using (var ctx = new StorageContext()) {
         e.Reply(ctx.Characters.FirstOrDefault(c => c.Id == characterId));
     }
 }
 public static int GetStatusDeal(StorageContext context, byte[] hashDeal)
 {
     return((int)GetDeal(context, hashDeal, "status"));
 }
Esempio n. 30
0
        protected async void Save <T>(IRpcEvent e, T vehicle) where T : Vehicle
        {
            using (var context = new StorageContext())
                using (var transaction = context.Database.BeginTransaction())
                {
                    var dbVeh = context.Vehicles
                                .Include(v => v.Extras)
                                .Include(v => v.Wheels)
                                .Include(v => v.Doors)
                                .Include(v => v.Windows)
                                .Include(v => v.Seats)
                                .Include(v => v.Mods)
                                .FirstOrDefault(c => c.Id == vehicle.Id);

                    if (dbVeh == null ||
                        dbVeh.TrackingUserId != Guid.Empty && e.User.Id != dbVeh.TrackingUserId)
                    {
                        return;
                    }

                    vehicle.Created = dbVeh.Created;

                    context.Entry(dbVeh).CurrentValues.SetValues(vehicle);

                    // Wheels
                    foreach (var dbVehWheel in dbVeh.Wheels.ToList())
                    {
                        if (vehicle.Wheels.All(m => m.Position != dbVehWheel.Position))
                        {
                            context.VehicleWheels.Remove(dbVehWheel);
                        }
                    }

                    foreach (var vehWheel in vehicle.Wheels)
                    {
                        var dbVehWheel = dbVeh.Wheels.SingleOrDefault(s => s.Position == vehWheel.Position);
                        if (dbVehWheel != null)
                        {
                            vehWheel.Id        = dbVehWheel.Id;
                            vehWheel.VehicleId = vehicle.Id;
                            context.Entry(dbVehWheel).CurrentValues.SetValues(vehWheel);
                            // We have to manually set enums for some reason...
                            context.Entry(dbVehWheel).Property("Position").CurrentValue = vehWheel.Position;
                        }
                        else
                        {
                            dbVeh.Wheels.Add(vehWheel);
                        }
                    }

                    // Doors
                    foreach (var dbVehDoor in dbVeh.Doors.ToList())
                    {
                        if (vehicle.Doors.All(m => m.Index != dbVehDoor.Index))
                        {
                            context.VehicleDoors.Remove(dbVehDoor);
                        }
                    }

                    foreach (var vehDoor in vehicle.Doors)
                    {
                        var dbVehDoor = dbVeh.Doors.SingleOrDefault(s => s.Index == vehDoor.Index);
                        if (dbVehDoor != null)
                        {
                            vehDoor.Id        = dbVehDoor.Id;
                            vehDoor.VehicleId = vehicle.Id;
                            context.Entry(dbVehDoor).CurrentValues.SetValues(vehDoor);
                        }
                        else
                        {
                            dbVeh.Doors.Add(vehDoor);
                        }
                    }

                    // Extras
                    foreach (var dbVehExtra in dbVeh.Extras.ToList())
                    {
                        if (vehicle.Extras.All(m => m.Index != dbVehExtra.Index))
                        {
                            context.VehicleExtras.Remove(dbVehExtra);
                        }
                    }

                    foreach (var vehExtra in vehicle.Extras)
                    {
                        var dbVehExtra = dbVeh.Extras.SingleOrDefault(s => s.Index == vehExtra.Index);
                        if (dbVehExtra != null)
                        {
                            vehExtra.Id        = dbVehExtra.Id;
                            vehExtra.VehicleId = vehicle.Id;
                            context.Entry(dbVehExtra).CurrentValues.SetValues(vehExtra);
                        }
                        else
                        {
                            dbVeh.Extras.Add(vehExtra);
                        }
                    }

                    // Windows
                    foreach (var dbVehWindow in dbVeh.Windows.ToList())
                    {
                        if (vehicle.Windows.All(m => m.Index != dbVehWindow.Index))
                        {
                            context.VehicleWindows.Remove(dbVehWindow);
                        }
                    }

                    foreach (var vehWindow in vehicle.Windows)
                    {
                        var dbVehWindow = dbVeh.Windows.SingleOrDefault(s => s.Index == vehWindow.Index);
                        if (dbVehWindow != null)
                        {
                            vehWindow.Id        = dbVehWindow.Id;
                            vehWindow.VehicleId = vehicle.Id;
                            context.Entry(dbVehWindow).CurrentValues.SetValues(vehWindow);
                        }
                        else
                        {
                            dbVeh.Windows.Add(vehWindow);
                        }
                    }

                    // Seats
                    foreach (var dbVehSeat in dbVeh.Seats.ToList())
                    {
                        if (vehicle.Seats.All(m => m.Index != dbVehSeat.Index))
                        {
                            context.VehicleSeats.Remove(dbVehSeat);
                        }
                    }

                    foreach (var vehSeat in vehicle.Seats)
                    {
                        var dbVehSeat = dbVeh.Seats.SingleOrDefault(s => s.Index == vehSeat.Index);
                        if (dbVehSeat != null)
                        {
                            vehSeat.Id        = dbVehSeat.Id;
                            vehSeat.VehicleId = vehicle.Id;
                            context.Entry(dbVehSeat).CurrentValues.SetValues(vehSeat);
                        }
                        else
                        {
                            dbVeh.Seats.Add(vehSeat);
                        }
                    }

                    // TODO: Mods

                    await context.SaveChangesAsync();

                    transaction.Commit();
                }
        }
        public static Object HandleMethod(StorageContext context, string operation, params object[] args)
        {
            if (operation.Equals(METHOD_AVAILABLE_FOR_WITHDRAWAL))
            {
                return(AvailableForWithdrawal(context));
            }

            if (operation.Equals(METHOD_AVAILABLE_FOR_WITHDRAWAL_STM))
            {
                return(AvailableForWithdrawalSTM(context));
            }

            if (operation.Equals(METHOD_SET_AVAILABLE_FOR_WITHDRAWAL))
            {
                return(SetAvailableForWithdrawal(context, (BigInteger)args[0]));
            }

            if (operation.Equals(METHOD_SET_AVAILABLE_FOR_WITHDRAWAL_STM))
            {
                return(SetAvailableForWithdrawal(context, (BigInteger)args[0]));
            }

            if (operation.Equals(METHOD_PAY))
            {
                return(Pay(context, (byte[])args[0], (byte[])args[1], (byte[])args[2], (BigInteger)args[3], (BigInteger)args[4], (byte[])args[5]));
            }

            if (operation.Equals(METHOD_PAY_ALTCOIN))
            {
                return(PayAltCoin(context, (byte[])args[0], (byte[])args[1], (byte[])args[2], (BigInteger)args[3], (BigInteger)args[4], (byte[])args[5]));
            }

            if (operation.Equals(METHOD_GET_DEAL))
            {
                return(GetDeal(context, (byte[])args[0], (string)args[1]));
            }

            if (operation.Equals(METHOD_SET_DEAL))
            {
                return(SetDeal(context, (byte[])args[0], (string)args[1], args[2]));
            }

            if (operation.Equals(METHOD_VERIFY_DEAL))
            {
                return(VerifyDeal(context, (byte[])args[0], (byte[])args[1]));
            }

            if (operation.Equals(METHOD_START_DEAL_FOR_USER))
            {
                return(StartDealForUser(context, (byte[])args[0], (byte[])args[1], (byte[])args[2], (BigInteger)args[3], (BigInteger)args[4], (bool)args[5]));
            }

            if (operation.Equals(METHOD_WITHDRAW_COMMISSION_TO_ADDRESS))
            {
                return(WithdrawCommissionToAddress(context, (byte[])args[0], (BigInteger)args[1]));
            }

            if (operation.Equals(METHOD_WITHDRAW_COMMISSION_TO_ADDRESS_ALTCOIN))
            {
                return(WithdrawCommissionToAddressAltcoin(context, (byte[])args[0], (BigInteger)args[1]));
            }

            if (operation.Equals(METHOD_GET_STATUS_DEAL))
            {
                return(GetStatusDeal(context, (byte[])args[0]));
            }

            if (operation.Equals(METHOD_RELEASE_TOKENS))
            {
                return(ReleaseTokens(context, (byte[])args[0], (BigInteger)args[1]));
            }

            if (operation.Equals(METHOD_RELEASE_TOKENS_FORCE))
            {
                return(ReleaseTokensForce(context, (byte[])args[0]));
            }

            if (operation.Equals(METHOD_CANCEL_SELLER))
            {
                return(CancelSeller(context, (byte[])args[0], (BigInteger)args[1]));
            }

            if (operation.Equals(METHOD_APPROVE_DEAL))
            {
                return(ApproveDeal(context, (byte[])args[0]));
            }

            if (operation.Equals(METHOD_TRANSFER_MINUS_COMMISSION))
            {
                return(TransferMinusCommission(context, (byte[])args[0], (BigInteger)args[1], (BigInteger)args[2]));
            }

            if (operation.Equals(METHOD_TRANSFER_MINUS_COMMISSION_ALTCOIN))
            {
                return(TransferMinusCommissionAltCoin(context, (byte[])args[0], (BigInteger)args[1], (BigInteger)args[2]));
            }

            if (operation.Equals(METHOD_TRANSFER_TOKEN))
            {
                return(TransferToken(context, (byte[])args[0], (byte[])args[1], (BigInteger)args[2]));
            }

            if (operation.Equals(METHOD_TRANSFER_TOKEN_FROM))
            {
                return(TransferTokenFrom(context, (byte[])args[0], (byte[])args[1], (byte[])args[2], (BigInteger)args[3]));
            }

            if (operation.Equals(METHOD_APPROVE_TOKEN))
            {
                return(ApproveToken(context, (byte[])args[0], (byte[])args[1], (BigInteger)args[2]));
            }


            if (operation.Equals(METHOD_GET_CHECKPOINT))
            {
                return(Storage.Get(context, (byte[])args[0]));
            }
            return(false);
        }
Esempio n. 32
0
 /// <summary>
 /// Constructor for AuditLogRepository
 /// </summary>
 /// <param name="context"></param>
 /// <param name="logger"></param>
 public AuditLogRepository(StorageContext context, ILogger <AuditLog> logger, IHttpContextAccessor httpContextAccessor) : base(context, logger, httpContextAccessor)
 {
 }
Esempio n. 33
0
 public DbBreedsRepository(StorageContext context)
 {
     _dbContext = context;
 }
Esempio n. 34
0
 public ProviderRepository(StorageContext context)
 {
     this.db = context;
 }
Esempio n. 35
0
        public void TestStorage_Put()
        {
            var engine = GetEngine(false, true);

            engine.CurrentContext.EvaluationStack.Push(1);
            InteropService.Invoke(engine, InteropService.Storage.Put).Should().BeFalse();

            //CheckStorageContext fail
            var key   = new byte[] { 0x01 };
            var value = new byte[] { 0x02 };

            engine.CurrentContext.EvaluationStack.Push(value);
            engine.CurrentContext.EvaluationStack.Push(key);
            var state          = TestUtils.GetContract();
            var storageContext = new StorageContext
            {
                ScriptHash = state.ScriptHash,
                IsReadOnly = false
            };

            engine.CurrentContext.EvaluationStack.Push(new InteropInterface <StorageContext>(storageContext));
            InteropService.Invoke(engine, InteropService.Storage.Put).Should().BeFalse();

            //key.Length > MaxStorageKeySize
            key   = new byte[InteropService.Storage.MaxKeySize + 1];
            value = new byte[] { 0x02 };
            engine.CurrentContext.EvaluationStack.Push(value);
            engine.CurrentContext.EvaluationStack.Push(key);
            engine.CurrentContext.EvaluationStack.Push(new InteropInterface <StorageContext>(storageContext));
            InteropService.Invoke(engine, InteropService.Storage.Put).Should().BeFalse();

            //value.Length > MaxStorageValueSize
            key   = new byte[] { 0x01 };
            value = new byte[ushort.MaxValue + 1];
            engine.CurrentContext.EvaluationStack.Push(value);
            engine.CurrentContext.EvaluationStack.Push(key);
            engine.CurrentContext.EvaluationStack.Push(new InteropInterface <StorageContext>(storageContext));
            InteropService.Invoke(engine, InteropService.Storage.Put).Should().BeFalse();

            //context.IsReadOnly
            key   = new byte[] { 0x01 };
            value = new byte[] { 0x02 };
            storageContext.IsReadOnly = true;
            engine.CurrentContext.EvaluationStack.Push(value);
            engine.CurrentContext.EvaluationStack.Push(key);
            engine.CurrentContext.EvaluationStack.Push(new InteropInterface <StorageContext>(storageContext));
            InteropService.Invoke(engine, InteropService.Storage.Put).Should().BeFalse();

            //storage value is constant
            var snapshot = Blockchain.Singleton.GetSnapshot();

            state.Manifest.Features = ContractFeatures.HasStorage;

            var storageKey = new StorageKey
            {
                ScriptHash = state.ScriptHash,
                Key        = new byte[] { 0x01 }
            };
            var storageItem = new StorageItem
            {
                Value      = new byte[] { 0x01, 0x02, 0x03, 0x04 },
                IsConstant = true
            };

            snapshot.Contracts.Add(state.ScriptHash, state);
            snapshot.Storages.Add(storageKey, storageItem);
            engine = new ApplicationEngine(TriggerType.Application, null, snapshot, 0);
            engine.LoadScript(new byte[] { 0x01 });
            key   = new byte[] { 0x01 };
            value = new byte[] { 0x02 };
            storageContext.IsReadOnly = false;
            engine.CurrentContext.EvaluationStack.Push(value);
            engine.CurrentContext.EvaluationStack.Push(key);
            engine.CurrentContext.EvaluationStack.Push(new InteropInterface <StorageContext>(storageContext));
            InteropService.Invoke(engine, InteropService.Storage.Put).Should().BeFalse();

            //success
            storageItem.IsConstant = false;
            engine.CurrentContext.EvaluationStack.Push(value);
            engine.CurrentContext.EvaluationStack.Push(key);
            engine.CurrentContext.EvaluationStack.Push(new InteropInterface <StorageContext>(storageContext));
            InteropService.Invoke(engine, InteropService.Storage.Put).Should().BeTrue();

            //value length == 0
            key   = new byte[] { 0x01 };
            value = new byte[0];
            engine.CurrentContext.EvaluationStack.Push(value);
            engine.CurrentContext.EvaluationStack.Push(key);
            engine.CurrentContext.EvaluationStack.Push(new InteropInterface <StorageContext>(storageContext));
            InteropService.Invoke(engine, InteropService.Storage.Put).Should().BeTrue();
        }
 public DbDisplayPlacesRepository(StorageContext context)
 {
     _dbContext = context;
 }