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); }
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")); }
// 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); }
/// <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; }
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); }