예제 #1
0
        public void SignNeo()
        {
            var account_id = Signatures.GetAccountIdFromPrivateKey(PrivateKey1);
            var result     = Signatures.GetSignature(PrivateKey1, message, account_id);

            Assert.IsNotNull(result);
        }
예제 #2
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);
        }
예제 #3
0
        protected void Sign <T>(ref T tblock)
        {
            if (!(tblock is TransactionBlock))
            {
                throw new System.ApplicationException("APIResultCodes.InvalidBlockType");
            }

            var block = tblock as TransactionBlock;

            // ServiceHash is excluded when calculating the block hash,
            // but it is included when creating/validating the authorization signature
            block.ServiceHash = _serviceAccount.GetLatestBlock().Hash;

            // sign with the authorizer key
            AuthorizationSignature authSignature = new AuthorizationSignature
            {
                Key       = _serviceAccount.AccountId,
                Signature = Signatures.GetSignature(_serviceAccount.PrivateKey, block.Hash + block.ServiceHash)
            };

            if (block.Authorizations == null)
            {
                block.Authorizations = new List <AuthorizationSignature>();
            }
            block.Authorizations.Add(authSignature);
        }
예제 #4
0
 public LightWallet(SecureString privateKey, string networkId)
 {
     _securePrivateKey = privateKey;
     _networkId        = networkId;
     _accountId        = Signatures.GetAccountIdFromPrivateKey(new NetworkCredential("", _securePrivateKey).Password);
     _client           = new LyraJsonRPCClient(_networkId, (s) =>
                                               Task.FromResult(Signatures.GetSignature(new NetworkCredential("", _securePrivateKey).Password, s, _accountId)));
 }
예제 #5
0
        public void VerifySignatureNeo()
        {
            var account_id = Signatures.GetAccountIdFromPrivateKey(PrivateKey1);
            var signature  = Signatures.GetSignature(PrivateKey1, message, account_id);

            var result = Signatures.VerifyAccountSignature(message, account_id, signature);

            Assert.IsTrue(result);
        }
예제 #6
0
 public string Sign(string PrivateKey, string accountId)
 {
     if (string.IsNullOrWhiteSpace(Hash))
     {
         Hash = CalculateHash();
     }
     Signature = Signatures.GetSignature(PrivateKey, Hash, accountId);
     return(this.Signature);
 }
예제 #7
0
 public string Sign(string PrivateKey, string accountId)
 {
     if (string.IsNullOrWhiteSpace(Hash))
     {
         Hash = CalculateHash();
     }
     //Console.WriteLine($"Hash: {Hash}\nAccountID: {accountId}");
     Signature = Signatures.GetSignature(PrivateKey, Hash, accountId);
     return(this.Signature);
 }
예제 #8
0
        public TransitWallet(string AccountId, string signingPrivateKey, LyraRestClient client)
        {
            _signingPrivateKey = signingPrivateKey;
            _signingAccountId  = Signatures.GetAccountIdFromPrivateKey(_signingPrivateKey);

            _accountId = AccountId;

            _rpcClient = client;

            _signer = (hash) => Task.FromResult(Signatures.GetSignature(_signingPrivateKey, hash, _signingAccountId));
        }
예제 #9
0
        public TransitWallet(string privateKey, LyraRestClient client)
        {
            _uniqId = Guid.NewGuid().ToString();

            _privateKey = privateKey;
            _accountId  = Signatures.GetAccountIdFromPrivateKey(privateKey);

            _rpcClient = client;

            _signer = (hash) => Signatures.GetSignature(_privateKey, hash, _accountId);
        }
