public override async Task <APIResultCodes> PreSendAuthAsync(DagSystem sys, SendTransferBlock block, TransactionBlock last) { var dexid = block.Tags.ContainsKey("dexid") ? block.Tags["dexid"] : null; if (dexid == null) { return(APIResultCodes.InvalidAccountId); } decimal mintamount = 0; var mintamountstr = block.Tags.ContainsKey("amount") ? block.Tags["amount"] : null; if (mintamountstr == null || !decimal.TryParse(mintamountstr, out mintamount) || mintamount <= 0) { return(APIResultCodes.InvalidAmount); } // verify if sender is dex server if (block.AccountID != LyraGlobal.GetDexServerAccountID(LyraNodeConfig.GetNetworkId())) { return(APIResultCodes.InvalidDexServer); } // verify dex wallet owner var brkr = await sys.Storage.FindLatestBlockAsync(dexid) as IBrokerAccount; if (brkr == null) { return(APIResultCodes.InvalidBrokerAcount); } return(APIResultCodes.Success); }
protected override async Task <APIResultCodes> AuthorizeImplAsync <T>(DagSystem sys, T tblock) { if (!(tblock is TokenMintBlock)) { return(APIResultCodes.InvalidBlockType); } var block = tblock as TokenMintBlock; if (string.IsNullOrWhiteSpace(block.MintBy)) { return(APIResultCodes.InvalidTokenMint); } if (string.IsNullOrWhiteSpace(block.GenesisHash)) { return(APIResultCodes.InvalidTokenMint); } if (block.MintAmount <= 0) { return(APIResultCodes.InvalidTokenMint); } if (block.MintBy != LyraGlobal.GetDexServerAccountID(LyraNodeConfig.GetNetworkId())) { return(APIResultCodes.InvalidDexServer); } // IDexWallet interface var brkauth = new DexWalletAuthorizer(); var brkret = await brkauth.AuthorizeAsync(sys, tblock); if (brkret == APIResultCodes.Success) { return(await Lyra.Shared.StopWatcher.TrackAsync(() => base.AuthorizeImplAsync(sys, tblock), "DexTokenMintAuthorizer->TransactionAuthorizer")); } else { return(brkret); } }
protected override async Task <APIResultCodes> AuthorizeImplAsync <T>(DagSystem sys, T tblock) { if (!(tblock is TokenGenesisBlock)) { return(APIResultCodes.InvalidBlockType); } var block = tblock as TokenGenesisBlock; // Local node validations - before it sends it out to the authorization sample: // 1. check if the account already exists if (!(tblock is LyraTokenGenesisBlock)) { if (!await sys.Storage.AccountExistsAsync(block.AccountID)) { return(APIResultCodes.AccountDoesNotExist); // } TransactionBlock lastBlock = await sys.Storage.FindLatestBlockAsync(block.AccountID) as TransactionBlock; if (lastBlock == null) { return(APIResultCodes.CouldNotFindLatestBlock); } // check LYR balance if (lastBlock.Balances[LyraGlobal.OFFICIALTICKERCODE] != block.Balances[LyraGlobal.OFFICIALTICKERCODE] + block.Fee.ToBalanceLong()) { return(APIResultCodes.InvalidNewAccountBalance); } // check ticker name // https://www.quora.com/What-characters-are-not-allowed-in-a-domain-name var r = new Regex(@"[^\w-]|^-|-$"); if (!block.Ticker.Contains(block.DomainName + "/") || r.IsMatch(block.DomainName)) { return(APIResultCodes.InvalidDomainName); } if (r.IsMatch(block.Ticker.Replace(block.DomainName + "/", ""))) { return(APIResultCodes.InvalidTickerName); } if (block.RenewalDate > DateTime.UtcNow.Add(TimeSpan.FromDays(3660)) || block.RenewalDate < DateTime.UtcNow) { return(APIResultCodes.InvalidTokenRenewalDate); } if (string.IsNullOrWhiteSpace(block.DomainName)) { return(APIResultCodes.EmptyDomainName); } bool tokenIssuerIsSeed0 = block.AccountID == ProtocolSettings.Default.StandbyValidators[0]; if (!tokenIssuerIsSeed0 && block.AccountID != LyraGlobal.GetDexServerAccountID(LyraNodeConfig.GetNetworkId())) { if (block.DomainName.Length < 6) { return(APIResultCodes.DomainNameTooShort); } if (_reservedDomains.Any(a => a.Equals(block.DomainName, StringComparison.InvariantCultureIgnoreCase))) { return(APIResultCodes.DomainNameReserved); } } } if (await sys.Storage.WasAccountImportedAsync(block.AccountID)) { return(APIResultCodes.CannotModifyImportedAccount); } var tresult = await VerifyTransactionBlockAsync(sys, block); if (tresult != APIResultCodes.Success) { return(tresult); } // check length if (string.IsNullOrWhiteSpace(block.DomainName) || string.IsNullOrWhiteSpace(block.Ticker)) { return(APIResultCodes.InvalidTickerName); } if (block.DomainName.Length >= 64 || block.Ticker.Length >= 64) { return(APIResultCodes.InvalidTickerName); } // check if this token already exists //AccountData genesis_blocks = _accountCollection.GetAccount(AccountCollection.GENESIS_BLOCKS); //if (genesis_blocks.FindTokenGenesisBlock(testTokenGenesisBlock) != null) if (await sys.Storage.FindTokenGenesisBlockAsync(block.Hash, block.Ticker) != null) { return(APIResultCodes.TokenGenesisBlockAlreadyExists); } if (block.Fee != (await sys.Storage.GetLastServiceBlockAsync()).TokenGenerationFee) { return(APIResultCodes.InvalidFeeAmount); } if (block.NonFungibleType == NonFungibleTokenTypes.Collectible && !block.IsNonFungible) { return(APIResultCodes.InvalidNFT); } if (block.IsNonFungible) { if (!Signatures.ValidateAccountId(block.NonFungibleKey)) { return(APIResultCodes.InvalidNonFungiblePublicKey); } // Validate Collectible NFT if (block.ContractType == ContractTypes.Collectible) { if (block.Precision != 0) { return(APIResultCodes.InvalidNFT); } if (block.NonFungibleType != NonFungibleTokenTypes.Collectible) { return(APIResultCodes.InvalidNFT); } } } return(await Lyra.Shared.StopWatcher.TrackAsync(() => base.AuthorizeImplAsync(sys, tblock), "TokenGenesisAuthorizer->ReceiveTransferAuthorizer")); }