erpc-sdk 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,207 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "generated/dex_catalog"
4
+ require_relative "token_catalog"
5
+
6
+ module ERPC
7
+ # Canonical CAIP-2 chain identifiers used by the bundled DEX catalog.
8
+ module DexChainIDs
9
+ ETHEREUM_MAINNET = DexCatalogData::DEX_CHAIN_IDS.fetch(:ethereum)
10
+ SOLANA_MAINNET = DexCatalogData::DEX_CHAIN_IDS.fetch(:solana)
11
+ AVALANCHE_C_MAINNET = DexCatalogData::DEX_CHAIN_IDS.fetch(:avalanche_c)
12
+ end
13
+
14
+ # Offline access to the generated DEX, pool, and native-wrap catalog.
15
+ #
16
+ # The generated records are deeply frozen scalar/hash values. Lookups return
17
+ # those immutable records directly, so a caller cannot alter a later lookup
18
+ # or quote by mutating a previous result.
19
+ module DexCatalog
20
+ DEX_CATALOG_VERSION = DexCatalogData::DEX_CATALOG_VERSION
21
+ DEX_CATALOG_AS_OF_DATE = DexCatalogData::DEX_CATALOG_AS_OF_DATE
22
+ DEX_CATALOG_CONTENT_DIGEST = DexCatalogData::DEX_CATALOG_CONTENT_DIGEST
23
+ AS_OF_DATE = DEX_CATALOG_AS_OF_DATE
24
+ CONTENT_DIGEST = DEX_CATALOG_CONTENT_DIGEST
25
+
26
+ DEX_CHAIN_IDS = DexCatalogData::DEX_CHAIN_IDS
27
+ DEX_DEPLOYMENTS = DexCatalogData::DEX_DEPLOYMENTS
28
+ POOL_DEFINITIONS = DexCatalogData::POOL_DEFINITIONS
29
+ NATIVE_WRAP_DEFINITIONS = DexCatalogData::NATIVE_WRAP_DEFINITIONS
30
+ DEX_ALIASES = DexCatalogData::DEX_ALIASES
31
+
32
+ # Generated namespace modules contain the opaque IDs used by callers.
33
+ DEXES = Dexes
34
+ POOLS = Pools
35
+
36
+ EMPTY_POOLS = [].freeze
37
+
38
+ DEXES_BY_ID = DEX_DEPLOYMENTS.each_with_object({}) do |deployment, index|
39
+ index[deployment.fetch(:dex_deployment_id)] = deployment
40
+ end.freeze
41
+
42
+ POOLS_BY_ID = POOL_DEFINITIONS.each_with_object({}) do |pool, index|
43
+ index[pool.fetch(:pool_definition_id)] = pool
44
+ end.freeze
45
+
46
+ WRAPS_BY_NATIVE_ID = NATIVE_WRAP_DEFINITIONS.each_with_object({}) do |definition, index|
47
+ index[definition.fetch(:native_token_deployment_id)] = definition
48
+ end.freeze
49
+
50
+ KNOWN_CHAIN_IDS = [
51
+ DexChainIDs::ETHEREUM_MAINNET,
52
+ DexChainIDs::SOLANA_MAINNET,
53
+ DexChainIDs::AVALANCHE_C_MAINNET
54
+ ].freeze
55
+
56
+ EVM_CHAIN_IDS = [
57
+ DexChainIDs::ETHEREUM_MAINNET,
58
+ DexChainIDs::AVALANCHE_C_MAINNET
59
+ ].freeze
60
+
61
+ class << self
62
+ # Return the generated DEX namespace module for ergonomic alias access.
63
+ def dexes
64
+ Dexes
65
+ end
66
+
67
+ # Return the generated pool namespace module for ergonomic alias access.
68
+ def pools
69
+ Pools
70
+ end
71
+
72
+ # Return a DEX deployment by its exact opaque ID.
73
+ def get_dex_deployment(dex_deployment_id)
74
+ return nil unless dex_deployment_id.is_a?(String) && !dex_deployment_id.empty?
75
+
76
+ DEXES_BY_ID[dex_deployment_id]
77
+ end
78
+
79
+ # Return a pool definition by its exact opaque ID.
80
+ def get_pool_definition(pool_definition_id)
81
+ return nil unless pool_definition_id.is_a?(String) && !pool_definition_id.empty?
82
+
83
+ POOLS_BY_ID[pool_definition_id]
84
+ end
85
+
86
+ # Find a pool by chain-qualified address.
87
+ # EVM addresses are strict hexadecimal and matched case-insensitively;
88
+ # Solana addresses are matched exactly as their canonical base58 text.
89
+ def find_pool_definition_by_address(chain_id, address)
90
+ return nil unless known_chain_id?(chain_id)
91
+ return nil unless address.is_a?(String) && !address.empty?
92
+
93
+ normalized = address
94
+ if evm_chain_id?(chain_id)
95
+ return nil unless valid_evm_address?(address)
96
+
97
+ normalized = address.downcase
98
+ return nil if zero_evm_address?(normalized)
99
+ end
100
+
101
+ POOL_DEFINITIONS.find do |pool|
102
+ pool.fetch(:chain_id) == chain_id && pool.fetch(:address) == normalized
103
+ end
104
+ end
105
+
106
+ # Find all pools for an unordered token pair in stable pool-ID order.
107
+ def find_pool_definitions_by_pair(chain_id, token_a_deployment_id, token_b_deployment_id)
108
+ return EMPTY_POOLS unless known_chain_id?(chain_id)
109
+ return EMPTY_POOLS unless token_a_deployment_id.is_a?(String) && token_b_deployment_id.is_a?(String)
110
+ return EMPTY_POOLS if token_a_deployment_id.empty? || token_b_deployment_id.empty?
111
+ return EMPTY_POOLS if token_a_deployment_id == token_b_deployment_id
112
+
113
+ wanted = [token_a_deployment_id, token_b_deployment_id].sort
114
+ matches = POOL_DEFINITIONS.select do |pool|
115
+ actual = [pool.fetch(:token0_deployment_id), pool.fetch(:token1_deployment_id)].sort
116
+ pool.fetch(:chain_id) == chain_id && actual == wanted
117
+ end.sort_by { |pool| pool.fetch(:pool_definition_id) }
118
+ matches.empty? ? EMPTY_POOLS : matches.freeze
119
+ end
120
+
121
+ # List pools using the optional chainId/tokenDeploymentId/adapterKind
122
+ # filters. Ruby callers may use either the contract's camelCase keys or
123
+ # idiomatic snake_case keyword keys.
124
+ def list_pool_definitions(options = nil, **keyword_options)
125
+ if options.nil?
126
+ options = keyword_options
127
+ elsif !keyword_options.empty?
128
+ return EMPTY_POOLS
129
+ end
130
+ return EMPTY_POOLS unless options.is_a?(Hash)
131
+
132
+ normalized = normalize_filter_keys(options)
133
+ return EMPTY_POOLS unless normalized
134
+
135
+ chain_id = normalized[:chain_id]
136
+ token_deployment_id = normalized[:token_deployment_id]
137
+ adapter_kind = normalized[:adapter_kind]
138
+ return EMPTY_POOLS if chain_id && !known_chain_id?(chain_id)
139
+ return EMPTY_POOLS if token_deployment_id &&
140
+ (!token_deployment_id.is_a?(String) || token_deployment_id.empty?)
141
+ return EMPTY_POOLS if adapter_kind &&
142
+ (!adapter_kind.is_a?(String) || adapter_kind.empty?)
143
+
144
+ matches = POOL_DEFINITIONS.select do |pool|
145
+ (chain_id.nil? || pool.fetch(:chain_id) == chain_id) &&
146
+ (token_deployment_id.nil? ||
147
+ pool.fetch(:token0_deployment_id) == token_deployment_id ||
148
+ pool.fetch(:token1_deployment_id) == token_deployment_id) &&
149
+ (adapter_kind.nil? || pool.fetch(:adapter).fetch(:kind) == adapter_kind)
150
+ end.sort_by { |pool| pool.fetch(:pool_definition_id) }
151
+ matches.empty? ? EMPTY_POOLS : matches.freeze
152
+ end
153
+
154
+ # Return the chain-bound native-to-wrapped relationship for an opaque
155
+ # native token deployment ID. A wrap definition ID is not accepted.
156
+ def get_native_wrap_definition(native_token_deployment_id)
157
+ return nil unless native_token_deployment_id.is_a?(String) && !native_token_deployment_id.empty?
158
+
159
+ WRAPS_BY_NATIVE_ID[native_token_deployment_id]
160
+ end
161
+
162
+ private
163
+
164
+ def normalize_filter_keys(options)
165
+ aliases = {
166
+ "chainId" => :chain_id,
167
+ :chainId => :chain_id,
168
+ "chain_id" => :chain_id,
169
+ :chain_id => :chain_id,
170
+ "tokenDeploymentId" => :token_deployment_id,
171
+ :tokenDeploymentId => :token_deployment_id,
172
+ "token_deployment_id" => :token_deployment_id,
173
+ :token_deployment_id => :token_deployment_id,
174
+ "adapterKind" => :adapter_kind,
175
+ :adapterKind => :adapter_kind,
176
+ "adapter_kind" => :adapter_kind,
177
+ :adapter_kind => :adapter_kind
178
+ }
179
+ result = {}
180
+ options.each do |key, value|
181
+ target = aliases[key]
182
+ return nil unless target
183
+ return nil if result.key?(target)
184
+
185
+ result[target] = value
186
+ end
187
+ result
188
+ end
189
+
190
+ def known_chain_id?(chain_id)
191
+ chain_id.is_a?(String) && KNOWN_CHAIN_IDS.include?(chain_id)
192
+ end
193
+
194
+ def evm_chain_id?(chain_id)
195
+ EVM_CHAIN_IDS.include?(chain_id)
196
+ end
197
+
198
+ def valid_evm_address?(address)
199
+ address.match?(/\A0x[0-9A-Fa-f]{40}\z/)
200
+ end
201
+
202
+ def zero_evm_address?(address)
203
+ address == "0x#{'0' * 40}"
204
+ end
205
+ end
206
+ end
207
+ end
@@ -1,11 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "uri"
4
+ require "base64"
4
5
 
