1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use std::cmp::min;
use types::transaction::{
AccessListTx, Action, EIP1559TransactionTx, SignedTransaction, Transaction, TypedTransaction,
TypedTxId,
};
use ethereum_types::U256;
use jsonrpc_core::{Error, ErrorCode};
use v1::helpers::CallRequest;
pub fn sign_call(request: CallRequest) -> Result<SignedTransaction, Error> {
let max_gas = U256::from(500_000_000);
let gas = min(request.gas.unwrap_or(max_gas), max_gas);
let from = request.from.unwrap_or_default();
let mut tx_legacy = Transaction {
nonce: request.nonce.unwrap_or_default(),
action: request.to.map_or(Action::Create, Action::Call),
gas,
gas_price: request.gas_price.unwrap_or_default(),
value: request.value.unwrap_or_default(),
data: request.data.unwrap_or_default(),
};
let tx_typed = match TypedTxId::from_U64_option_id(request.transaction_type) {
Some(TypedTxId::Legacy) => TypedTransaction::Legacy(tx_legacy),
Some(TypedTxId::AccessList) => {
if request.access_list.is_none() {
return Err(Error::new(ErrorCode::InvalidParams));
}
TypedTransaction::AccessList(AccessListTx::new(
tx_legacy,
request
.access_list
.unwrap_or_default()
.into_iter()
.map(Into::into)
.collect(),
))
}
Some(TypedTxId::EIP1559Transaction) => {
tx_legacy.gas_price = request.max_fee_per_gas.unwrap_or_default();
let transaction = AccessListTx::new(
tx_legacy,
request
.access_list
.unwrap_or_default()
.into_iter()
.map(Into::into)
.collect(),
);
TypedTransaction::EIP1559Transaction(EIP1559TransactionTx {
transaction,
max_priority_fee_per_gas: request.max_priority_fee_per_gas.unwrap_or_default(),
})
}
_ => return Err(Error::new(ErrorCode::InvalidParams)),
};
Ok(tx_typed.fake_sign(from))
}