예제 #10
0
        protected AuthorizationSignature Sign <T>(DagSystem sys, T tblock)
        {
            if (!(tblock is Block))
            {
                throw new System.Exception("APIResultCodes.InvalidBlockType");
            }

            var block = tblock as Block;

            // sign with the authorizer key
            AuthorizationSignature authSignature = new AuthorizationSignature
            {
                Key       = sys.PosWallet.AccountId,
                Signature = Signatures.GetSignature(sys.PosWallet.PrivateKey,
                                                    block.Hash, sys.PosWallet.AccountId)
            };

            return(authSignature);
        }
        /// <summary>
        /// two ways to begin view changing: either one third of all voters requested, or local requested.
        ///
        /// </summary>
        /// <returns></returns>
        internal async Task BeginChangeViewAsync(ViewChangeReason reason)
        {
            _log.LogInformation($"BeginChangeViewAsync: VID: {ViewId} Req: {reqMsgs.Count} Reply: {replyMsgs.Count} Commit: {commitMsgs.Count} Votes {commitMsgs.Count}/{LyraGlobal.GetMajority(_context.Board.AllVoters.Count)}/{_context.Board.AllVoters.Count} Replyed: {replySent} Commited: {commitSent}");

            _reason = reason;
            var lastSb = await _sys.Storage.GetLastServiceBlockAsync();

            if (lastSb == null)
            {
                // genesis?
                _log.LogCritical($"BeginChangeViewAsync has null service block. should not happend. error.");
                return;
            }

            _isViewChanging = true;

            ShiftView(lastSb.Height + 1);
            selectedSuccess = false;

            _log.LogInformation($"View change for ViewId {ViewId} begin at {TimeStarted}");

            CalculateLeaderCandidate();

            var lastCons = await _sys.Storage.GetLastConsolidationBlockAsync();

            var req = new ViewChangeRequestMessage
            {
                From             = _sys.PosWallet.AccountId,
                ViewID           = ViewId,
                prevViewID       = lastSb.Height,
                requestSignature = Signatures.GetSignature(_sys.PosWallet.PrivateKey,
                                                           $"{lastSb.Hash}|{lastCons.Hash}", _sys.PosWallet.AccountId),
            };

            _context.Send2P2pNetwork(req);
            await CheckRequestAsync(req);
        }