5
6
  module ERPC
6
7
  class Error < StandardError; end
7
8
 
8
9
  class ConfigError < Error; end
10
+ class NotConfiguredError < Error
11
+ attr_reader :namespace
12
+
13
+ def initialize(namespace)
14
+ @namespace = namespace.to_s.freeze
15
+ super("ERPC namespace #{@namespace.inspect} is not configured")
16
+ end
17
+ end
9
18
  class BatchPolicyError < Error; end
10
19
  class InvalidResponseError < Error; end
11
20
  class TransportError < Error; end
@@ -41,21 +50,30 @@ module ERPC
41
50
  module Redaction
42
51
  module_function
43
52
 
53
+ PERCENT_ESCAPE = /%[0-9A-Fa-f]{2}/.freeze
54
+
44
55
  def text(value, credential)
45
56
  result = value.to_s
46
- variants(credential).each { |secret| result = result.gsub(secret, "[REDACTED]") unless secret.empty? }
57
+ variants(credential).each do |secret|
58
+ result = result.gsub(secret, "[REDACTED]") unless secret.empty?
59
+ next unless secret.match?(PERCENT_ESCAPE)
60
+
61
+ result = result.gsub(percent_escape_pattern(secret), "[REDACTED]")
62
+ end
47
63
  result
48
64
  end
