Class: Mpp::Methods::Tempo::FeePayerClient

Inherits:
Object
  • Object
show all
Defined in:
lib/mpp/methods/tempo/fee_payer_client.rb

Overview

HTTP client for a hosted Tempo fee-payer JSON-RPC endpoint.

resolve accepts:

* a URL string (public / unauthenticated sponsor)
* a config hash (`url:` plus optional `headers:` as a Hash or per-request proc)
* any object that responds to `#cosign`

Constant Summary collapse

SIGN_METHOD =
"eth_signRawTransaction"
DEFAULT_TIMEOUT =
Rpc::DEFAULT_TIMEOUT

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(url, headers: nil) ⇒ FeePayerClient

Returns a new instance of FeePayerClient.

Raises:

  • (ArgumentError)


24
25
26
27
28
29
# File 'lib/mpp/methods/tempo/fee_payer_client.rb', line 24

def initialize(url, headers: nil)
  @base_url = Mpp::Http::Headers.normalize_base_url(url)
  raise ArgumentError, "fee_payer url is required" if @base_url.empty?

  @headers = headers
end

Instance Attribute Details

#base_urlObject (readonly)

Returns the value of attribute base_url.



22
23
24
# File 'lib/mpp/methods/tempo/fee_payer_client.rb', line 22

def base_url
  @base_url
end

Class Method Details

.duck_type?(fee_payer) ⇒ Boolean

Returns:

  • (Boolean)


62
63
64
# File 'lib/mpp/methods/tempo/fee_payer_client.rb', line 62

def self.duck_type?(fee_payer)
  !fee_payer.nil? && fee_payer.respond_to?(:cosign)
end

.from_config(config) ⇒ Object



47
48
49
50
51
# File 'lib/mpp/methods/tempo/fee_payer_client.rb', line 47

def self.from_config(config)
  cfg = Mpp::Http::Headers.symbolize(config)
  url = cfg[:url] || cfg[:base_url] || cfg[:baseUrl]
  new(url.to_s, headers: cfg[:headers])
end

.hosted_config?(fee_payer) ⇒ Boolean

Returns:

  • (Boolean)


53
54
55
56
57
58
59
60
# File 'lib/mpp/methods/tempo/fee_payer_client.rb', line 53

def self.hosted_config?(fee_payer)
  return true if fee_payer.is_a?(FeePayerClient)
  return true if fee_payer.is_a?(String)
  return true if fee_payer.is_a?(Hash)
  return true if duck_type?(fee_payer) && !fee_payer.respond_to?(:sign_hash)

  false
end

.resolve(fee_payer) ⇒ Object

Raises:

  • (ArgumentError)


38
39
40
41
42
43
44
45
# File 'lib/mpp/methods/tempo/fee_payer_client.rb', line 38

def self.resolve(fee_payer)
  return fee_payer if fee_payer.is_a?(FeePayerClient)
  return new(fee_payer) if fee_payer.is_a?(String) && !fee_payer.empty?
  return from_config(fee_payer) if fee_payer.is_a?(Hash)
  return fee_payer if duck_type?(fee_payer)

  raise ArgumentError, "fee_payer must be an Account, URL, {url:, headers:}, or an object that implements #cosign"
end

.resolve_optional(fee_payer) ⇒ Object



31
32
33
34
35
36
# File 'lib/mpp/methods/tempo/fee_payer_client.rb', line 31

def self.resolve_optional(fee_payer)
  return if fee_payer.nil? || fee_payer == false
  return fee_payer unless hosted_config?(fee_payer)

  resolve(fee_payer)
end

Instance Method Details

#cosign(raw_tx) ⇒ Object



66
67
68
69
70
71
72
73
# File 'lib/mpp/methods/tempo/fee_payer_client.rb', line 66

def cosign(raw_tx)
  result = post_rpc(SIGN_METHOD, [raw_tx])
  unless result.is_a?(String) && !result.empty?
    raise Mpp::VerificationFailedError.new(reason: "Fee payer returned no signed transaction")
  end

  result
end