public static AssetSettingEntity Create(IAssetSetting setting)
 {
     return(new AssetSettingEntity
     {
         PartitionKey = GeneratePartition(setting.Asset),
         RowKey = Guid.NewGuid().ToString(),
         HotWallet = setting.HotWallet,
         ChangeWallet = setting.ChangeWallet
     });
 }
Beispiel #2
0
        private async Task <IAssetSetting> CreateAssetSetting(string assetId, IAssetSetting defaultSetttings)
        {
            var clone = defaultSetttings.Clone(assetId);

            clone.ChangeWallet = defaultSetttings.ChangeWallet;
            clone.HotWallet    = defaultSetttings.ChangeWallet;
            try
            {
                await _assetSettingRepository.Insert(clone);
            }
            catch
            {
                return(await _assetSettingRepository.GetAssetSetting(assetId) ?? defaultSetttings);
            }
            return(clone);
        }
Beispiel #3
0
 public static AssetSettingEntity Create(IAssetSetting src)
 {
     return(new AssetSettingEntity
     {
         PartitionKey = GeneratePartitionKey(),
         RowKey = src.Asset,
         HotWallet = src.HotWallet,
         ChangeWallet = src.ChangeWallet,
         CashinCoef = src.CashinCoef,
         Dust = src.Dust,
         MaxOutputsCountInTx = src.MaxOutputsCountInTx,
         MinOutputsCount = src.MinOutputsCount,
         MaxOutputsCount = src.MaxOutputsCount,
         MinBalance = src.MinBalance,
         OutputSize = src.OutputSize,
         PrivateIncrement = src.PrivateIncrement
     });
 }
 public Task Insert(IAssetSetting setting)
 {
     return(_table.InsertAsync(AssetSettingEntity.ById.Create(setting)));
 }
Beispiel #5
0
        private async Task GenerateOutputs(int generateCnt, IEnumerable <ICoin> coins, BitcoinAddress hotWallet, IMoney amount, IAsset asset, IAssetSetting setting)
        {
            var colored = amount is AssetMoney;
            await _logger.WriteInfoAsync("GenerateOffchainOutputsFunction", "GenerateOutputs", null,
                                         $"Start generate {generateCnt} outputs for {asset.Id}");

            var generated = 0;

            while (generated < generateCnt)
            {
                var outputsCount = Math.Min(setting.MaxOutputsCountInTx, generateCnt - generated);

                var context = _transactionBuildContextFactory.Create(_connectionParams.Network);

                if (colored)
                {
                    var total = coins.Cast <ColoredCoin>().DefaultIfEmpty().Sum(o => o?.Amount.Quantity ?? 0);
                    if (total < ((AssetMoney)amount).Quantity * outputsCount)
                    {
                        return;
                    }
                }
                else
                {
                    var total = coins.Cast <Coin>().DefaultIfEmpty().Sum(o => o?.Amount ?? Money.Zero);
                    if (total < (Money)amount * outputsCount)
                    {
                        return;
                    }
                }

                await context.Build(async() =>
                {
                    var builder = new TransactionBuilder();

                    builder.AddCoins(coins);
                    for (int i = 0; i < outputsCount; i++)
                    {
                        if (colored)
                        {
                            builder.SendAsset(hotWallet, (AssetMoney)amount);
                        }
                        else
                        {
                            builder.Send(hotWallet, amount);
                        }
                    }

                    builder.SetChange(hotWallet, colored ? ChangeType.Colored : ChangeType.Uncolored);
                    await _transactionBuildHelper.AddFee(builder, context);
                    builder.SetChange(hotWallet, colored ? ChangeType.Colored : ChangeType.Uncolored);

                    var tr = builder.BuildTransaction(true);

                    await SignAndBroadcastTransaction(tr, context);

                    var usedCoins = new HashSet <OutPoint>(tr.Inputs.Select(o => o.PrevOut));

                    coins = coins.Where(o => !usedCoins.Contains(o.Outpoint)).ToList();

                    return("");
                });

                generated += outputsCount;
            }
            await _logger.WriteInfoAsync("GenerateOffchainOutputsFunction", "GenerateOutputs", null, "End process");
        }
Beispiel #6
0
 public Task InsertOrReplaceSetting(IAssetSetting setting)
 {
     return(_table.InsertOrReplaceAsync(AssetSettingEntity.Create(setting)));
 }