-module(gleeth@rpc@methods). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/gleeth/rpc/methods.gleam"). -export([get_block_number/1, get_balance/2, call_contract/3, get_code/2, get_storage_at/4, get_chain_id/1, send_raw_transaction/2, get_transaction_count/3, get_gas_price/1, get_max_priority_fee/1, get_block_by_number/2, get_block_by_hash/2, get_transaction/2, get_fee_history/4, get_transaction_receipt/2, parse_transaction_receipt/1, wait_for_receipt_with_timeout/3, wait_for_receipt/2, estimate_gas/5, get_logs/5]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC( " Ethereum JSON-RPC method wrappers.\n" "\n" " Each public function in this module corresponds to a standard Ethereum\n" " JSON-RPC method (e.g. `eth_blockNumber`, `eth_getBalance`). Functions\n" " accept a `Provider` as their first argument and return a typed `Result`\n" " with `GleethError` on failure.\n" ). -file("src/gleeth/rpc/methods.gleam", 27). ?DOC( " Get the latest block number by calling `eth_blockNumber`.\n" "\n" " Returns the block number as a hex-encoded string.\n" "\n" " ## Examples\n" "\n" " ```gleam\n" " let assert Ok(p) = provider.new(\"http://localhost:8545\")\n" " let assert Ok(block) = get_block_number(p)\n" " ```\n" ). -spec get_block_number(gleeth@provider:provider()) -> {ok, binary()} | {error, gleeth@rpc@types:gleeth_error()}. get_block_number(Provider) -> gleeth@rpc@response_utils:make_string_request_with_provider( Provider, eth_block_number, [] ). -file("src/gleeth/rpc/methods.gleam", 85). ?DOC( " Get the balance of an address by calling `eth_getBalance`.\n" "\n" " Queries at the `\"latest\"` block. Returns the balance in wei as a\n" " hex-encoded string.\n" "\n" " ## Examples\n" "\n" " ```gleam\n" " let assert Ok(p) = provider.new(\"http://localhost:8545\")\n" " let assert Ok(balance) = get_balance(p, \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\")\n" " ```\n" ). -spec get_balance(gleeth@provider:provider(), binary()) -> {ok, binary()} | {error, gleeth@rpc@types:gleeth_error()}. get_balance(Provider, Address) -> Params = [gleam@json:string(Address), gleam@json:string(<<"latest"/utf8>>)], gleeth@rpc@response_utils:make_string_request_with_provider( Provider, eth_get_balance, Params ). -file("src/gleeth/rpc/methods.gleam", 110). ?DOC( " Execute a read-only contract call by calling `eth_call`.\n" "\n" " Sends a call object with the given contract address and ABI-encoded\n" " calldata, evaluated at the `\"latest\"` block. Returns the hex-encoded\n" " return data.\n" "\n" " ## Examples\n" "\n" " ```gleam\n" " let assert Ok(p) = provider.new(\"http://localhost:8545\")\n" " let calldata = \"0x70a08231000000000000000000000000d8dA6BF26964aF9D7eEd9e03E53415D37aA96045\"\n" " let assert Ok(result) = call_contract(p, \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", calldata)\n" " ```\n" ). -spec call_contract(gleeth@provider:provider(), binary(), binary()) -> {ok, binary()} | {error, gleeth@rpc@types:gleeth_error()}. call_contract(Provider, Contract_address, Data) -> Call_object = gleam@json:object( [{<<"to"/utf8>>, gleam@json:string(Contract_address)}, {<<"data"/utf8>>, gleam@json:string(Data)}] ), Params = [Call_object, gleam@json:string(<<"latest"/utf8>>)], gleeth@rpc@response_utils:make_string_request_with_provider( Provider, eth_call, Params ). -file("src/gleeth/rpc/methods.gleam", 132). ?DOC( " Get the deployed bytecode at an address by calling `eth_getCode`.\n" "\n" " Returns `\"0x\"` for externally-owned accounts (EOAs).\n" ). -spec get_code(gleeth@provider:provider(), binary()) -> {ok, binary()} | {error, gleeth@rpc@types:gleeth_error()}. get_code(Provider, Address) -> Params = [gleam@json:string(Address), gleam@json:string(<<"latest"/utf8>>)], gleeth@rpc@response_utils:make_string_request_with_provider( Provider, eth_get_code, Params ). -file("src/gleeth/rpc/methods.gleam", 174). ?DOC( " Get the storage value at a specific slot in a contract by calling\n" " `eth_getStorageAt`.\n" "\n" " If `block` is an empty string it defaults to `\"latest\"`.\n" ). -spec get_storage_at(gleeth@provider:provider(), binary(), binary(), binary()) -> {ok, binary()} | {error, gleeth@rpc@types:gleeth_error()}. get_storage_at(Provider, Address, Slot, Block) -> Block_param = case Block of <<""/utf8>> -> <<"latest"/utf8>>; _ -> Block end, Params = [gleam@json:string(Address), gleam@json:string(Slot), gleam@json:string(Block_param)], gleeth@rpc@response_utils:make_string_request_with_provider( Provider, eth_get_storage_at, Params ). -file("src/gleeth/rpc/methods.gleam", 208). ?DOC( " Get the chain ID of the connected network by calling `eth_chainId`.\n" "\n" " Returns the chain ID as a hex-encoded string (e.g. `\"0x1\"` for mainnet).\n" "\n" " ## Examples\n" "\n" " ```gleam\n" " let assert Ok(p) = provider.new(\"http://localhost:8545\")\n" " let assert Ok(chain_id) = get_chain_id(p)\n" " ```\n" ). -spec get_chain_id(gleeth@provider:provider()) -> {ok, binary()} | {error, gleeth@rpc@types:gleeth_error()}. get_chain_id(Provider) -> gleeth@rpc@response_utils:make_string_request_with_provider( Provider, eth_chain_id, [] ). -file("src/gleeth/rpc/methods.gleam", 228). ?DOC( " Broadcast a signed raw transaction to the network by calling\n" " `eth_sendRawTransaction`.\n" "\n" " `raw_tx` should be the hex-encoded signed transaction (e.g. `\"0x02f873...\"`).\n" " Returns the transaction hash on success.\n" "\n" " ## Examples\n" "\n" " ```gleam\n" " let assert Ok(p) = provider.new(\"http://localhost:8545\")\n" " let assert Ok(tx_hash) = send_raw_transaction(p, \"0x02f873...\")\n" " ```\n" ). -spec send_raw_transaction(gleeth@provider:provider(), binary()) -> {ok, binary()} | {error, gleeth@rpc@types:gleeth_error()}. send_raw_transaction(Provider, Raw_tx) -> Params = [gleam@json:string(Raw_tx)], gleeth@rpc@response_utils:make_string_request_with_provider( Provider, eth_send_raw_transaction, Params ). -file("src/gleeth/rpc/methods.gleam", 245). ?DOC( " Get the transaction count (nonce) for an address by calling\n" " `eth_getTransactionCount`.\n" "\n" " If `block` is an empty string it defaults to `\"pending\"`, which gives the\n" " next usable nonce.\n" ). -spec get_transaction_count(gleeth@provider:provider(), binary(), binary()) -> {ok, binary()} | {error, gleeth@rpc@types:gleeth_error()}. get_transaction_count(Provider, Address, Block) -> Block_param = case Block of <<""/utf8>> -> <<"pending"/utf8>>; _ -> Block end, Params = [gleam@json:string(Address), gleam@json:string(Block_param)], gleeth@rpc@response_utils:make_string_request_with_provider( Provider, eth_get_transaction_count, Params ). -file("src/gleeth/rpc/methods.gleam", 265). ?DOC( " Get the current gas price in wei by calling `eth_gasPrice`.\n" "\n" " Primarily useful for legacy (pre-EIP-1559) transactions.\n" ). -spec get_gas_price(gleeth@provider:provider()) -> {ok, binary()} | {error, gleeth@rpc@types:gleeth_error()}. get_gas_price(Provider) -> gleeth@rpc@response_utils:make_string_request_with_provider( Provider, eth_gas_price, [] ). -file("src/gleeth/rpc/methods.gleam", 279). ?DOC( " Get the suggested max priority fee per gas by calling\n" " `eth_maxPriorityFeePerGas`.\n" "\n" " Used when building EIP-1559 (Type 2) transactions.\n" ). -spec get_max_priority_fee(gleeth@provider:provider()) -> {ok, binary()} | {error, gleeth@rpc@types:gleeth_error()}. get_max_priority_fee(Provider) -> gleeth@rpc@response_utils:make_string_request_with_provider( Provider, eth_max_priority_fee_per_gas, [] ). -file("src/gleeth/rpc/methods.gleam", 461). -spec nullable_string() -> gleam@dynamic@decode:decoder(binary()). nullable_string() -> gleam@dynamic@decode:one_of( {decoder, fun gleam@dynamic@decode:decode_string/1}, [gleam@dynamic@decode:success(<<""/utf8>>)] ). -file("src/gleeth/rpc/methods.gleam", 465). -spec block_decoder() -> gleam@dynamic@decode:decoder(gleeth@ethereum@types:block()). block_decoder() -> gleam@dynamic@decode:field( <<"number"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Number) -> gleam@dynamic@decode:field( <<"hash"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Hash) -> gleam@dynamic@decode:field( <<"parentHash"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Parent_hash) -> gleam@dynamic@decode:field( <<"timestamp"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Timestamp) -> gleam@dynamic@decode:field( <<"gasLimit"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Gas_limit) -> gleam@dynamic@decode:field( <<"gasUsed"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Gas_used) -> gleam@dynamic@decode:field( <<"transactions"/utf8>>, gleam@dynamic@decode:list( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Transactions) -> gleam@dynamic@decode:success( {block, Number, Hash, Parent_hash, Timestamp, Gas_limit, Gas_used, Transactions} ) end ) end ) end ) end ) end ) end ) end ). -file("src/gleeth/rpc/methods.gleam", 41). ?DOC( " Get a block by its number by calling `eth_getBlockByNumber`.\n" "\n" " `block` can be a hex block number or a tag like `\"latest\"`, `\"earliest\"`,\n" " `\"pending\"`. Returns the block with transaction hashes (not full objects).\n" ). -spec get_block_by_number(gleeth@provider:provider(), binary()) -> {ok, gleeth@ethereum@types:block()} | {error, gleeth@rpc@types:gleeth_error()}. get_block_by_number(Provider, Block) -> Block_param = case Block of <<""/utf8>> -> <<"latest"/utf8>>; _ -> Block end, Params = [gleam@json:string(Block_param), gleam@json:bool(false)], gleeth@rpc@response_utils:make_decoded_request_with_provider( Provider, eth_get_block_by_number, Params, block_decoder() ). -file("src/gleeth/rpc/methods.gleam", 61). ?DOC( " Get a block by its hash by calling `eth_getBlockByHash`.\n" "\n" " Returns the block with transaction hashes (not full objects).\n" ). -spec get_block_by_hash(gleeth@provider:provider(), binary()) -> {ok, gleeth@ethereum@types:block()} | {error, gleeth@rpc@types:gleeth_error()}. get_block_by_hash(Provider, Hash) -> Params = [gleam@json:string(Hash), gleam@json:bool(false)], gleeth@rpc@response_utils:make_decoded_request_with_provider( Provider, eth_get_block_by_hash, Params, block_decoder() ). -file("src/gleeth/rpc/methods.gleam", 484). -spec transaction_decoder() -> gleam@dynamic@decode:decoder(gleeth@ethereum@types:transaction()). transaction_decoder() -> gleam@dynamic@decode:field( <<"hash"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Hash) -> gleam@dynamic@decode:optional_field( <<"blockNumber"/utf8>>, <<""/utf8>>, nullable_string(), fun(Block_number) -> gleam@dynamic@decode:optional_field( <<"blockHash"/utf8>>, <<""/utf8>>, nullable_string(), fun(Block_hash) -> gleam@dynamic@decode:optional_field( <<"transactionIndex"/utf8>>, <<""/utf8>>, nullable_string(), fun(Transaction_index) -> gleam@dynamic@decode:field( <<"from"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(From) -> gleam@dynamic@decode:optional_field( <<"to"/utf8>>, <<""/utf8>>, nullable_string(), fun(To) -> gleam@dynamic@decode:field( <<"value"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Value) -> gleam@dynamic@decode:field( <<"gas"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Gas) -> gleam@dynamic@decode:optional_field( <<"gasPrice"/utf8>>, <<""/utf8>>, nullable_string( ), fun( Gas_price ) -> gleam@dynamic@decode:optional_field( <<"maxFeePerGas"/utf8>>, <<""/utf8>>, nullable_string( ), fun( Max_fee_per_gas ) -> gleam@dynamic@decode:optional_field( <<"maxPriorityFeePerGas"/utf8>>, <<""/utf8>>, nullable_string( ), fun( Max_priority_fee_per_gas ) -> gleam@dynamic@decode:field( <<"input"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun( Input ) -> gleam@dynamic@decode:field( <<"nonce"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun( Nonce ) -> gleam@dynamic@decode:optional_field( <<"type"/utf8>>, <<""/utf8>>, nullable_string( ), fun( Transaction_type ) -> gleam@dynamic@decode:optional_field( <<"chainId"/utf8>>, <<""/utf8>>, nullable_string( ), fun( Chain_id ) -> gleam@dynamic@decode:field( <<"v"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun( V ) -> gleam@dynamic@decode:field( <<"r"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun( R ) -> gleam@dynamic@decode:field( <<"s"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun( S ) -> gleam@dynamic@decode:success( {transaction, Hash, Block_number, Block_hash, Transaction_index, From, To, Value, Gas, Gas_price, Max_fee_per_gas, Max_priority_fee_per_gas, Input, Nonce, Transaction_type, Chain_id, V, R, S} ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ). -file("src/gleeth/rpc/methods.gleam", 329). ?DOC( " Get a transaction by its hash by calling `eth_getTransactionByHash`.\n" "\n" " Returns a fully decoded `Transaction` record.\n" "\n" " ## Examples\n" "\n" " ```gleam\n" " let assert Ok(p) = provider.new(\"http://localhost:8545\")\n" " let assert Ok(tx) = get_transaction(p, \"0xabc123...\")\n" " ```\n" ). -spec get_transaction(gleeth@provider:provider(), binary()) -> {ok, gleeth@ethereum@types:transaction()} | {error, gleeth@rpc@types:gleeth_error()}. get_transaction(Provider, Hash) -> Params = [gleam@json:string(Hash)], gleeth@rpc@response_utils:make_decoded_request_with_provider( Provider, eth_get_transaction_by_hash, Params, transaction_decoder() ). -file("src/gleeth/rpc/methods.gleam", 578). -spec log_decoder() -> gleam@dynamic@decode:decoder(gleeth@ethereum@types:log()). log_decoder() -> gleam@dynamic@decode:field( <<"address"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Address) -> gleam@dynamic@decode:field( <<"topics"/utf8>>, gleam@dynamic@decode:list(nullable_string()), fun(Topics) -> gleam@dynamic@decode:field( <<"data"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Data) -> gleam@dynamic@decode:field( <<"blockNumber"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Block_number) -> gleam@dynamic@decode:field( <<"transactionHash"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Transaction_hash) -> gleam@dynamic@decode:field( <<"transactionIndex"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Transaction_index) -> gleam@dynamic@decode:field( <<"blockHash"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Block_hash) -> gleam@dynamic@decode:field( <<"logIndex"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Log_index) -> gleam@dynamic@decode:field( <<"removed"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun( Removed ) -> gleam@dynamic@decode:success( {log, Address, Topics, Data, Block_number, Transaction_hash, Transaction_index, Block_hash, Log_index, Removed} ) end ) end ) end ) end ) end ) end ) end ) end ) end ). -file("src/gleeth/rpc/methods.gleam", 602). -spec fee_history_decoder() -> gleam@dynamic@decode:decoder(gleeth@ethereum@types:fee_history()). fee_history_decoder() -> gleam@dynamic@decode:field( <<"oldestBlock"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Oldest_block) -> gleam@dynamic@decode:field( <<"baseFeePerGas"/utf8>>, gleam@dynamic@decode:list( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Base_fee_per_gas) -> gleam@dynamic@decode:field( <<"gasUsedRatio"/utf8>>, gleam@dynamic@decode:list( {decoder, fun gleam@dynamic@decode:decode_float/1} ), fun(Gas_used_ratio) -> gleam@dynamic@decode:optional_field( <<"reward"/utf8>>, [], gleam@dynamic@decode:list( gleam@dynamic@decode:list( {decoder, fun gleam@dynamic@decode:decode_string/1} ) ), fun(Reward) -> gleam@dynamic@decode:success( {fee_history, Oldest_block, Base_fee_per_gas, Gas_used_ratio, Reward} ) end ) end ) end ) end ). -file("src/gleeth/rpc/methods.gleam", 296). ?DOC( " Get fee history for recent blocks by calling `eth_feeHistory`.\n" "\n" " - `block_count` - number of blocks to return (as a decimal integer)\n" " - `newest_block` - highest block (`\"latest\"`, `\"pending\"`, or a hex block\n" " number); defaults to `\"latest\"` when empty\n" " - `reward_percentiles` - percentiles of effective priority fees to include\n" " (e.g. `[25.0, 50.0, 75.0]`)\n" ). -spec get_fee_history( gleeth@provider:provider(), integer(), binary(), list(float()) ) -> {ok, gleeth@ethereum@types:fee_history()} | {error, gleeth@rpc@types:gleeth_error()}. get_fee_history(Provider, Block_count, Newest_block, Reward_percentiles) -> Newest = case Newest_block of <<""/utf8>> -> <<"latest"/utf8>>; _ -> Newest_block end, Params = [gleam@json:int(Block_count), gleam@json:string(Newest), gleam@json:array(Reward_percentiles, fun gleam@json:float/1)], gleeth@rpc@response_utils:make_decoded_request_with_provider( Provider, eth_fee_history, Params, fee_history_decoder() ). -file("src/gleeth/rpc/methods.gleam", 622). -spec status_decoder() -> gleam@dynamic@decode:decoder(gleeth@ethereum@types:transaction_status()). status_decoder() -> gleam@dynamic@decode:then( {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Status_str) -> case Status_str of <<"0x1"/utf8>> -> gleam@dynamic@decode:success(success); <<"0x01"/utf8>> -> gleam@dynamic@decode:success(success); <<"0x0"/utf8>> -> gleam@dynamic@decode:success(failed); <<"0x00"/utf8>> -> gleam@dynamic@decode:success(failed); _ -> gleam@dynamic@decode:failure( failed, <<"TransactionStatus"/utf8>> ) end end ). -file("src/gleeth/rpc/methods.gleam", 542). -spec transaction_receipt_decoder() -> gleam@dynamic@decode:decoder(gleeth@ethereum@types:transaction_receipt()). transaction_receipt_decoder() -> gleam@dynamic@decode:field( <<"transactionHash"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Transaction_hash) -> gleam@dynamic@decode:field( <<"transactionIndex"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Transaction_index) -> gleam@dynamic@decode:field( <<"blockHash"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Block_hash) -> gleam@dynamic@decode:field( <<"blockNumber"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Block_number) -> gleam@dynamic@decode:field( <<"from"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(From) -> gleam@dynamic@decode:optional_field( <<"to"/utf8>>, <<""/utf8>>, nullable_string(), fun(To) -> gleam@dynamic@decode:field( <<"cumulativeGasUsed"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Cumulative_gas_used) -> gleam@dynamic@decode:field( <<"gasUsed"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Gas_used) -> gleam@dynamic@decode:optional_field( <<"contractAddress"/utf8>>, <<""/utf8>>, nullable_string( ), fun( Contract_address ) -> gleam@dynamic@decode:field( <<"logs"/utf8>>, gleam@dynamic@decode:list( log_decoder( ) ), fun( Logs ) -> gleam@dynamic@decode:field( <<"logsBloom"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun( Logs_bloom ) -> gleam@dynamic@decode:field( <<"status"/utf8>>, status_decoder( ), fun( Status ) -> gleam@dynamic@decode:field( <<"effectiveGasPrice"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun( Effective_gas_price ) -> gleam@dynamic@decode:success( {transaction_receipt, Transaction_hash, Transaction_index, Block_hash, Block_number, From, To, Cumulative_gas_used, Gas_used, Contract_address, Logs, Logs_bloom, Status, Effective_gas_price} ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ). -file("src/gleeth/rpc/methods.gleam", 347). ?DOC( " Get a transaction receipt by its hash by calling\n" " `eth_getTransactionReceipt`.\n" "\n" " Returns a fully decoded `TransactionReceipt` record including logs and\n" " status.\n" ). -spec get_transaction_receipt(gleeth@provider:provider(), binary()) -> {ok, gleeth@ethereum@types:transaction_receipt()} | {error, gleeth@rpc@types:gleeth_error()}. get_transaction_receipt(Provider, Transaction_hash) -> Params = [gleam@json:string(Transaction_hash)], gleeth@rpc@response_utils:make_decoded_request_with_provider( Provider, eth_get_transaction_receipt, Params, transaction_receipt_decoder() ). -file("src/gleeth/rpc/methods.gleam", 364). ?DOC( " Parse a transaction receipt from a raw JSON-RPC response body.\n" "\n" " This is primarily intended for testing - it decodes the JSON string\n" " directly rather than making an RPC call.\n" ). -spec parse_transaction_receipt(binary()) -> {ok, gleeth@ethereum@types:transaction_receipt()} | {error, gleeth@rpc@types:gleeth_error()}. parse_transaction_receipt(Body) -> gleeth@rpc@response_utils:decode_rpc_response( Body, transaction_receipt_decoder() ). -file("src/gleeth/rpc/methods.gleam", 426). -spec poll_receipt( gleeth@provider:provider(), binary(), integer(), integer(), integer() ) -> {ok, gleeth@ethereum@types:transaction_receipt()} | {error, gleeth@rpc@types:gleeth_error()}. poll_receipt(Provider, Tx_hash, Timeout_ms, Elapsed_ms, Backoff_ms) -> case Elapsed_ms >= Timeout_ms of true -> {error, {parse_error, <<<<"Receipt not found within "/utf8, (erlang:integer_to_binary(Timeout_ms))/binary>>/binary, "ms"/utf8>>}}; false -> case get_transaction_receipt(Provider, Tx_hash) of {ok, Receipt} -> {ok, Receipt}; {error, _} -> gleam_erlang_ffi:sleep(Backoff_ms), Next_backoff = case Backoff_ms * 2 of Doubled when Doubled > 4000 -> 4000; Doubled@1 -> Doubled@1 end, poll_receipt( Provider, Tx_hash, Timeout_ms, Elapsed_ms + Backoff_ms, Next_backoff ) end end. -file("src/gleeth/rpc/methods.gleam", 418). ?DOC( " Poll for a transaction receipt with a custom timeout in milliseconds.\n" " Uses exponential backoff: 1s, 2s, 4s, 4s, 4s, ... (capped at 4s).\n" ). -spec wait_for_receipt_with_timeout( gleeth@provider:provider(), binary(), integer() ) -> {ok, gleeth@ethereum@types:transaction_receipt()} | {error, gleeth@rpc@types:gleeth_error()}. wait_for_receipt_with_timeout(Provider, Tx_hash, Timeout_ms) -> poll_receipt(Provider, Tx_hash, Timeout_ms, 0, 1000). -file("src/gleeth/rpc/methods.gleam", 409). ?DOC( " Poll for a transaction receipt with exponential backoff.\n" " Default timeout: 60 seconds. Backoff: 1s, 2s, 4s, 4s, 4s, ...\n" ). -spec wait_for_receipt(gleeth@provider:provider(), binary()) -> {ok, gleeth@ethereum@types:transaction_receipt()} | {error, gleeth@rpc@types:gleeth_error()}. wait_for_receipt(Provider, Tx_hash) -> wait_for_receipt_with_timeout(Provider, Tx_hash, 60000). -file("src/gleeth/rpc/methods.gleam", 632). -spec build_optional_params(list({binary(), binary()})) -> list({binary(), gleam@json:json()}). build_optional_params(Pairs) -> case Pairs of [] -> []; [{Key, Value} | Rest] -> case Value of <<""/utf8>> -> build_optional_params(Rest); _ -> [{Key, gleam@json:string(Value)} | build_optional_params(Rest)] end end. -file("src/gleeth/rpc/methods.gleam", 147). ?DOC( " Estimate the gas required for a transaction by calling `eth_estimateGas`.\n" "\n" " Any parameter may be an empty string to omit it from the call object.\n" ). -spec estimate_gas( gleeth@provider:provider(), binary(), binary(), binary(), binary() ) -> {ok, binary()} | {error, gleeth@rpc@types:gleeth_error()}. estimate_gas(Provider, From, To, Value, Data) -> Transaction_params = build_optional_params( [{<<"from"/utf8>>, From}, {<<"to"/utf8>>, To}, {<<"value"/utf8>>, Value}, {<<"data"/utf8>>, Data}] ), Transaction_object = gleam@json:object(Transaction_params), gleeth@rpc@response_utils:make_string_request_with_provider( Provider, eth_estimate_gas, [Transaction_object] ). -file("src/gleeth/rpc/methods.gleam", 645). -spec append_if_nonempty( list({binary(), gleam@json:json()}), binary(), binary() ) -> list({binary(), gleam@json:json()}). append_if_nonempty(Params, Key, Value) -> case Value of <<""/utf8>> -> Params; _ -> [{Key, gleam@json:string(Value)} | Params] end. -file("src/gleeth/rpc/methods.gleam", 656). -spec append_topics(list({binary(), gleam@json:json()}), list(binary())) -> list({binary(), gleam@json:json()}). append_topics(Params, Topics) -> case Topics of [] -> Params; _ -> [{<<"topics"/utf8>>, gleam@json:array(Topics, fun gleam@json:string/1)} | Params] end. -file("src/gleeth/rpc/methods.gleam", 374). ?DOC( " Get event logs matching a filter by calling `eth_getLogs`.\n" "\n" " `from_block` and `to_block` default to `\"latest\"` when empty. `address`\n" " and `topics` are omitted from the filter when empty.\n" ). -spec get_logs( gleeth@provider:provider(), binary(), binary(), binary(), list(binary()) ) -> {ok, list(gleeth@ethereum@types:log())} | {error, gleeth@rpc@types:gleeth_error()}. get_logs(Provider, From_block, To_block, Address, Topics) -> From_block_param = case From_block of <<""/utf8>> -> <<"latest"/utf8>>; _ -> From_block end, To_block_param = case To_block of <<""/utf8>> -> <<"latest"/utf8>>; _ -> To_block end, Filter_params = begin _pipe = [{<<"fromBlock"/utf8>>, gleam@json:string(From_block_param)}, {<<"toBlock"/utf8>>, gleam@json:string(To_block_param)}], _pipe@1 = append_if_nonempty(_pipe, <<"address"/utf8>>, Address), append_topics(_pipe@1, Topics) end, Filter_object = gleam@json:object(Filter_params), gleeth@rpc@response_utils:make_decoded_request_with_provider( Provider, eth_get_logs, [Filter_object], gleam@dynamic@decode:list(log_decoder()) ).