예제 #12
0
        public override async Task <APIResultCodes> PreSendAuthAsync(DagSystem sys, SendTransferBlock send, TransactionBlock last)
        {
            if (send.Tags.Count != 4 ||
                !send.Tags.ContainsKey("tradeid") ||
                string.IsNullOrWhiteSpace(send.Tags["tradeid"]) ||
                !send.Tags.ContainsKey("orderid") ||
                string.IsNullOrWhiteSpace(send.Tags["orderid"]) ||
                !send.Tags.ContainsKey("daoid") ||
                string.IsNullOrWhiteSpace(send.Tags["daoid"])
                )
            {
                return(APIResultCodes.InvalidBlockTags);
            }

            var tradeid = send.Tags["tradeid"];
            var orderid = send.Tags["orderid"];
            var daoid   = send.Tags["daoid"];

            var tradeblk = await sys.Storage.FindLatestBlockAsync(tradeid);

            var daoblk = await sys.Storage.FindLatestBlockAsync((tradeblk as IOtcTrade).Trade.daoId);

            if (daoblk == null || tradeblk == null || (daoblk as TransactionBlock).AccountID != daoid ||
                (tradeblk as IOtcTrade).Trade.daoId != (daoblk as TransactionBlock).AccountID)
            {
                return(APIResultCodes.InvalidTrade);
            }

            if ((tradeblk as IBrokerAccount).OwnerAccountId != send.AccountID)
            {
                return(APIResultCodes.InvalidTrade);
            }

            if ((tradeblk as IOtcTrade).OTStatus != OTCTradeStatus.Open)
            {
                return(APIResultCodes.InvalidTrade);
            }

            var orderblk = await sys.Storage.FindLatestBlockAsync(orderid);

            if (orderblk == null || (tradeblk as IOtcTrade).Trade.orderId != orderid ||
                (tradeblk as IOtcTrade).Trade.daoId != daoid)
            {
                return(APIResultCodes.InvalidTrade);
            }

            if (Settings.Default.LyraNode.Lyra.NetworkId != "xtest")
            {
                // check if trade is cancellable
                var lsb    = sys.Storage.GetLastServiceBlock();
                var wallet = sys.PosWallet;
                var sign   = Signatures.GetSignature(wallet.PrivateKey, lsb.Hash, wallet.AccountId);
                var dlrblk = await sys.Storage.FindLatestBlockAsync((tradeblk as IOtcTrade).Trade.dealerId);

                var uri    = new Uri(new Uri((dlrblk as IDealer).Endpoint), "/api/dealer/");
                var dealer = new DealerClient(uri);
                var ret    = await dealer.GetTradeBriefAsync(tradeid, wallet.AccountId, sign);

                if (!ret.Successful() || !ret.Deserialize <TradeBrief>().IsCancellable)
                {
                    return(APIResultCodes.InvalidOperation);
                }
            }

            return(APIResultCodes.Success);
        }
        private void StartInit()
        {
            if (0 == GetBlockCount() && NodeService.Instance.PosWallet.AccountId ==
                ProtocolSettings.Default.StandbyValidators[0])
            {
                // do genesis
                var authGenesis = new ServiceBlock
                {
                    Index              = 1,
                    UIndex             = 1,
                    NetworkId          = _nodeConfig.Lyra.NetworkId,
                    ShardId            = "Primary",
                    TransferFee        = 1,
                    TokenGenerationFee = 100,
                    TradeFee           = 0.1m,
                    SvcAccountID       = NodeService.Instance.PosWallet.AccountId
                };
                authGenesis.InitializeBlock(null, NodeService.Instance.PosWallet.PrivateKey,
                                            _nodeConfig.Lyra.NetworkId, authGenesis.ShardId,
                                            NodeService.Instance.PosWallet.AccountId);
                authGenesis.UHash          = SignableObject.CalculateHash($"{authGenesis.UIndex}|{authGenesis.Index}|{authGenesis.Hash}");
                authGenesis.Authorizations = new List <AuthorizationSignature>();
                authGenesis.Authorizations.Add(new AuthorizationSignature
                {
                    Key       = NodeService.Instance.PosWallet.AccountId,
                    Signature = Signatures.GetSignature(NodeService.Instance.PosWallet.PrivateKey, authGenesis.Hash, NodeService.Instance.PosWallet.AccountId)
                });
                // TODO: add more seed's auth info

                _store.AddBlock(authGenesis);

                // the first consolidate block
                var consBlock = new ConsolidationBlock
                {
                    UIndex       = 2,
                    NetworkId    = authGenesis.NetworkId,
                    ShardId      = authGenesis.ShardId,
                    ServiceHash  = authGenesis.Hash,
                    SvcAccountID = NodeService.Instance.PosWallet.AccountId
                };
                consBlock.InitializeBlock(authGenesis, NodeService.Instance.PosWallet.PrivateKey,
                                          _nodeConfig.Lyra.NetworkId, authGenesis.ShardId,
                                          NodeService.Instance.PosWallet.AccountId);
                consBlock.UHash          = SignableObject.CalculateHash($"{consBlock.UIndex}|{consBlock.Index}|{consBlock.Hash}");
                consBlock.Authorizations = new List <AuthorizationSignature>();
                consBlock.Authorizations.Add(new AuthorizationSignature
                {
                    Key       = NodeService.Instance.PosWallet.AccountId,
                    Signature = Signatures.GetSignature(NodeService.Instance.PosWallet.PrivateKey, consBlock.Hash + consBlock.ServiceHash, NodeService.Instance.PosWallet.AccountId)
                });

                _store.AddBlock(consBlock);

                // tell consensus what happened
                InSyncing = false;

                var board = new BillBoard();
                board.Add(NodeService.Instance.PosWallet.AccountId);   // add me!

                LyraSystem.Singleton.Consensus.Tell(board);
                LyraSystem.Singleton.Consensus.Tell(new ConsensusService.BlockChainSynced());
                _log.LogInformation("Service Genesis Completed.");
            }
            else
            {
                SyncBlocksFromSeeds(0);
            }
        }
        // every method must check if the operation has been done.
        // if has been done, return null.
        public static async Task <ReceiveTransferBlock> ReceivePoolFactoryFeeAsync(DagSystem sys, SendTransferBlock sendBlock)
        {
            // check exists
            var recv = await sys.Storage.FindBlockBySourceHashAsync(sendBlock.Hash);

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

            TransactionBlock prevSend = await sys.Storage.FindBlockByHashAsync(sendBlock.PreviousHash) as TransactionBlock;

            if (prevSend == null)
            {
                return(null);        // process missing block
            }
            var txInfo = sendBlock.GetBalanceChanges(prevSend);

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

            var receiveBlock = new ReceiveAsFeeBlock
            {
                AccountID   = sendBlock.DestinationAccountId,
                VoteFor     = null,
                ServiceHash = lsb.Hash,
                SourceHash  = sendBlock.Hash,
                Balances    = new Dictionary <string, long>(),
                Fee         = Math.Round(txInfo.Changes[LyraGlobal.OFFICIALTICKERCODE], 8, MidpointRounding.ToZero),
                FeeCode     = LyraGlobal.OFFICIALTICKERCODE,
                FeeType     = AuthorizationFeeTypes.FullFee,
            };

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

            TransactionBlock latestPoolBlock = await sys.Storage.FindLatestBlockAsync(sendBlock.DestinationAccountId) as TransactionBlock;

            var latestBalances = latestPoolBlock.Balances.ToDecimalDict();
            var recvBalances   = latestPoolBlock.Balances.ToDecimalDict();

            receiveBlock.Balances = recvBalances.ToLongDict();

            await receiveBlock.InitializeBlockAsync(latestPoolBlock, (hash) => Task.FromResult(Signatures.GetSignature(sys.PosWallet.PrivateKey, hash, sys.PosWallet.AccountId)));

            return(receiveBlock);
        }
