コード例 #1
0
ファイル: WFDex.cs プロジェクト: LYRA-Block-Lattice/Lyra-Core
        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);
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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"));
        }