public override Empty CrossChainCreateToken(CrossChainCreateTokenInput input) { var tokenContractAddress = State.CrossChainTransferWhiteList[input.FromChainId]; Assert(tokenContractAddress != null, $"Token contract address of chain {ChainHelper.ConvertChainIdToBase58(input.FromChainId)} not registered."); var originalTransaction = Transaction.Parser.ParseFrom(input.TransactionBytes); AssertCrossChainTransaction(originalTransaction, tokenContractAddress, nameof(ValidateTokenInfoExists)); var originalTransactionId = originalTransaction.GetHash(); CrossChainVerify(originalTransactionId, input.ParentChainHeight, input.FromChainId, input.MerklePath); ValidateTokenInfoExistsInput validateTokenInfoExistsInput = ValidateTokenInfoExistsInput.Parser.ParseFrom(originalTransaction.Params); RegisterTokenInfo(new TokenInfo { Symbol = validateTokenInfoExistsInput.Symbol, TokenName = validateTokenInfoExistsInput.TokenName, TotalSupply = validateTokenInfoExistsInput.TotalSupply, Decimals = validateTokenInfoExistsInput.Decimals, Issuer = validateTokenInfoExistsInput.Issuer, IsBurnable = validateTokenInfoExistsInput.IsBurnable, IsProfitable = validateTokenInfoExistsInput.IsProfitable, IssueChainId = validateTokenInfoExistsInput.IssueChainId }); return(new Empty()); }
public override Empty ValidateTokenInfoExists(ValidateTokenInfoExistsInput input) { var tokenInfo = State.TokenInfos[input.Symbol]; bool validationResult = tokenInfo != null && tokenInfo.TokenName == input.TokenName && tokenInfo.IsBurnable == input.IsBurnable && tokenInfo.Decimals == input.Decimals && tokenInfo.Issuer == input.Issuer && tokenInfo.TotalSupply == input.TotalSupply && tokenInfo.IssueChainId == input.IssueChainId && tokenInfo.IsProfitable == input.IsProfitable; Assert(validationResult, "Token validation failed."); return(new Empty()); }