예제 #15
0
        public override async Task <TransactionBlock> ExtraOpsAsync(DagSystem sys, string reqHash)
        {
            var blocks = await sys.Storage.FindBlocksByRelatedTxAsync(reqHash);

            var swout = blocks.FirstOrDefault(a => a is PoolSwapOutBlock);

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

            var recv = blocks.FirstOrDefault(a => a is PoolSwapInBlock) as PoolSwapInBlock;

            var swapInBlock   = recv as PoolSwapInBlock;
            var recvBlockPrev = await sys.Storage.FindBlockByHashAsync(recv.PreviousHash) as TransactionBlock;

            var recvChgs    = swapInBlock.GetBalanceChanges(recvBlockPrev);
            var kvp         = recvChgs.Changes.First();
            var poolGenesis = await sys.Storage.FindFirstBlockAsync(swapInBlock.AccountID) as PoolGenesisBlock;

            var cfg = new SwapCalculator(poolGenesis.Token0, poolGenesis.Token1, recvBlockPrev,
                                         kvp.Key, kvp.Value, 0);

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

            var send = await sys.Storage.FindBlockByHashAsync(swapInBlock.SourceHash) as SendTransferBlock;

            var swapOutBlock = new PoolSwapOutBlock
            {
                AccountID            = send.DestinationAccountId,
                ServiceHash          = lsb.Hash,
                DestinationAccountId = send.AccountID,
                Balances             = new Dictionary <string, long>(),
                Tags      = null,
                Fee       = cfg.PayToAuthorizer,
                FeeCode   = LyraGlobal.OFFICIALTICKERCODE,
                FeeType   = AuthorizationFeeTypes.Dynamic,
                RelatedTx = send.Hash
            };

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

            var poolGenesisBlock = await sys.Storage.FindFirstBlockAsync(recv.AccountID) as PoolGenesisBlock;

            var poolLatestBlock = await sys.Storage.FindLatestBlockAsync(recv.AccountID) as TransactionBlock;

            var curBalance  = poolLatestBlock.Balances.ToDecimalDict();
            var nextBalance = poolLatestBlock.Balances.ToDecimalDict();

            var tokenOut = cfg.SwapOutToken;
            var tokenIn  = cfg.SwapInToken;

            if (tokenIn == LyraGlobal.OFFICIALTICKERCODE)
            {
                // tokenIn == LYR
                nextBalance[tokenIn]  = curBalance[tokenIn] - cfg.PayToAuthorizer; // pool fee leave in the pool
                nextBalance[tokenOut] = curBalance[tokenOut] - cfg.SwapOutAmount;
            }
            else
            {
                // tokenIn == other token
                nextBalance[tokenIn]  = curBalance[tokenIn]; // pool fee leave in the pool
                nextBalance[tokenOut] = curBalance[tokenOut] - cfg.SwapOutAmount - cfg.PayToAuthorizer;
            }

            Console.WriteLine($"user should receive {cfg.SwapOutAmount} {cfg.SwapOutToken}");

            swapOutBlock.Balances = nextBalance.ToLongDict();
            swapOutBlock.Shares   = (poolLatestBlock as IPool).Shares;
            await swapOutBlock.InitializeBlockAsync(poolLatestBlock, (hash) => Task.FromResult(Signatures.GetSignature(sys.PosWallet.PrivateKey, hash, sys.PosWallet.AccountId)));

            // verify
            var chgs = swapOutBlock.GetBalanceChanges(poolLatestBlock);

            return(swapOutBlock);
        }
