1

Uniswap ペア コントラクト Sync イベントにサブスクライブして、ペア リザーブを取得する必要があります。だからここで私がやろうとしたこと:

[Event("Sync")]
class PairSyncEventDTO : IEventDTO
{
    [Parameter("uint112", "reserve0")]
    public virtual BigInteger Reserve0 { get; set; }

    [Parameter("uint112", "reserve1", 2)]
    public virtual BigInteger Reserve1 { get; set; }
}

public async Task Start()
{
    readonly string uniSwapFactoryAddress = "0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f";
    
    string uniSwapFactoryAbi = GetAbi(Resources.IUniswapV2Factory);
    string uniSwapPairAbi    = GetAbi(Resources.IUniswapV2Pair);
    
    var      web3                   = new Web3("https://mainnet.infura.io/v3/fff");
    Contract uniSwapFactoryContract = web3.Eth.GetContract(uniSwapFactoryAbi, uniSwapFactoryAddress);
    Function uniSwapGetPairFunction = uniSwapFactoryContract.GetFunction("getPair");
    
    string daiAddress          = "0x6b175474e89094c44da98b954eedeac495271d0f";
    string wethAddress         = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2";
    string pairContractAddress = await uniSwapGetPairFunction.CallAsync<string>(wethAddress, daiAddress);
    
    Contract pairContract = web3.Eth.GetContract(uniSwapPairAbi, pairContractAddress);
    
    Event          pairSyncEvent  = pairContract.GetEvent("Sync");
    NewFilterInput pairSyncFilter = pairSyncEvent.EventABI.CreateFilterInput();
    
    using (var client = new StreamingWebSocketClient("wss://mainnet.infura.io/ws/v3/fff"))
    {
        var subscription = new EthLogsObservableSubscription(client);
        subscription.GetSubscriptionDataResponsesAsObservable().
                     Subscribe(log =>
                               {
                                   try
                                   {
                                       EventLog<PairSyncEventDTO> decoded = Event<PairSyncEventDTO>.DecodeEvent(log);
                                       if (decoded != null)
                                       {
                                           decimal reserve0 = Web3.Convert.FromWei(decoded.Event.Reserve0);
                                           decimal reserve1 = Web3.Convert.FromWei(decoded.Event.Reserve1);
                                           Console.WriteLine($@"Price={reserve0 / reserve1}");
                                       }
                                       else Console.WriteLine(@"Found not standard transfer log");
                                   }
                                   catch (Exception ex)
                                   {
                                       Console.WriteLine(@"Log Address: " + log.Address + @" is not a standard transfer log:", ex.Message);
                                   }
                               });
    
        await client.StartAsync();
        await subscription.SubscribeAsync(pairSyncFilter);
    }
}

string GetAbi(byte[] storedContractJson)
{
    string  json           = Encoding.UTF8.GetString(storedContractJson);
    JObject contractObject = JObject.Parse(json);

    if (!contractObject.TryGetValue("abi", out JToken abiJson)) throw new KeyNotFoundException("abi object was not found in stored contract json");
    return abiJson.ToString();
}

サブスクライブしているように見えますが、Subscribeラムダに入ることはありません。await subscription.SubscribeAsync();また、フィルターなしで実行しようとすると、Subscribeラムダにも入りません。ただし、実行後、SubscribeAsyncCPU はプロセスによって大幅に負荷がかかります。

  1. 私は何を間違っていますか?Subscribeラムダが呼び出されないのはなぜですか?
  2. なぜCPUに負荷がかかるのですか?
4

1 に答える 1