示例#1
0
        public EthAPI(SwapPlatformChain chain, Blockchain.Nexus nexus, SpookSettings settings, Account account, Logger logger)
        {
            this.Chain     = chain;
            this.Nexus     = nexus;
            this._settings = settings;
            this._account  = account;
            this.Logger    = logger;

            var ethereumPlatform = this._settings.Oracle.SwapPlatforms.FirstOrDefault(x => x.Chain == chain);

            if (ethereumPlatform == null)
            {
                throw new SwapException($"Config file is missing swap settings for {chain} platform");
            }

            this.RPC_URLs = ethereumPlatform.RpcNodes;
            if (this.RPC_URLs.Length == 0)
            {
                throw new ArgumentNullException($"Need at least one RPC node in config for '{chain}' swap platform");
            }

            foreach (var url in this.RPC_URLs)
            {
                Console.WriteLine("add url: " + url);
                web3Clients.Add(new Web3(_account, url));
            }

            this.ChainId = GetWeb3Client().Eth.ChainId.SendRequestAsync().Result;
        }
示例#2
0
        private void InitSwapper(SwapPlatformChain platform, ChainSwapper swapper)
        {
            _swappers[platform] = swapper;

            var platformName = platform.ToString().ToLower();
            var platformInfo = Nexus.GetPlatformInfo(Nexus.RootStorage, platformName);

            SwapAddresses[platform] = platformInfo.InteropAddresses.Select(x => x.ExternalAddress).ToArray();
        }
示例#3
0
 public void ResyncBlockOnChain(SwapPlatformChain platform, string blockId)
 {
     if (_swappers.TryGetValue(platform, out ChainSwapper finder) &&
         System.Numerics.BigInteger.TryParse(blockId, out var bigIntBlock))
     {
         Logger.Message($"TokenSwapper: Resync block {blockId} on platform {platform}");
         finder.ResyncBlock(bigIntBlock);
     }
     else
     {
         Logger.Error($"TokenSwapper: Resync block {blockId} on platform {platform} failed.");
     }
 }
示例#4
0
        private Hash SettleSwapToExternal(Hash sourceHash, SwapPlatformChain destPlatform)
        {
            var swap      = OracleReader.ReadTransaction(DomainSettings.PlatformName, DomainSettings.RootChainName, sourceHash);
            var transfers = swap.Transfers.Where(x => x.destinationAddress.IsInterop).ToArray();

            // TODO not support yet
            if (transfers.Length != 1)
            {
                Logger.Warning($"Not implemented: Swap support for multiple transfers in a single transaction");
                return(Hash.Null);
            }

            var transfer = transfers[0];

            var token = Nexus.GetTokenInfo(Nexus.RootStorage, transfer.Symbol);

            lock (StateModificationLock)
            {
                var destHash = GetSettleHash(DomainSettings.PlatformName, sourceHash);
                Logger.Debug("settleHash in settleswap: " + destHash);

                if (destHash != Hash.Null)
                {
                    return(destHash);
                }

                if (!_swappers.ContainsKey(destPlatform))
                {
                    return(Hash.Null); // just in case, should never happen
                }

                var chainSwapper = _swappers[destPlatform];

                destHash = chainSwapper.SettleSwap(sourceHash, transfer.destinationAddress, token, transfer.Value);

                // if the asset transfer was sucessfull, we prepare a fee settlement on the mainnet
                if (destHash != Hash.Null)
                {
                    var pendingList = new StorageList(PendingTag, this.Storage);
                    var settle      = new PendingFee()
                    {
                        sourceHash = sourceHash, destinationHash = destHash, settleHash = Hash.Null, time = DateTime.UtcNow, status = SwapStatus.Settle
                    };
                    pendingList.Add <PendingFee>(settle);
                }

                return(destHash);
            }
        }
示例#5
0
 public bool IsPlatformSupported(SwapPlatformChain chain)
 {
     return(Settings.Oracle.SwapPlatforms.Any(x => x.Chain == chain && x.Enabled));
 }