예제 #16
0
 public void Sign()
 {
     Signature = Signatures.GetSignature(NodeService.Instance.PosWallet.PrivateKey,
                                         IPAddress, NodeService.Instance.PosWallet.AccountId);
 }
        public static async Task <ReceiveTransferBlock> ReceiveDaoFeeAsync(DagSystem sys, SendTransferBlock sendBlock)
        {
            // check exists
            var recv = await sys.Storage.FindBlockBySourceHashAsync(sendBlock.Hash);

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

            var txInfo    = sendBlock.GetBalanceChanges(await sys.Storage.FindBlockByHashAsync(sendBlock.PreviousHash) as TransactionBlock);
            var lastblock = await sys.Storage.FindLatestBlockAsync(sendBlock.DestinationAccountId) as TransactionBlock;

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

            var receiveBlock = new DaoRecvBlock
            {
                // block
                ServiceHash = lsb.Hash,

                // transaction
                AccountID  = sendBlock.DestinationAccountId,
                SourceHash = sendBlock.Hash,
                Balances   = new Dictionary <string, long>(),
                Fee        = 0,
                FeeCode    = LyraGlobal.OFFICIALTICKERCODE,
                FeeType    = AuthorizationFeeTypes.NoFee,

                // broker
                Name           = ((IBrokerAccount)lastblock).Name,
                OwnerAccountId = ((IBrokerAccount)lastblock).OwnerAccountId,
                RelatedTx      = sendBlock.Hash,

                // profiting
                PType     = ((IProfiting)lastblock).PType,
                ShareRito = ((IProfiting)lastblock).ShareRito,
                Seats     = ((IProfiting)lastblock).Seats,

                // dao
                SellerFeeRatio = ((IDao)lastblock).SellerFeeRatio,
                BuyerFeeRatio  = ((IDao)lastblock).BuyerFeeRatio,
                SellerPar      = ((IDao)lastblock).SellerPar,
                BuyerPar       = ((IDao)lastblock).BuyerPar,
                Treasure       = ((IDao)lastblock).Treasure.ToDecimalDict().ToLongDict(),
                Description    = ((IDao)lastblock).Description,
            };

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

            var latestBalances = lastblock.Balances.ToDecimalDict();
            var recvBalances   = lastblock.Balances.ToDecimalDict();

            foreach (var chg in txInfo.Changes)
            {
                if (recvBalances.ContainsKey(chg.Key))
                {
                    recvBalances[chg.Key] += chg.Value;
                }
                else
                {
                    recvBalances.Add(chg.Key, chg.Value);
                }
            }

            receiveBlock.Balances = recvBalances.ToLongDict();

            await receiveBlock.InitializeBlockAsync(lastblock, (hash) => Task.FromResult(Signatures.GetSignature(sys.PosWallet.PrivateKey, hash, sys.PosWallet.AccountId)));

            return(receiveBlock);
        }
        protected async Task <TransactionBlock> ChangeStateAsync(DagSystem sys, SendTransferBlock sendBlock)
        {
            // check exists
            var recv = await sys.Storage.FindBlockBySourceHashAsync(sendBlock.Hash);

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

            var txInfo    = sendBlock.GetBalanceChanges(await sys.Storage.FindBlockByHashAsync(sendBlock.PreviousHash) as TransactionBlock);
            var lastblock = await sys.Storage.FindLatestBlockAsync(sendBlock.DestinationAccountId) as TransactionBlock;

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

            var receiveBlock = new OtcTradeRecvBlock
            {
                // block
                ServiceHash = lsb.Hash,

                // transaction
                AccountID  = sendBlock.DestinationAccountId,
                SourceHash = sendBlock.Hash,
                Balances   = new Dictionary <string, long>(),
                Fee        = 0,
                FeeCode    = LyraGlobal.OFFICIALTICKERCODE,
                FeeType    = AuthorizationFeeTypes.NoFee,

                // broker
                Name           = ((IBrokerAccount)lastblock).Name,
                OwnerAccountId = ((IBrokerAccount)lastblock).OwnerAccountId,
                RelatedTx      = sendBlock.Hash,

                // trade
                Trade    = ((IOtcTrade)lastblock).Trade,
                OTStatus = OTCTradeStatus.FiatSent,
            };

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

            var latestBalances = lastblock.Balances.ToDecimalDict();
            var recvBalances   = lastblock.Balances.ToDecimalDict();

            foreach (var chg in txInfo.Changes)
            {
                if (recvBalances.ContainsKey(chg.Key))
                {
                    recvBalances[chg.Key] += chg.Value;
                }
                else
                {
                    recvBalances.Add(chg.Key, chg.Value);
                }
            }

            receiveBlock.Balances = recvBalances.ToLongDict();

            await receiveBlock.InitializeBlockAsync(lastblock, (hash) => Task.FromResult(Signatures.GetSignature(sys.PosWallet.PrivateKey, hash, sys.PosWallet.AccountId)));

            return(receiveBlock);
        }
예제 #19
0
 protected override Task <string> SignMessageAsync(string message)
 {
     Console.WriteLine($"Signing: {message}");
     return(Task.FromResult(Signatures.GetSignature(_privateKey, message, _accountId)));
 }
예제 #20
0
        protected async Task <TransactionBlock> TransactionOperateAsync(
            DagSystem sys,
            string relatedHash,
            Block prevBlock,
            Func <TransactionBlock> GenBlock,
            Action <TransactionBlock> ChangeBlock
            )
        {
            var lsb = await sys.Storage.GetLastServiceBlockAsync();

            var nextblock = GenBlock();

            // block
            nextblock.ServiceHash = lsb.Hash;
            nextblock.Tags?.Clear();
            nextblock.AddTag(Block.MANAGEDTAG, "");   // value is always ignored

            // ibroker
            (nextblock as IBrokerAccount).RelatedTx = relatedHash;

            if (ChangeBlock != null)
            {
                ChangeBlock(nextblock);
            }

            await nextblock.InitializeBlockAsync(prevBlock, (hash) => Task.FromResult(Signatures.GetSignature(sys.PosWallet.PrivateKey, hash, sys.PosWallet.AccountId)));

            return(nextblock);
        }
