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; }
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(); }
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."); } }
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); } }
public bool IsPlatformSupported(SwapPlatformChain chain) { return(Settings.Oracle.SwapPlatforms.Any(x => x.Chain == chain && x.Enabled)); }