49
65
 
50
- def value(value, credential)
66
+ def value(value, credential, depth = 0)
67
+ return "[REDACTED]" if depth >= 32
68
+
51
69
  case value
52
70
  when String
53
71
  text(value, credential)
54
72
  when Array
55
- value.map { |item| self.value(item, credential) }
73
+ value.map { |item| self.value(item, credential, depth + 1) }
56
74
  when Hash
57
75
  value.to_h do |key, item|
58
- [text(key, credential), self.value(item, credential)]
76
+ [key.is_a?(String) ? text(key, credential) : key, self.value(item, credential, depth + 1)]
59
77
  end
60
78
  else
61
79
  value
@@ -63,12 +81,85 @@ module ERPC
63
81
  end
64
82
 
65
83
  def variants(credential)
66
- percent_encoded = credential.to_s.b.each_byte.map do |byte|
67
- character = byte.chr
68
- character.match?(/[A-Za-z0-9_.~-]/) ? character : format("%%%02X", byte)
69
- end.join
70
- [credential.to_s, URI.encode_www_form_component(credential.to_s), percent_encoded].uniq
84
+ values = credential.is_a?(Array) ? credential : [credential]
85
+ encoded = values.flat_map do |value|
86
+ next [] if value.nil? || value.to_s.empty?
87
+
88
+ text = value.to_s
89
+ percent_encoded = text.b.each_byte.map do |byte|
90
+ character = byte.chr
91
+ character.match?(/[A-Za-z0-9_.~-]/) ? character : format("%%%02X", byte)
92
+ end.join
93
+ [
94
+ text,
95
+ URI.encode_www_form_component(text),
96
+ percent_encoded
97
+ ]
98
+ end
99
+ encoded.uniq.sort_by { |value| [-value.length, value] }
71
100
  end
72
101
  private_class_method :variants
102
+
103
+ def percent_escape_pattern(value)
104
+ escaped = Regexp.escape(value.to_s)
105
+ pattern = escaped.gsub(PERCENT_ESCAPE) do |escape|
106
+ "%#{percent_character_class(escape[1])}#{percent_character_class(escape[2])}"
107
+ end
108
+ Regexp.new(pattern)
109
+ end
110
+ private_class_method :percent_escape_pattern
111
+
112
+ def percent_character_class(value)
113
+ "[#{[value.upcase, value.downcase].uniq.join}]"
114
+ end
115
+ private_class_method :percent_character_class
116
+
117
+ def direct_variants(http_url:, websocket_url: nil, headers: {})
118
+ values = []
119
+ [http_url, websocket_url].compact.each do |endpoint|
120
+ query = URI.parse(endpoint).query.to_s
121
+ query.split("&").each do |component|
122
+ next if component.empty?
123
+
124
+ raw_value = component.include?("=") ? component.split("=", 2).last : component
125
+ next if raw_value.empty?
126
+
127
+ values << raw_value
128
+ begin
129
+ values << URI.decode_www_form_component(raw_value)
130
+ rescue ArgumentError
131
+ # The endpoint validator rejects invalid percent escapes. Keep
132
+ # the raw value as a defensive fallback for caller-built objects.
133
+ end
134
+ end
135
+ end
136
+
137
+ headers.each do |name, value|
138
+ next unless value.is_a?(String) && !value.empty?
139
+
140
+ values << value
141
+ next unless %w[authorization proxy-authorization].include?(name.to_s.downcase)
142
+
143
+ parts = value.strip.split(/\s+/, 2)
144
+ next unless parts.length == 2 && %w[bearer basic].include?(parts.first.downcase)
145
+
146
+ credential = parts.last
147
+ values << credential
148
+ next unless parts.first.casecmp?("basic")
149
+
150
+ begin
151
+ decoded = Base64.strict_decode64(credential).force_encoding(Encoding::UTF_8)
152
+ values << decoded
153
+ if decoded.include?(":")
154
+ username, password = decoded.split(":", 2)
155
+ values << username << password
156
+ end
157
+ rescue ArgumentError, EncodingError
158
+ # Raw and encoded forms above still cover malformed Basic values.
159
+ end
160
+ end
161
+
162
+ variants(values)
163
+ end
73
164
  end