예제 #21
0
        private async Task <string> SignAPIAsync()
        {
            var lsb = await client.GetLastServiceBlockAsync();

            return(Signatures.GetSignature(testPrivateKey, lsb.GetBlock().Hash, testPublicKey));
        }
        private async Task <string> SignAPIAsync()
        {
            var lsb = await client.GetLastServiceBlockAsync();

            return(Signatures.GetSignature(PRIVATE_KEY_1, lsb.GetBlock().Hash, ADDRESS_ID_1));
        }
        protected async Task <TransactionBlock> TradeBlockOperateAsync(
            DagSystem sys,
            SendTransferBlock sendBlock,
            Func <TransactionBlock> GenBlock,
            Action <TransactionBlock> ChangeBlock
            )
        {
            var lastblock = await sys.Storage.FindLatestBlockAsync(sendBlock.DestinationAccountId) as TransactionBlock;

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

            var nextblock = GenBlock();

            // block
            nextblock.ServiceHash = lsb.Hash;

            // transaction
            nextblock.AccountID = sendBlock.DestinationAccountId;
            nextblock.Balances  = new Dictionary <string, long>();
            nextblock.Fee       = 0;
            nextblock.FeeCode   = LyraGlobal.OFFICIALTICKERCODE;
            nextblock.FeeType   = AuthorizationFeeTypes.NoFee;

            // broker
            (nextblock as IBrokerAccount).Name           = ((IBrokerAccount)lastblock).Name;
            (nextblock as IBrokerAccount).OwnerAccountId = ((IBrokerAccount)lastblock).OwnerAccountId;
            (nextblock as IBrokerAccount).RelatedTx      = sendBlock.Hash;

            // trade
            (nextblock as IOtcTrade).Trade    = ((IOtcTrade)lastblock).Trade;
            (nextblock as IOtcTrade).OTStatus = ((IOtcTrade)lastblock).OTStatus;

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

            var latestBalances = lastblock.Balances.ToDecimalDict();
            var recvBalances   = lastblock.Balances.ToDecimalDict();

            nextblock.Balances = recvBalances.ToLongDict();

            ChangeBlock(nextblock);

            await nextblock.InitializeBlockAsync(lastblock, (hash) => Task.FromResult(Signatures.GetSignature(sys.PosWallet.PrivateKey, hash, sys.PosWallet.AccountId)));

            return(nextblock);
        }
예제 #24
0
        public override async Task <TransactionBlock> BrokerOpsAsync(DagSystem sys, SendTransferBlock send)
        {
            var blocks = await sys.Storage.FindBlocksByRelatedTxAsync(send.Hash);

            if (blocks.Any(a => a is PoolWithdrawBlock))
            {
                return(null);
            }

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

            var recvBlock = await sys.Storage.FindBlockBySourceHashAsync(send.Hash);

            var poolGenesis = sys.Storage.GetPoolByID(send.Tags["poolid"]);
            var poolId      = poolGenesis.AccountID;

            PoolWithdrawBlock withdrawBlock = new PoolWithdrawBlock
            {
                AccountID            = poolId,
                ServiceHash          = lsb.Hash,
                DestinationAccountId = send.AccountID,
                Balances             = new Dictionary <string, long>(),
                Tags      = null,
                Fee       = 0,
                FeeCode   = LyraGlobal.OFFICIALTICKERCODE,
                FeeType   = AuthorizationFeeTypes.NoFee,
                RelatedTx = send.Hash
            };

            var sendBlock = await sys.Storage.FindBlockByHashAsync(recvBlock.SourceHash) as SendTransferBlock;

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

            var poolGenesisBlock = await sys.Storage.FindFirstBlockAsync(poolId) as PoolGenesisBlock;

            var poolLatestBlock = await sys.Storage.FindLatestBlockAsync(poolId) as TransactionBlock;

            var curBalance = poolLatestBlock.Balances.ToDecimalDict();
            var curShares  = (poolLatestBlock as IPool).Shares.ToRitoDecimalDict();

            var nextBalance = poolLatestBlock.Balances.ToDecimalDict();
            var nextShares  = (poolLatestBlock as IPool).Shares.ToRitoDecimalDict();

            var usersShare    = curShares[send.AccountID];
            var amountsToSend = new Dictionary <string, decimal>
            {
                { poolGenesisBlock.Token0, curBalance[poolGenesisBlock.Token0] * usersShare },
                { poolGenesisBlock.Token1, curBalance[poolGenesisBlock.Token1] * usersShare }
            };

            nextBalance[poolGenesisBlock.Token0] -= amountsToSend[poolGenesisBlock.Token0];
            nextBalance[poolGenesisBlock.Token1] -= amountsToSend[poolGenesisBlock.Token1];
            nextShares.Remove(send.AccountID);

            foreach (var share in curShares)
            {
                if (share.Key == send.AccountID)
                {
                    continue;
                }

                nextShares[share.Key] = (share.Value * curBalance[poolGenesisBlock.Token0]) / nextBalance[poolGenesisBlock.Token0];
            }

            withdrawBlock.Balances = nextBalance.ToLongDict();
            withdrawBlock.Shares   = nextShares.ToRitoLongDict();

            await withdrawBlock.InitializeBlockAsync(poolLatestBlock, (hash) => Task.FromResult(Signatures.GetSignature(sys.PosWallet.PrivateKey, hash, sys.PosWallet.AccountId)));

            return(withdrawBlock);
        }
