Example #1
0
        public override async Task <TransactionBlock> ExtraOpsAsync(DagSystem sys, string hash)
        {
            var blocks = await sys.Storage.FindBlocksByRelatedTxAsync(hash);

            if (!blocks.Any(a => a is TokenWithdrawBlock))
            {
                throw new Exception($"TokenWithdrawBlock not found.");
            }

            var burnblock = blocks.Where(a => a is TokenWithdrawBlock).First();
            var burnbrk   = burnblock as IBrokerAccount;
            var burn      = burnblock as TokenWithdrawBlock;

            var dc  = new DexClient(LyraNodeConfig.GetNetworkId());
            var ret = await dc.RequestWithdrawAsync(burnbrk.OwnerAccountId, burn.ExtSymbol, burn.ExtProvider,
                                                    burn.AccountID, hash,
                                                    burn.WithdrawToExtAddress, burn.BurnAmount,
                                                    NodeService.Dag.PosWallet.AccountId,
                                                    Signatures.GetSignature(NodeService.Dag.PosWallet.PrivateKey, hash, NodeService.Dag.PosWallet.AccountId));

            if (!ret.Success)
            {
                throw new Exception($"Error RequestWithdrawAsync to DEX Server: {ret.Message}");
            }

            return(null);
        }
Example #2
0
        protected override async Task <APIResultCodes> AuthorizeImplAsync <T>(DagSystem sys, T tblock)
        {
            if (!(tblock is DexWalletGenesis))
            {
                return(APIResultCodes.InvalidBlockType);
            }

            var block = tblock as DexWalletGenesis;

            if (block.AccountType != AccountTypes.DEX)
            {
                return(APIResultCodes.InvalidAccountType);
            }

            var dc   = new DexClient(LyraNodeConfig.GetNetworkId());
            var asts = await dc.GetSupportedExtTokenAsync(LyraNodeConfig.GetNetworkId());

            var ast = asts.Asserts.Where(a => a.Symbol == block.ExtSymbol)
                      .FirstOrDefault();

            if (ast == null || ast.NetworkProvider != block.ExtProvider)
            {
                return(APIResultCodes.UnsupportedDexToken);
            }

            return(await Lyra.Shared.StopWatcher.TrackAsync(() => base.AuthorizeImplAsync(sys, tblock), "DexWalletGenesisAuthorizer->DexReceiveAuthorizer"));
        }
Example #3
0
        // DEX
        #region BRK_DEX_DPOREQ
        public override async Task <APIResultCodes> PreSendAuthAsync(DagSystem sys, SendTransferBlock block, TransactionBlock last)
        {
            var symbol = block.Tags.ContainsKey("symbol") ? block.Tags["symbol"] : null;

            if (symbol == null)
            {
                return(APIResultCodes.InvalidName);
            }

            var provider = block.Tags.ContainsKey("provider") ? block.Tags["provider"] : null;

            if (provider == null)
            {
                return(APIResultCodes.InvalidName);
            }

            if (block.Tags.Count > 3)
            {
                return(APIResultCodes.InvalidBlockTags);
            }

            var dc   = new DexClient(LyraNodeConfig.GetNetworkId());
            var asts = await dc.GetSupportedExtTokenAsync(LyraNodeConfig.GetNetworkId());

            var ast = asts.Asserts.Where(a => a.Symbol == symbol && a.NetworkProvider == provider)
                      .FirstOrDefault();

            if (ast == null)
            {
                return(APIResultCodes.InvalidExternalToken);
            }

            return(APIResultCodes.Success);
        }
Example #4
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="NeonSsoSessionProxyService"></param>
 /// <param name="httpClient"></param>
 /// <param name="forwarder"></param>
 /// <param name="cache"></param>
 /// <param name="aesCipher"></param>
 /// <param name="dexClient"></param>
 public AuthController(
     Service NeonSsoSessionProxyService,
     HttpMessageInvoker httpClient,
     IHttpForwarder forwarder,
     IDistributedCache cache,
     AesCipher aesCipher,
     DexClient dexClient,
     SessionTransformer sessionTransformer,
     DistributedCacheEntryOptions cacheOptions
     )
 {
     this.NeonSsoSessionProxyService = NeonSsoSessionProxyService;
     this.httpClient   = httpClient;
     this.forwarder    = forwarder;
     this.cache        = cache;
     this.cipher       = aesCipher;
     this.transformer  = sessionTransformer;
     this.dexClient    = dexClient;
     this.cacheOptions = cacheOptions;
 }
Example #5
0
        public override async Task <TransactionBlock> BrokerOpsAsync(DagSystem sys, SendTransferBlock send)
        {
            var symbol   = send.Tags["symbol"];
            var provider = send.Tags["provider"];

            // request a wallet from dex server
            var dc = new DexClient(LyraNodeConfig.GetNetworkId());
            var r1 = await dc.CreateWalletAsync(send.AccountID, symbol, provider,
                                                send.Hash,
                                                NodeService.Dag.PosWallet.AccountId,
                                                Signatures.GetSignature(NodeService.Dag.PosWallet.PrivateKey, send.Hash, NodeService.Dag.PosWallet.AccountId)
                                                );

            if (!r1.Success)
            {
                throw new Exception("DEX Server failed: " + r1.Message);
            }

            var extw = r1 as DexAddress;
            //Assert.IsTrue(extw.Address.StartsWith('T'));

            var keyStr    = $"{send.Hash.Substring(0, 16)},{symbol},{provider},{send.AccountID}";
            var AccountId = Base58Encoding.EncodeAccountId(Encoding.ASCII.GetBytes(keyStr).Take(64).ToArray());

            var exists = await sys.Storage.FindDexWalletAsync(send.AccountID, symbol, provider);

            if (exists != null)
            {
                return(null);
            }

            var sb = await sys.Storage.GetLastServiceBlockAsync();

            var wgen = new DexWalletGenesis
            {
                Height      = 1,
                ServiceHash = sb.Hash,
                Fee         = 0,
                FeeCode     = LyraGlobal.OFFICIALTICKERCODE,
                FeeType     = AuthorizationFeeTypes.NoFee,

                // transaction
                AccountID = AccountId,        // in fact we not use this account.
                Balances  = new Dictionary <string, long>(),

                // broker
                Name           = symbol + (String.IsNullOrEmpty(provider) ? "" : $" via {provider}"),
                OwnerAccountId = send.AccountID,
                RelatedTx      = send.Hash,

                // Dex wallet
                IntSymbol   = $"${symbol}",
                ExtSymbol   = symbol,
                ExtProvider = provider,
                ExtAddress  = extw.Address,

                // genesis
                AccountType = AccountTypes.DEX
            };

            wgen.AddTag(Block.MANAGEDTAG, "");   // value is always ignored

            wgen.InitializeBlock(null, NodeService.Dag.PosWallet.PrivateKey, AccountId: NodeService.Dag.PosWallet.AccountId);

            return(wgen);
        }