start using the internal provider

This commit is contained in:
Bryan Stitt 2023-05-30 23:52:12 -07:00
parent d64761403b
commit b9f0824dfe
2 changed files with 44 additions and 31 deletions

View File

@ -8,7 +8,7 @@ use crate::rpcs::one::Web3Rpc;
use crate::stats::{AppStat, BackendRequests, RpcQueryStats}; use crate::stats::{AppStat, BackendRequests, RpcQueryStats};
use crate::user_token::UserBearerToken; use crate::user_token::UserBearerToken;
use anyhow::Context; use anyhow::Context;
use axum::headers::authorization::{self, Bearer}; use axum::headers::authorization::Bearer;
use axum::headers::{Header, Origin, Referer, UserAgent}; use axum::headers::{Header, Origin, Referer, UserAgent};
use chrono::Utc; use chrono::Utc;
use core::fmt; use core::fmt;

View File

@ -26,9 +26,11 @@ use migration::sea_orm::QueryFilter;
use serde_json::json; use serde_json::json;
use std::sync::Arc; use std::sync::Arc;
// TODO: do this in a build.rs so that the editor autocomplete and docs are better
abigen!( abigen!(
IERC20, IERC20,
r#"[ r#"[
decimals() -> uint256
event Transfer(address indexed from, address indexed to, uint256 value) event Transfer(address indexed from, address indexed to, uint256 value)
event Approval(address indexed owner, address indexed spender, uint256 value) event Approval(address indexed owner, address indexed spender, uint256 value)
]"#, ]"#,
@ -165,15 +167,22 @@ pub async fn user_balance_post(
return Ok(response); return Ok(response);
} }
// Iterate through all logs, and add them to the transaction list if there is any // get the transaction receipt
// Address will be hardcoded in the config let transaction_receipt: Option<TransactionReceipt> = app
let transaction_receipt: TransactionReceipt = app
.internal_request("eth_getTransactionReceipt", (tx_hash,)) .internal_request("eth_getTransactionReceipt", (tx_hash,))
.await?; .await?;
let transaction_receipt = if let Some(transaction_receipt) = transaction_receipt {
transaction_receipt
} else {
return Err(Web3ProxyError::BadRequest(
format!("transaction receipt not found for {}", tx_hash,).into(),
));
};
trace!("Transaction receipt: {:#?}", transaction_receipt); trace!("Transaction receipt: {:#?}", transaction_receipt);
// there is no need to check accepted tokens. the smart contract already reverts if the token isn't accepted // TODO: if the transaction doesn't have enough confirmations yet, add it to a queue to try again later
let payment_factory_address = app let payment_factory_address = app
.config .config
@ -183,44 +192,48 @@ pub async fn user_balance_post(
let payment_factory = let payment_factory =
PaymentFactory::new(payment_factory_address, app.internal_provider().clone()); PaymentFactory::new(payment_factory_address, app.internal_provider().clone());
// TODO: parse the log from the transaction receipt // there is no need to check accepted tokens. the smart contract already reverts if the token isn't accepted
// let deposit_log = payment_factory.payment_received_filter().topic; // let deposit_log = payment_factory.something?;
// // // TODO: do a quick check that this transaction contains the required log // // TODO: do a quick check that this transaction contains the required log
// if !transaction_receipt.logs_bloom.contains_input(deposit_log) { // if !transaction_receipt.logs_bloom.contains_input(deposit_log) {
// return Err(Web3ProxyError::BadRequest("no matching logs found".into())); // return Err(Web3ProxyError::BadRequest("no matching logs found".into()));
// } // }
// TODO: get the payment token address // parse the logs from the transaction receipt
// TODO: get the account the payment was received on behalf of (any account could have sent it) // there might be multiple logs with the event if the transaction is doing things in bulk
// TODO: change the indexes to be unique on (chain, txhash, log_index)
for log in transaction_receipt.logs {
if log.address != payment_factory_address {
continue;
}
// TODO: check the log topic matches our factory
// TODO: check the log send matches our factory
// TODO: get the decimals for the token let log_index = log
.log_index
.context("no log_index. transaction must not be confirmed")?;
// TODO: payment_factory.payment_address_to_account(...).call(); // TODO: get the payment token address out of the event
let payment_token_address = Address::zero();
// Go through all logs, this should prob capture it, // TODO: get the payment token amount out of the event (wei = the integer unit)
// At least according to this SE logs are just concatenations of the underlying types (like a struct..) let payment_token_wei = U256::zero();
// https://ethereum.stackexchange.com/questions/87653/how-to-decode-log-event-of-my-transaction-log
todo!("refactor this to use new helpers"); let payment_token = IERC20::new(payment_token_address, app.internal_provider().clone());
// TODO: get the account the payment was received on behalf of (any account could have sent it)
let on_behalf_of_address = Address::zero();
// get the decimals for the token
let payment_token_decimals = payment_token.decimals().call().await;
todo!("now what?");
}
todo!("now what?");
/* /*
let deposit_contract = match app.config.deposit_factory_contract {
Some(x) => Ok(x),
None => Err(Web3ProxyError::Anyhow(anyhow!(
"A deposit_contract must be provided in the config to parse payments"
))),
}?;
let deposit_topic = match app.config.deposit_topic {
Some(x) => Ok(x),
None => Err(Web3ProxyError::Anyhow(anyhow!(
"A deposit_topic must be provided in the config to parse payments"
))),
}?;
// Make sure there is only a single log within that transaction ...
// I don't know how to best cover the case that there might be multiple logs inside
for log in transaction_receipt.logs { for log in transaction_receipt.logs {
if log.address != deposit_contract { if log.address != deposit_contract {