예제 #25
0
        public async Task <string> SignAPICallAsync()
        {
            var syncInfo = await _client.GetSyncHeight();

            return(Signatures.GetSignature(NodeService.Instance.PosWallet.PrivateKey, syncInfo.SyncHash, NodeService.Instance.PosWallet.AccountId));
        }
예제 #26
0
        public override async Task <TransactionBlock> BrokerOpsAsync(DagSystem sys, SendTransferBlock sendBlock)
        {
            // assume all send variables are legal
            // token0/1, amount, etc.
            var blocks = await sys.Storage.FindBlocksByRelatedTxAsync(sendBlock.Hash);

            if (blocks.Any(a => a is PoolSwapInBlock))
            {
                return(null);
            }

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

            var swapInBlock = new PoolSwapInBlock
            {
                AccountID   = sendBlock.DestinationAccountId,
                VoteFor     = null,
                ServiceHash = lsb.Hash,
                SourceHash  = sendBlock.Hash,
                Balances    = new Dictionary <string, long>(),
                Fee         = 0,
                FeeCode     = LyraGlobal.OFFICIALTICKERCODE,
                FeeType     = AuthorizationFeeTypes.NoFee,

                RelatedTx = sendBlock.Hash
            };

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

            TransactionBlock prevSend = await sys.Storage.FindBlockByHashAsync(sendBlock.PreviousHash) as TransactionBlock;

            var txInfo = sendBlock.GetBalanceChanges(prevSend);

            TransactionBlock latestPoolBlock = await sys.Storage.FindLatestBlockAsync(sendBlock.DestinationAccountId) as TransactionBlock;

            PoolGenesisBlock poolGenesis = await sys.Storage.FindFirstBlockAsync(latestPoolBlock.AccountID) as PoolGenesisBlock;

            var depositBalance = new Dictionary <string, decimal>();

            if (latestPoolBlock.Balances.Any())
            {
                var lastBalance = latestPoolBlock.Balances.ToDecimalDict();

                // the rito must be preserved for every deposition
                //var poolRito = lastBalance[poolGenesis.Token0] / lastBalance[poolGenesis.Token1];
                foreach (var oldBalance in lastBalance)
                {
                    if (txInfo.Changes.ContainsKey(oldBalance.Key))
                    {
                        depositBalance.Add(oldBalance.Key, oldBalance.Value + txInfo.Changes[oldBalance.Key]);
                    }
                    else
                    {
                        depositBalance.Add(oldBalance.Key, oldBalance.Value);
                    }
                }

                var prevBalance = lastBalance[poolGenesis.Token0];
                var curBalance  = depositBalance[poolGenesis.Token0];
            }
            else
            {
                foreach (var token in txInfo.Changes)
                {
                    depositBalance.Add(token.Key, token.Value);
                }
            }

            swapInBlock.Balances = depositBalance.ToLongDict();
            swapInBlock.Shares   = (latestPoolBlock as IPool).Shares;
            await swapInBlock.InitializeBlockAsync(latestPoolBlock, (hash) => Task.FromResult(Signatures.GetSignature(sys.PosWallet.PrivateKey, hash, sys.PosWallet.AccountId)));

            return(swapInBlock);
        }
예제 #27
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);
        }