74
165
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Generated by registry/generate-bridge-capabilities.mjs. Do not edit.
4
+
5
+ module ERPC
6
+ BRIDGE_CAPABILITIES_JSON = '[{"bridgeCapabilityId":"bridge-mayan-swift-v2-eurc-eth-sol","providerId":"mayan-swift-v2","capabilityKind":"external-provider-dynamic","sourceChainId":"eip155:1","destinationChainId":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","sourceTokenDeploymentId":"deployment-0011","destinationTokenDeploymentId":"deployment-0013","sourceTokenAddress":"0x1abaea1f7c830bd89acc67ec4af516284b1bc33c","destinationTokenAddress":"HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr","sourceTokenStandard":"erc20","destinationTokenStandard":"spl-token","sourceTokenDecimals":6,"destinationTokenDecimals":6,"sourceProviderChainName":"ethereum","destinationProviderChainName":"solana","sourceProviderChainId":1,"destinationProviderChainId":0,"sourceWormholeChainId":2,"destinationWormholeChainId":1,"sourceUsdcDeploymentId":"deployment-0008","sourceUsdcAddress":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","sourceUsdcStandard":"erc20","sourceUsdcDecimals":6,"swiftContract":"0x40ffe85a28dc9993541449464d7529a922142960","forwarderAddress":"0x337685fdab40d39bd02028545a4ffa7d287cc3e2","forwarderFunctionSelector":"0x30dedc57","jupiterProgramAddress":null,"builderEndpoint":"https://tx-builder.mayan.finance","explorerEndpoint":"https://explorer-api.mayan.finance/v3","dependencies":["mayan-hosted-quote-api","mayan-hosted-transaction-builder","mayan-hosted-source-swap-builder","swift-auction-solvers","relayers","wormhole-guardian-messaging","mayan-explorer-indexer"],"status":"active"},{"bridgeCapabilityId":"bridge-mayan-swift-v2-eurc-sol-eth","providerId":"mayan-swift-v2","capabilityKind":"external-provider-dynamic","sourceChainId":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","destinationChainId":"eip155:1","sourceTokenDeploymentId":"deployment-0013","destinationTokenDeploymentId":"deployment-0011","sourceTokenAddress":"HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr","destinationTokenAddress":"0x1abaea1f7c830bd89acc67ec4af516284b1bc33c","sourceTokenStandard":"spl-token","destinationTokenStandard":"erc20","sourceTokenDecimals":6,"destinationTokenDecimals":6,"sourceProviderChainName":"solana","destinationProviderChainName":"ethereum","sourceProviderChainId":0,"destinationProviderChainId":1,"sourceWormholeChainId":1,"destinationWormholeChainId":2,"sourceUsdcDeploymentId":"deployment-0010","sourceUsdcAddress":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","sourceUsdcStandard":"spl-token","sourceUsdcDecimals":6,"swiftContract":"mayan34VedncxdK2XobtvWFDXQASUTBXhUVzt2kKgny","forwarderAddress":null,"forwarderFunctionSelector":null,"jupiterProgramAddress":"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4","builderEndpoint":"https://tx-builder.mayan.finance","explorerEndpoint":"https://explorer-api.mayan.finance/v3","dependencies":["mayan-hosted-quote-api","mayan-hosted-transaction-builder","mayan-hosted-source-swap-builder","swift-auction-solvers","relayers","wormhole-guardian-messaging","mayan-explorer-indexer","jupiter-v6-source-swap"],"status":"active"}]'.freeze
7
+ BRIDGE_CAPABILITIES_CONTENT_DIGEST = 'fe698f99218057f8cb40b3e24421d1d78e4e2cd7508cf6e3eb2457b329e5141b'.freeze
8
+ BRIDGE_CAPABILITIES_AS_OF_DATE = '2026-09-16'.freeze
9
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Generated by registry/generate-dex-catalog.mjs. Do not edit.
4
+
5
+ module ERPC
6
+ module Dexes
7
+ Ethereum = { :UNISWAP_V2 => 'dex-deployment-0001' }.freeze
8
+ Solana = { :ORCA_WHIRLPOOLS => 'dex-deployment-0003', :RAYDIUM_CLMM => 'dex-deployment-0004' }.freeze
9
+ AvalancheC = { :LFJ_LEGACY => 'dex-deployment-0002' }.freeze
10
+ end
11
+
12
+ module Pools
13
+ Ethereum = { :DISCOVERED_POOL_1B98A5F24A364E05 => 'discovered-pool-1b98a5f24a364e05b3d56a9702c3560fc3a71f84b2195c486cfc5f8a956cc0b7', :DISCOVERED_POOL_6428A1E5DA293B2E => 'discovered-pool-6428a1e5da293b2ef62027ec823ba27532219a40784def3930feee56a623b809', :DISCOVERED_POOL_866F890448D13C07 => 'discovered-pool-866f890448d13c078e217a894ebd47430da5941fe5bff7e382fc095916b4614d', :DISCOVERED_POOL_90805F8995C1D0B8 => 'discovered-pool-90805f8995c1d0b85a45fcd4587928a00066b1f14407baee4e8ed1b634c07804', :DISCOVERED_POOL_A7F9E600A86951F4 => 'discovered-pool-a7f9e600a86951f40472ff779fae467db8a6bbbc6076356058f427e97d4ae429', :DISCOVERED_POOL_B8F972F8BAE36C82 => 'discovered-pool-b8f972f8bae36c82b51ed2aeed070d3ef3e7642e2a708c7d3c0c134e6e1946ed', :DISCOVERED_POOL_E702B0CB56528418 => 'discovered-pool-e702b0cb56528418b4ce089dfc001c6241c94e92aabde72f1a340c4601541780', :UNISWAP_V2_USDC_WETH => 'pool-0001' }.freeze
14
+ Solana = { :ORCA_WHIRLPOOLS_WSOL_EURC => 'pool-0003', :RAYDIUM_CLMM_WSOL_EURC => 'pool-0004' }.freeze
15
+ AvalancheC = { :DISCOVERED_POOL_1568E761C62F7DC5 => 'discovered-pool-1568e761c62f7dc58207a77f2dc32153805efe03a8d9cce9366ce68efdf276c4', :DISCOVERED_POOL_3C1E38D02092D16E => 'discovered-pool-3c1e38d02092d16e396d2f3a22b2bfae55246a1c566831d31f211670e45bd562', :DISCOVERED_POOL_3F840A40991E755E => 'discovered-pool-3f840a40991e755e42d242188bd8deb85cd5b9655308269b00c220f5237710cf', :DISCOVERED_POOL_5D7AA6A767A0C6EA => 'discovered-pool-5d7aa6a767a0c6ea9ddeb06d1289bd12d85018935d5b25724b165dc8b9832252', :DISCOVERED_POOL_9E4ED76F76904A4A => 'discovered-pool-9e4ed76f76904a4ae271946bb1a4b2dc7428e343040b05a42707071bbfac9462', :DISCOVERED_POOL_A2480F3D4EA5CE12 => 'discovered-pool-a2480f3d4ea5ce12252126acf64b174b9fe678b0f0fda8936a12fef180ae08cd', :DISCOVERED_POOL_ECE9088CF3894443 => 'discovered-pool-ece9088cf38944438897ff9fb2a1abc6855a687b5a3f0d6ab98dfe06c1a6dfef', :DISCOVERED_POOL_FB02E85806CD9079 => 'discovered-pool-fb02e85806cd907920126af935137b0775a858ddf04a28d7ca144f761fd7579e', :LFJ_LEGACY_WAVAX_USDC => 'pool-0002' }.freeze
16
+ end
17
+
18
+ module DexCatalogData
19
+ DEX_CATALOG_VERSION = '1.0.0'
20
+ DEX_CATALOG_AS_OF_DATE = '2026-09-15'
21
+ DEX_CATALOG_CONTENT_DIGEST = 'caccde1f997648dfa045af41d4f8b7f93a051c59d098cc770bd3a2757185aac1'
22
+ DEX_CHAIN_IDS = { ethereum: 'eip155:1', solana: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', avalanche_c: 'eip155:43114' }.freeze
23
+ DEX_DEPLOYMENTS = [{ dex_deployment_id: 'dex-deployment-0001', protocol_id: 'uniswap-v2', name: 'Uniswap V2', chain_id: 'eip155:1', program_address: '0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f', adapter_kind: 'evm-constant-product-v2', status: 'active', replaced_by_dex_deployment_id: nil }.freeze, { dex_deployment_id: 'dex-deployment-0002', protocol_id: 'lfj-legacy-constant-product', name: 'LFJ legacy constant-product (Joe V1)', chain_id: 'eip155:43114', program_address: '0x9ad6c38be94206ca50bb0d90783181662f0cfa10', adapter_kind: 'evm-constant-product-v2', status: 'active', replaced_by_dex_deployment_id: nil }.freeze, { dex_deployment_id: 'dex-deployment-0003', protocol_id: 'orca-whirlpools', name: 'Orca Whirlpools', chain_id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', program_address: 'whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc', adapter_kind: 'solana-orca-whirlpool', status: 'active', replaced_by_dex_deployment_id: nil }.freeze, { dex_deployment_id: 'dex-deployment-0004', protocol_id: 'raydium-clmm', name: 'Raydium CLMM', chain_id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', program_address: 'CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK', adapter_kind: 'solana-raydium-clmm', status: 'active', replaced_by_dex_deployment_id: nil }.freeze].freeze
24
+ POOL_DEFINITIONS = [{ pool_definition_id: 'discovered-pool-1568e761c62f7dc58207a77f2dc32153805efe03a8d9cce9366ce68efdf276c4', dex_deployment_id: 'dex-deployment-0002', chain_id: 'eip155:43114', address: '0xd5a37dc5c9a396a03dd1136fc76a1a02b1c88ffa', token0_deployment_id: 'discovered-token-9f9965cc065c9becf8d2cb58071524baafea37d27fda9bf683a93ea85f2e653d', token1_deployment_id: 'deployment-0004', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'discovered-pool-1b98a5f24a364e05b3d56a9702c3560fc3a71f84b2195c486cfc5f8a956cc0b7', dex_deployment_id: 'dex-deployment-0001', chain_id: 'eip155:1', address: '0xc2adda861f89bbb333c90c492cb837741916a225', token0_deployment_id: 'discovered-token-b475569f6a15e97ac04e531dd813e9dcc902521c098d60d6ae4d21d53baf1395', token1_deployment_id: 'deployment-0002', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'discovered-pool-3c1e38d02092d16e396d2f3a22b2bfae55246a1c566831d31f211670e45bd562', dex_deployment_id: 'dex-deployment-0002', chain_id: 'eip155:43114', address: '0xed8cbd9f0ce3c6986b22002f03c6475ceb7a6256', token0_deployment_id: 'deployment-0004', token1_deployment_id: 'discovered-token-288036a90ee0fa72a2751a78a6934cc6ced9e16de91c97ae8e109e2ee6189bc5', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'discovered-pool-3f840a40991e755e42d242188bd8deb85cd5b9655308269b00c220f5237710cf', dex_deployment_id: 'dex-deployment-0002', chain_id: 'eip155:43114', address: '0xfe15c2695f1f920da45c30aae47d11de51007af9', token0_deployment_id: 'discovered-token-0a7f98c8752f15ee02ce0d801f25df8ff78864a1d70aff7e204f7bdb3f8a0692', token1_deployment_id: 'deployment-0004', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'discovered-pool-5d7aa6a767a0c6ea9ddeb06d1289bd12d85018935d5b25724b165dc8b9832252', dex_deployment_id: 'dex-deployment-0002', chain_id: 'eip155:43114', address: '0x48f7c83c29e5ecea926d8169864d8cd022deaf3c', token0_deployment_id: 'discovered-token-323d07c442f0d089197ae7eea9b3ebb829910177c5b780161a7623aaed5e4371', token1_deployment_id: 'deployment-0004', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'discovered-pool-6428a1e5da293b2ef62027ec823ba27532219a40784def3930feee56a623b809', dex_deployment_id: 'dex-deployment-0001', chain_id: 'eip155:1', address: '0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974', token0_deployment_id: 'deployment-0057', token1_deployment_id: 'deployment-0002', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'discovered-pool-866f890448d13c078e217a894ebd47430da5941fe5bff7e382fc095916b4614d', dex_deployment_id: 'dex-deployment-0001', chain_id: 'eip155:1', address: '0xb6909b960dbbe7392d405429eb2b3649752b4838', token0_deployment_id: 'discovered-token-69519fd08e31445cad84b0c17a5346b7ee9c5692e270602af9308ca6d8943bb6', token1_deployment_id: 'deployment-0002', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'discovered-pool-90805f8995c1d0b85a45fcd4587928a00066b1f14407baee4e8ed1b634c07804', dex_deployment_id: 'dex-deployment-0001', chain_id: 'eip155:1', address: '0x55d5c232d921b9eaa6b37b5845e439acd04b4dba', token0_deployment_id: 'discovered-token-611597bd13daa43d01a23caa9cca6a98797c64be7fb5b2677370ddbcdeaf01ec', token1_deployment_id: 'deployment-0002', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'discovered-pool-9e4ed76f76904a4ae271946bb1a4b2dc7428e343040b05a42707071bbfac9462', dex_deployment_id: 'dex-deployment-0002', chain_id: 'eip155:43114', address: '0x6f3a0c89f611ef5dc9d96650324ac633d02265d3', token0_deployment_id: 'deployment-0058', token1_deployment_id: 'deployment-0004', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'discovered-pool-a2480f3d4ea5ce12252126acf64b174b9fe678b0f0fda8936a12fef180ae08cd', dex_deployment_id: 'dex-deployment-0002', chain_id: 'eip155:43114', address: '0xa389f9430876455c36478deea9769b7ca4e3ddb1', token0_deployment_id: 'deployment-0018', token1_deployment_id: 'deployment-0004', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'discovered-pool-a7f9e600a86951f40472ff779fae467db8a6bbbc6076356058f427e97d4ae429', dex_deployment_id: 'dex-deployment-0001', chain_id: 'eip155:1', address: '0xa478c2975ab1ea89e8196811f51a7b7ade33eb11', token0_deployment_id: 'deployment-0019', token1_deployment_id: 'deployment-0002', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'discovered-pool-b8f972f8bae36c82b51ed2aeed070d3ef3e7642e2a708c7d3c0c134e6e1946ed', dex_deployment_id: 'dex-deployment-0001', chain_id: 'eip155:1', address: '0x11b1f53204d03e5529f09eb3091939e4fd8c9cf3', token0_deployment_id: 'discovered-token-054d80a64e1f36a756129763ca2f1e7a140b50b04c83876ff01dd5fd497a74c5', token1_deployment_id: 'deployment-0002', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'discovered-pool-e702b0cb56528418b4ce089dfc001c6241c94e92aabde72f1a340c4601541780', dex_deployment_id: 'dex-deployment-0001', chain_id: 'eip155:1', address: '0xbb2b8038a1640196fbe3e38816f3e67cba72d940', token0_deployment_id: 'discovered-token-e375086901067fe3de023bcdc70f1bafca798e1719ed7e676a98f57de3350a07', token1_deployment_id: 'deployment-0002', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'discovered-pool-ece9088cf38944438897ff9fb2a1abc6855a687b5a3f0d6ab98dfe06c1a6dfef', dex_deployment_id: 'dex-deployment-0002', chain_id: 'eip155:43114', address: '0x454e67025631c065d3cfad6d71e6892f74487a15', token0_deployment_id: 'deployment-0059', token1_deployment_id: 'deployment-0004', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'discovered-pool-fb02e85806cd907920126af935137b0775a858ddf04a28d7ca144f761fd7579e', dex_deployment_id: 'dex-deployment-0002', chain_id: 'eip155:43114', address: '0xb6a00cead355d1ec492fd72e1d79199c347a74b5', token0_deployment_id: 'discovered-token-1847342426b765add3c8b4feb724c6b15121f25097cb7917c967c285ca77e804', token1_deployment_id: 'deployment-0004', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'pool-0001', dex_deployment_id: 'dex-deployment-0001', chain_id: 'eip155:1', address: '0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc', token0_deployment_id: 'deployment-0008', token1_deployment_id: 'deployment-0002', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'pool-0002', dex_deployment_id: 'dex-deployment-0002', chain_id: 'eip155:43114', address: '0xf4003f4efbe8691b60249e6afbd307abe7758adb', token0_deployment_id: 'deployment-0004', token1_deployment_id: 'deployment-0009', adapter: { kind: 'evm-constant-product-v2', fee_numerator: '3', fee_denominator: '1000' }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'pool-0003', dex_deployment_id: 'dex-deployment-0003', chain_id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', address: 'FgH1dEvyRQoAqJjbUzzKVoM1HYdxTqPwjEF82kDH1kVe', token0_deployment_id: 'deployment-0006', token1_deployment_id: 'deployment-0013', adapter: { kind: 'solana-orca-whirlpool', fee_numerator: nil, fee_denominator: nil }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze, { pool_definition_id: 'pool-0004', dex_deployment_id: 'dex-deployment-0004', chain_id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', address: 'AwaVyGAF3N6K4YRUJk55Ui1GquKhKdD6vTCmVvCzXpKf', token0_deployment_id: 'deployment-0006', token1_deployment_id: 'deployment-0013', adapter: { kind: 'solana-raydium-clmm', fee_numerator: nil, fee_denominator: nil }.freeze, status: 'active', replaced_by_pool_definition_id: nil }.freeze].freeze
25
+ NATIVE_WRAP_DEFINITIONS = [{ native_wrap_definition_id: 'native-wrap-0001', chain_id: 'eip155:1', native_token_deployment_id: 'deployment-0001', wrapped_token_deployment_id: 'deployment-0002', status: 'active' }.freeze, { native_wrap_definition_id: 'native-wrap-0002', chain_id: 'eip155:43114', native_token_deployment_id: 'deployment-0003', wrapped_token_deployment_id: 'deployment-0004', status: 'active' }.freeze, { native_wrap_definition_id: 'native-wrap-0003', chain_id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', native_token_deployment_id: 'deployment-0005', wrapped_token_deployment_id: 'deployment-0006', status: 'active' }.freeze].freeze
26
+ DEX_ALIASES = [{ namespace: 'avalancheC', name: 'DISCOVERED_POOL_1568E761C62F7DC5', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::AvalancheC[:DISCOVERED_POOL_1568E761C62F7DC5] }.freeze, { namespace: 'avalancheC', name: 'DISCOVERED_POOL_3C1E38D02092D16E', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::AvalancheC[:DISCOVERED_POOL_3C1E38D02092D16E] }.freeze, { namespace: 'avalancheC', name: 'DISCOVERED_POOL_3F840A40991E755E', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::AvalancheC[:DISCOVERED_POOL_3F840A40991E755E] }.freeze, { namespace: 'avalancheC', name: 'DISCOVERED_POOL_5D7AA6A767A0C6EA', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::AvalancheC[:DISCOVERED_POOL_5D7AA6A767A0C6EA] }.freeze, { namespace: 'avalancheC', name: 'DISCOVERED_POOL_9E4ED76F76904A4A', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::AvalancheC[:DISCOVERED_POOL_9E4ED76F76904A4A] }.freeze, { namespace: 'avalancheC', name: 'DISCOVERED_POOL_A2480F3D4EA5CE12', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::AvalancheC[:DISCOVERED_POOL_A2480F3D4EA5CE12] }.freeze, { namespace: 'avalancheC', name: 'DISCOVERED_POOL_ECE9088CF3894443', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::AvalancheC[:DISCOVERED_POOL_ECE9088CF3894443] }.freeze, { namespace: 'avalancheC', name: 'DISCOVERED_POOL_FB02E85806CD9079', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::AvalancheC[:DISCOVERED_POOL_FB02E85806CD9079] }.freeze, { namespace: 'avalancheC', name: 'LFJ_LEGACY', dex_deployment_id: ERPC::Dexes::AvalancheC[:LFJ_LEGACY], pool_definition_id: nil }.freeze, { namespace: 'avalancheC', name: 'LFJ_LEGACY_WAVAX_USDC', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::AvalancheC[:LFJ_LEGACY_WAVAX_USDC] }.freeze, { namespace: 'ethereum', name: 'DISCOVERED_POOL_1B98A5F24A364E05', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::Ethereum[:DISCOVERED_POOL_1B98A5F24A364E05] }.freeze, { namespace: 'ethereum', name: 'DISCOVERED_POOL_6428A1E5DA293B2E', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::Ethereum[:DISCOVERED_POOL_6428A1E5DA293B2E] }.freeze, { namespace: 'ethereum', name: 'DISCOVERED_POOL_866F890448D13C07', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::Ethereum[:DISCOVERED_POOL_866F890448D13C07] }.freeze, { namespace: 'ethereum', name: 'DISCOVERED_POOL_90805F8995C1D0B8', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::Ethereum[:DISCOVERED_POOL_90805F8995C1D0B8] }.freeze, { namespace: 'ethereum', name: 'DISCOVERED_POOL_A7F9E600A86951F4', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::Ethereum[:DISCOVERED_POOL_A7F9E600A86951F4] }.freeze, { namespace: 'ethereum', name: 'DISCOVERED_POOL_B8F972F8BAE36C82', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::Ethereum[:DISCOVERED_POOL_B8F972F8BAE36C82] }.freeze, { namespace: 'ethereum', name: 'DISCOVERED_POOL_E702B0CB56528418', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::Ethereum[:DISCOVERED_POOL_E702B0CB56528418] }.freeze, { namespace: 'ethereum', name: 'UNISWAP_V2', dex_deployment_id: ERPC::Dexes::Ethereum[:UNISWAP_V2], pool_definition_id: nil }.freeze, { namespace: 'ethereum', name: 'UNISWAP_V2_USDC_WETH', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::Ethereum[:UNISWAP_V2_USDC_WETH] }.freeze, { namespace: 'solana', name: 'ORCA_WHIRLPOOLS', dex_deployment_id: ERPC::Dexes::Solana[:ORCA_WHIRLPOOLS], pool_definition_id: nil }.freeze, { namespace: 'solana', name: 'ORCA_WHIRLPOOLS_WSOL_EURC', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::Solana[:ORCA_WHIRLPOOLS_WSOL_EURC] }.freeze, { namespace: 'solana', name: 'RAYDIUM_CLMM', dex_deployment_id: ERPC::Dexes::Solana[:RAYDIUM_CLMM], pool_definition_id: nil }.freeze, { namespace: 'solana', name: 'RAYDIUM_CLMM_WSOL_EURC', dex_deployment_id: nil, pool_definition_id: ERPC::Pools::Solana[:RAYDIUM_CLMM_WSOL_EURC] }.freeze].freeze
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Generated by registry/generate-swap-execution-capabilities.mjs. Do not edit.
4
+
5
+ module ERPC
6
+ SWAP_EXECUTION_CAPABILITIES_JSON = '[{"swapExecutionCapabilityId":"swap-execution-0001","chainId":"eip155:1","dexDeploymentId":"dex-deployment-0001","poolDefinitionId":"pool-0001","factoryAddress":"0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f","routerAddress":"0x7a250d5630b4cf539739df2c5dacb4c659f2488d","routerKind":"uniswap-v2-router02","adapterKind":"evm-constant-product-v2","token0DeploymentId":"deployment-0008","token0Address":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","token0Standard":"erc20","token1DeploymentId":"deployment-0002","token1Address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","token1Standard":"erc20","wrappedNativeTokenDeploymentId":"deployment-0002","wrappedNativeTokenAddress":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","wrappedNativeFunctionSelector":"0xad5c4648","functionKind":"exact-input-erc20-to-erc20","functionSignature":"swapExactTokensForTokens(uint256,uint256,address[],address,uint256)","functionSelector":"0x38ed1739","status":"active"},{"swapExecutionCapabilityId":"swap-execution-0002","chainId":"eip155:43114","dexDeploymentId":"dex-deployment-0002","poolDefinitionId":"pool-0002","factoryAddress":"0x9ad6c38be94206ca50bb0d90783181662f0cfa10","routerAddress":"0x60ae616a2155ee3d9a68541ba4544862310933d4","routerKind":"joe-v1-router02","adapterKind":"evm-constant-product-v2","token0DeploymentId":"deployment-0004","token0Address":"0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7","token0Standard":"erc20","token1DeploymentId":"deployment-0009","token1Address":"0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e","token1Standard":"erc20","wrappedNativeTokenDeploymentId":"deployment-0004","wrappedNativeTokenAddress":"0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7","wrappedNativeFunctionSelector":"0x73b295c2","functionKind":"exact-input-erc20-to-erc20","functionSignature":"swapExactTokensForTokens(uint256,uint256,address[],address,uint256)","functionSelector":"0x38ed1739","status":"active"}]'.freeze
7
+ SWAP_EXECUTION_CAPABILITIES_CONTENT_DIGEST = '84424dc48687e2cb1dd0c9a2446f820efd2c311e71ce5acacfeb6e882811875f'.freeze
8
+ SWAP_EXECUTION_CAPABILITIES_AS_OF_DATE = '2026-09-16'.freeze
9
+ SWAP_EXECUTION_FUNCTION_SIGNATURE = 'swapExactTokensForTokens(uint256,uint256,address[],address,uint256)'.freeze
10
+ SWAP_EXECUTION_FUNCTION_SELECTOR = '0x38ed1739'.freeze
11
+ end