예제 #28
0
        private async Task TestDepositWithdraw(Wallet dexWallet)
        {
            //// prepare dex
            //string lyrawalletfolder = Wallet.GetFullFolderName(networkId, "wallets");
            //var walletStore = new SecuredWalletStore(lyrawalletfolder);
            //var dexWallet = Wallet.Open(walletStore, "dex", "");
            //await genesisWallet.SendAsync(100000m, dexWallet.AccountId);
            //await Task.Delay(1000);
            //await dexWallet.SyncAsync(genesisWallet.RPC);
            //Assert.IsTrue(dexWallet.BaseBalance >= 100000m);

            // external token genesis
            var lsbret = await client.GetLastServiceBlockAsync();

            Assert.IsTrue(lsbret.Successful());
            var lsb = lsbret.GetBlock();

            var tgexists = await client.GetTokenGenesisBlockAsync(dexWallet.AccountId, "tether/TRX",
                                                                  Signatures.GetSignature(dexWallet.PrivateKey, lsb.Hash, dexWallet.AccountId));

            if (!tgexists.Successful())
            {
                var tokenGenesisResult = await dexWallet.CreateTokenAsync("TRX", "tether", "", 8, 0, false, dexWallet.AccountId,
                                                                          "", "", ContractTypes.Cryptocurrency, null);

                Assert.IsTrue(tokenGenesisResult.Successful(), "dex token genesis failed");
            }

            var dexws = await dexWallet.GetAllDexWalletsAsync(dexWallet.AccountId);

            Assert.IsNotNull(dexws, "DEX Wallet not setup.");
            var wcnt = dexws.Count(a => (a as IDexWallet).ExtSymbol == "TRX" && (a as IDexWallet).ExtProvider == "native");

            Assert.AreEqual(1, wcnt, $"wallet not created properly. created: {wcnt}");

            // must fail
            await dexWallet.SyncAsync(null);

            var getokretx = await dexWallet.DexGetTokenAsync((dexws.First() as TransactionBlock).AccountID, 500m);

            Assert.IsTrue(!getokretx.Successful(), "Should not success");

            // mint via dex account

            /*
             * var
             * var dexbrk1 = dexws.First() as TransactionBlock;
             * var mintRet = await dexWallet.DexMintTokenAsync(dexbrk1.AccountID, 1000m);
             * Assert.IsTrue(mintRet.Successful(), "Mint failed.");
             * await Task.Delay(1000);
             *
             * var brk1lstret = await client.GetLastBlockAsync(dexbrk1.AccountID);
             * Assert.IsTrue(brk1lstret.Successful());
             * var brk1mint = brk1lstret.GetBlock() as TokenMintBlock;
             * Assert.IsNotNull(brk1mint);
             *
             * if (networkId == "xunit")
             * {
             *  Assert.AreEqual(2, brk1mint.Height, "No mint block generated.");
             *  Assert.AreEqual(1000, brk1mint.Balances["tether/TRX"].ToBalanceDecimal());
             * }
             *
             * // get minted token to owner wallet
             * await dexWallet.SyncAsync(null);
             * var getokret = await dexWallet.DexGetTokenAsync(dexbrk1.AccountID, 500m);
             * Assert.IsTrue(getokret.Successful(), "error get ext token to own wallet");
             * await Task.Delay(1500);
             * await dexWallet.SyncAsync(null);
             * Assert.AreEqual(500m, dexWallet.GetLastSyncBlock().Balances["tether/TRX"].ToBalanceDecimal(), "Ext token amount error");
             *
             * // put external token to dex wallet
             * var putokret = await dexWallet.DexPutTokenAsync(dexbrk1.AccountID, "tether/TRX", 500m);
             * Assert.IsTrue(putokret.Successful(), "Put token error");
             * await Task.Delay(1500);
             * var brk1lstret2 = await client.GetLastBlockAsync(dexbrk1.AccountID);
             * Assert.IsTrue(brk1lstret2.Successful());
             * var brk1lastblk = brk1lstret2.GetBlock() as TransactionBlock;
             * if (networkId == "xunit")
             * {
             *  Assert.AreEqual(1000m, brk1lastblk.Balances["tether/TRX"].ToBalanceDecimal(), "brk1 ext tok balance error");
             * }
             *
             * // withdraw token to external blockchain
             * var wdwret = await dexWallet.DexWithdrawTokenAsync(dexbrk1.AccountID, "Txxxxxxxxx", 1000m);
             * Assert.IsTrue(wdwret.Successful(), "Error withdraw");
             * await Task.Delay(1500);
             * var brk1lstret3 = await client.GetLastBlockAsync(dexbrk1.AccountID);
             * Assert.IsTrue(brk1lstret3.Successful());
             * var brk1lastblk3 = brk1lstret3.GetBlock() as TokenBurnBlock;
             * if (networkId == "xunit")
             *  Assert.AreEqual(0m, brk1lastblk3.Balances["tether/TRX"].ToBalanceDecimal(), "brk1 ext tok burn error");
             *
             */
        }