@3rd-eye-labs/openmm 0.1.0 → 0.1.3

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.
Files changed (276) hide show
  1. package/README.md +6 -1
  2. package/dist/cli/cli.js +4 -0
  3. package/dist/cli/cli.js.map +1 -1
  4. package/dist/cli/commands/ohlcv.d.ts +3 -0
  5. package/dist/cli/commands/ohlcv.d.ts.map +1 -0
  6. package/dist/cli/commands/ohlcv.js +115 -0
  7. package/dist/cli/commands/ohlcv.js.map +1 -0
  8. package/dist/cli/commands/pool-discovery.d.ts.map +1 -1
  9. package/dist/cli/commands/pool-discovery.js +13 -4
  10. package/dist/cli/commands/pool-discovery.js.map +1 -1
  11. package/dist/cli/commands/wallet.d.ts +7 -0
  12. package/dist/cli/commands/wallet.d.ts.map +1 -0
  13. package/dist/cli/commands/wallet.js +271 -0
  14. package/dist/cli/commands/wallet.js.map +1 -0
  15. package/dist/cli/pool-discovery-core.d.ts +2 -1
  16. package/dist/cli/pool-discovery-core.d.ts.map +1 -1
  17. package/dist/cli/pool-discovery-core.js +66 -30
  18. package/dist/cli/pool-discovery-core.js.map +1 -1
  19. package/dist/core/exchange/base-exchange-connector.d.ts +2 -1
  20. package/dist/core/exchange/base-exchange-connector.d.ts.map +1 -1
  21. package/dist/core/exchange/base-exchange-connector.js.map +1 -1
  22. package/dist/exchanges/bitget/bitget-connector.d.ts +11 -1
  23. package/dist/exchanges/bitget/bitget-connector.d.ts.map +1 -1
  24. package/dist/exchanges/bitget/bitget-connector.js +52 -0
  25. package/dist/exchanges/bitget/bitget-connector.js.map +1 -1
  26. package/dist/exchanges/gateio/gateio-connector.d.ts +11 -1
  27. package/dist/exchanges/gateio/gateio-connector.d.ts.map +1 -1
  28. package/dist/exchanges/gateio/gateio-connector.js +54 -0
  29. package/dist/exchanges/gateio/gateio-connector.js.map +1 -1
  30. package/dist/exchanges/kraken/kraken-connector.d.ts +6 -1
  31. package/dist/exchanges/kraken/kraken-connector.d.ts.map +1 -1
  32. package/dist/exchanges/kraken/kraken-connector.js +44 -0
  33. package/dist/exchanges/kraken/kraken-connector.js.map +1 -1
  34. package/dist/exchanges/mexc/mexc-auth.d.ts +1 -0
  35. package/dist/exchanges/mexc/mexc-auth.d.ts.map +1 -1
  36. package/dist/exchanges/mexc/mexc-auth.js +4 -1
  37. package/dist/exchanges/mexc/mexc-auth.js.map +1 -1
  38. package/dist/exchanges/mexc/mexc-connector.d.ts +6 -1
  39. package/dist/exchanges/mexc/mexc-connector.d.ts.map +1 -1
  40. package/dist/exchanges/mexc/mexc-connector.js +37 -0
  41. package/dist/exchanges/mexc/mexc-connector.js.map +1 -1
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +25 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/types/market.d.ts +15 -0
  47. package/dist/types/market.d.ts.map +1 -1
  48. package/dist/x402/crypto.d.ts +79 -0
  49. package/dist/x402/crypto.d.ts.map +1 -0
  50. package/dist/x402/crypto.js +300 -0
  51. package/dist/x402/crypto.js.map +1 -0
  52. package/dist/x402/evm.d.ts +41 -0
  53. package/dist/x402/evm.d.ts.map +1 -0
  54. package/dist/x402/evm.js +229 -0
  55. package/dist/x402/evm.js.map +1 -0
  56. package/dist/x402/handler.d.ts +53 -0
  57. package/dist/x402/handler.d.ts.map +1 -0
  58. package/dist/x402/handler.js +233 -0
  59. package/dist/x402/handler.js.map +1 -0
  60. package/dist/x402/index.d.ts +29 -0
  61. package/dist/x402/index.d.ts.map +1 -0
  62. package/dist/x402/index.js +67 -0
  63. package/dist/x402/index.js.map +1 -0
  64. package/dist/x402/types.d.ts +185 -0
  65. package/dist/x402/types.d.ts.map +1 -0
  66. package/dist/x402/types.js +7 -0
  67. package/dist/x402/types.js.map +1 -0
  68. package/dist/x402/wallet.d.ts +65 -0
  69. package/dist/x402/wallet.d.ts.map +1 -0
  70. package/dist/x402/wallet.js +282 -0
  71. package/dist/x402/wallet.js.map +1 -0
  72. package/package.json +1 -1
  73. package/dist/cli/commands/grid.d.ts +0 -3
  74. package/dist/cli/commands/grid.d.ts.map +0 -1
  75. package/dist/cli/commands/grid.js +0 -103
  76. package/dist/cli/commands/grid.js.map +0 -1
  77. package/dist/cli/commands/multi-trade.d.ts +0 -3
  78. package/dist/cli/commands/multi-trade.d.ts.map +0 -1
  79. package/dist/cli/commands/multi-trade.js +0 -175
  80. package/dist/cli/commands/multi-trade.js.map +0 -1
  81. package/dist/cli/pool-discovery.d.ts +0 -56
  82. package/dist/cli/pool-discovery.d.ts.map +0 -1
  83. package/dist/cli/pool-discovery.js +0 -283
  84. package/dist/cli/pool-discovery.js.map +0 -1
  85. package/dist/core/price-aggregation/price-cache.d.ts +0 -55
  86. package/dist/core/price-aggregation/price-cache.d.ts.map +0 -1
  87. package/dist/core/price-aggregation/price-cache.js +0 -152
  88. package/dist/core/price-aggregation/price-cache.js.map +0 -1
  89. package/dist/examples/mexc-connector-comprehensive-test.d.ts +0 -15
  90. package/dist/examples/mexc-connector-comprehensive-test.d.ts.map +0 -1
  91. package/dist/examples/mexc-connector-comprehensive-test.js +0 -514
  92. package/dist/examples/mexc-connector-comprehensive-test.js.map +0 -1
  93. package/dist/examples/mexc-order-update-test.d.ts +0 -4
  94. package/dist/examples/mexc-order-update-test.d.ts.map +0 -1
  95. package/dist/examples/mexc-order-update-test.js +0 -186
  96. package/dist/examples/mexc-order-update-test.js.map +0 -1
  97. package/dist/examples/mexc-test.d.ts +0 -9
  98. package/dist/examples/mexc-test.d.ts.map +0 -1
  99. package/dist/examples/mexc-test.js +0 -218
  100. package/dist/examples/mexc-test.js.map +0 -1
  101. package/dist/examples/mexc-trades-debug.d.ts +0 -2
  102. package/dist/examples/mexc-trades-debug.d.ts.map +0 -1
  103. package/dist/examples/mexc-trades-debug.js +0 -101
  104. package/dist/examples/mexc-trades-debug.js.map +0 -1
  105. package/dist/examples/mexc-trades-subscription-debug.d.ts +0 -2
  106. package/dist/examples/mexc-trades-subscription-debug.d.ts.map +0 -1
  107. package/dist/examples/mexc-trades-subscription-debug.js +0 -150
  108. package/dist/examples/mexc-trades-subscription-debug.js.map +0 -1
  109. package/dist/examples/mexc-websocket-test.d.ts +0 -8
  110. package/dist/examples/mexc-websocket-test.d.ts.map +0 -1
  111. package/dist/examples/mexc-websocket-test.js +0 -115
  112. package/dist/examples/mexc-websocket-test.js.map +0 -1
  113. package/dist/examples/test-protobuf-status-detection.d.ts +0 -9
  114. package/dist/examples/test-protobuf-status-detection.d.ts.map +0 -1
  115. package/dist/examples/test-protobuf-status-detection.js +0 -83
  116. package/dist/examples/test-protobuf-status-detection.js.map +0 -1
  117. package/dist/exchanges/base-exchange-connector.d.ts +0 -33
  118. package/dist/exchanges/base-exchange-connector.d.ts.map +0 -1
  119. package/dist/exchanges/base-exchange-connector.js +0 -55
  120. package/dist/exchanges/base-exchange-connector.js.map +0 -1
  121. package/dist/exchanges/kraken/test-kraken-websocket.d.ts +0 -19
  122. package/dist/exchanges/kraken/test-kraken-websocket.d.ts.map +0 -1
  123. package/dist/exchanges/kraken/test-kraken-websocket.js +0 -413
  124. package/dist/exchanges/kraken/test-kraken-websocket.js.map +0 -1
  125. package/dist/mcp/resources/index.d.ts +0 -3
  126. package/dist/mcp/resources/index.d.ts.map +0 -1
  127. package/dist/mcp/resources/index.js +0 -11
  128. package/dist/mcp/resources/index.js.map +0 -1
  129. package/dist/mcp/server.d.ts +0 -4
  130. package/dist/mcp/server.d.ts.map +0 -1
  131. package/dist/mcp/server.js +0 -29
  132. package/dist/mcp/server.js.map +0 -1
  133. package/dist/mcp/tools/index.d.ts +0 -3
  134. package/dist/mcp/tools/index.d.ts.map +0 -1
  135. package/dist/mcp/tools/index.js +0 -12
  136. package/dist/mcp/tools/index.js.map +0 -1
  137. package/dist/tests/fixtures/test-helpers.d.ts +0 -5
  138. package/dist/tests/fixtures/test-helpers.d.ts.map +0 -1
  139. package/dist/tests/fixtures/test-helpers.js +0 -8
  140. package/dist/tests/fixtures/test-helpers.js.map +0 -1
  141. package/dist/tests/integration/exchanges/mexc/mexc-integration.test.d.ts +0 -2
  142. package/dist/tests/integration/exchanges/mexc/mexc-integration.test.d.ts.map +0 -1
  143. package/dist/tests/integration/exchanges/mexc/mexc-integration.test.js +0 -237
  144. package/dist/tests/integration/exchanges/mexc/mexc-integration.test.js.map +0 -1
  145. package/dist/tests/integration/price-aggregation/cardano-price-service.test.d.ts +0 -2
  146. package/dist/tests/integration/price-aggregation/cardano-price-service.test.d.ts.map +0 -1
  147. package/dist/tests/integration/price-aggregation/cardano-price-service.test.js +0 -57
  148. package/dist/tests/integration/price-aggregation/cardano-price-service.test.js.map +0 -1
  149. package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.d.ts +0 -2
  150. package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.d.ts.map +0 -1
  151. package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.js +0 -141
  152. package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.js.map +0 -1
  153. package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.d.ts +0 -2
  154. package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.d.ts.map +0 -1
  155. package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.js +0 -375
  156. package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.js.map +0 -1
  157. package/dist/tests/unit/cli/exchange-factory.test.d.ts +0 -2
  158. package/dist/tests/unit/cli/exchange-factory.test.d.ts.map +0 -1
  159. package/dist/tests/unit/cli/exchange-factory.test.js +0 -148
  160. package/dist/tests/unit/cli/exchange-factory.test.js.map +0 -1
  161. package/dist/tests/unit/config/environment.test.d.ts +0 -2
  162. package/dist/tests/unit/config/environment.test.d.ts.map +0 -1
  163. package/dist/tests/unit/config/environment.test.js +0 -158
  164. package/dist/tests/unit/config/environment.test.js.map +0 -1
  165. package/dist/tests/unit/config/launcher-config.test.d.ts +0 -2
  166. package/dist/tests/unit/config/launcher-config.test.d.ts.map +0 -1
  167. package/dist/tests/unit/config/launcher-config.test.js +0 -117
  168. package/dist/tests/unit/config/launcher-config.test.js.map +0 -1
  169. package/dist/tests/unit/config/price-aggregation.test.d.ts +0 -2
  170. package/dist/tests/unit/config/price-aggregation.test.d.ts.map +0 -1
  171. package/dist/tests/unit/config/price-aggregation.test.js +0 -144
  172. package/dist/tests/unit/config/price-aggregation.test.js.map +0 -1
  173. package/dist/tests/unit/core/exchange/base-exchange-connector.test.d.ts +0 -2
  174. package/dist/tests/unit/core/exchange/base-exchange-connector.test.d.ts.map +0 -1
  175. package/dist/tests/unit/core/exchange/base-exchange-connector.test.js +0 -191
  176. package/dist/tests/unit/core/exchange/base-exchange-connector.test.js.map +0 -1
  177. package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.d.ts +0 -2
  178. package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.d.ts.map +0 -1
  179. package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.js +0 -324
  180. package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.js.map +0 -1
  181. package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.d.ts +0 -2
  182. package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.d.ts.map +0 -1
  183. package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.js +0 -177
  184. package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.js.map +0 -1
  185. package/dist/tests/unit/core/price-aggregation/iris-api-client.test.d.ts +0 -2
  186. package/dist/tests/unit/core/price-aggregation/iris-api-client.test.d.ts.map +0 -1
  187. package/dist/tests/unit/core/price-aggregation/iris-api-client.test.js +0 -168
  188. package/dist/tests/unit/core/price-aggregation/iris-api-client.test.js.map +0 -1
  189. package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.d.ts +0 -2
  190. package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.d.ts.map +0 -1
  191. package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.js +0 -217
  192. package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.js.map +0 -1
  193. package/dist/tests/unit/core/price-aggregation/price-calculator.test.d.ts +0 -2
  194. package/dist/tests/unit/core/price-aggregation/price-calculator.test.d.ts.map +0 -1
  195. package/dist/tests/unit/core/price-aggregation/price-calculator.test.js +0 -229
  196. package/dist/tests/unit/core/price-aggregation/price-calculator.test.js.map +0 -1
  197. package/dist/tests/unit/core/risk-management/risk-manager.test.d.ts +0 -2
  198. package/dist/tests/unit/core/risk-management/risk-manager.test.d.ts.map +0 -1
  199. package/dist/tests/unit/core/risk-management/risk-manager.test.js +0 -194
  200. package/dist/tests/unit/core/risk-management/risk-manager.test.js.map +0 -1
  201. package/dist/tests/unit/core/strategy/base-strategy.test.d.ts +0 -2
  202. package/dist/tests/unit/core/strategy/base-strategy.test.d.ts.map +0 -1
  203. package/dist/tests/unit/core/strategy/base-strategy.test.js +0 -254
  204. package/dist/tests/unit/core/strategy/base-strategy.test.js.map +0 -1
  205. package/dist/tests/unit/core/strategy/strategy-factory.test.d.ts +0 -2
  206. package/dist/tests/unit/core/strategy/strategy-factory.test.d.ts.map +0 -1
  207. package/dist/tests/unit/core/strategy/strategy-factory.test.js +0 -213
  208. package/dist/tests/unit/core/strategy/strategy-factory.test.js.map +0 -1
  209. package/dist/tests/unit/exchanges/mexc/mexc-auth.test.d.ts +0 -2
  210. package/dist/tests/unit/exchanges/mexc/mexc-auth.test.d.ts.map +0 -1
  211. package/dist/tests/unit/exchanges/mexc/mexc-auth.test.js +0 -452
  212. package/dist/tests/unit/exchanges/mexc/mexc-auth.test.js.map +0 -1
  213. package/dist/tests/unit/exchanges/mexc/mexc-connector.test.d.ts +0 -2
  214. package/dist/tests/unit/exchanges/mexc/mexc-connector.test.d.ts.map +0 -1
  215. package/dist/tests/unit/exchanges/mexc/mexc-connector.test.js +0 -1419
  216. package/dist/tests/unit/exchanges/mexc/mexc-connector.test.js.map +0 -1
  217. package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.d.ts +0 -2
  218. package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.d.ts.map +0 -1
  219. package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.js +0 -435
  220. package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.js.map +0 -1
  221. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.d.ts +0 -2
  222. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.d.ts.map +0 -1
  223. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.js +0 -314
  224. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.js.map +0 -1
  225. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.d.ts +0 -2
  226. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.d.ts.map +0 -1
  227. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.js +0 -178
  228. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.js.map +0 -1
  229. package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.d.ts +0 -2
  230. package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.d.ts.map +0 -1
  231. package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.js +0 -502
  232. package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.js.map +0 -1
  233. package/dist/tests/unit/exchanges/mexc/mexc-utils.test.d.ts +0 -2
  234. package/dist/tests/unit/exchanges/mexc/mexc-utils.test.d.ts.map +0 -1
  235. package/dist/tests/unit/exchanges/mexc/mexc-utils.test.js +0 -317
  236. package/dist/tests/unit/exchanges/mexc/mexc-utils.test.js.map +0 -1
  237. package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.d.ts +0 -2
  238. package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.d.ts.map +0 -1
  239. package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.js +0 -843
  240. package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.js.map +0 -1
  241. package/dist/tests/unit/strategies/grid/grid-calculator.test.d.ts +0 -2
  242. package/dist/tests/unit/strategies/grid/grid-calculator.test.d.ts.map +0 -1
  243. package/dist/tests/unit/strategies/grid/grid-calculator.test.js +0 -67
  244. package/dist/tests/unit/strategies/grid/grid-calculator.test.js.map +0 -1
  245. package/dist/tests/unit/strategies/grid/grid-order-manager.test.d.ts +0 -2
  246. package/dist/tests/unit/strategies/grid/grid-order-manager.test.d.ts.map +0 -1
  247. package/dist/tests/unit/strategies/grid/grid-order-manager.test.js +0 -211
  248. package/dist/tests/unit/strategies/grid/grid-order-manager.test.js.map +0 -1
  249. package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.d.ts +0 -2
  250. package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.d.ts.map +0 -1
  251. package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.js +0 -197
  252. package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.js.map +0 -1
  253. package/dist/tests/unit/strategies/grid/grid-strategy.test.d.ts +0 -2
  254. package/dist/tests/unit/strategies/grid/grid-strategy.test.d.ts.map +0 -1
  255. package/dist/tests/unit/strategies/grid/grid-strategy.test.js +0 -429
  256. package/dist/tests/unit/strategies/grid/grid-strategy.test.js.map +0 -1
  257. package/dist/tests/unit/utils/logger.test.d.ts +0 -2
  258. package/dist/tests/unit/utils/logger.test.d.ts.map +0 -1
  259. package/dist/tests/unit/utils/logger.test.js +0 -260
  260. package/dist/tests/unit/utils/logger.test.js.map +0 -1
  261. package/dist/tests/unit/utils/symbol-utils.test.d.ts +0 -2
  262. package/dist/tests/unit/utils/symbol-utils.test.d.ts.map +0 -1
  263. package/dist/tests/unit/utils/symbol-utils.test.js +0 -178
  264. package/dist/tests/unit/utils/symbol-utils.test.js.map +0 -1
  265. package/dist/types/price-aggregation.d.ts +0 -31
  266. package/dist/types/price-aggregation.d.ts.map +0 -1
  267. package/dist/types/price-aggregation.js +0 -6
  268. package/dist/types/price-aggregation.js.map +0 -1
  269. package/dist/utils/crypto.d.ts +0 -15
  270. package/dist/utils/crypto.d.ts.map +0 -1
  271. package/dist/utils/crypto.js +0 -50
  272. package/dist/utils/crypto.js.map +0 -1
  273. package/dist/utils/validation.d.ts +0 -36
  274. package/dist/utils/validation.d.ts.map +0 -1
  275. package/dist/utils/validation.js +0 -174
  276. package/dist/utils/validation.js.map +0 -1
@@ -0,0 +1,300 @@
1
+ "use strict";
2
+ /**
3
+ * OpenMM x402 Cryptographic Utilities
4
+ * Pure Node.js crypto implementations for EVM signing.
5
+ * No external dependencies required.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.keccak256 = keccak256;
12
+ exports.signSecp256k1 = signSecp256k1;
13
+ exports.encryptKey = encryptKey;
14
+ exports.decryptKey = decryptKey;
15
+ exports.hashPassword = hashPassword;
16
+ exports.verifyPassword = verifyPassword;
17
+ exports.generatePrivateKey = generatePrivateKey;
18
+ exports.privateKeyToEvmAddress = privateKeyToEvmAddress;
19
+ exports.generateSolanaKeypair = generateSolanaKeypair;
20
+ exports.base58Encode = base58Encode;
21
+ const crypto_1 = __importDefault(require("crypto"));
22
+ /**
23
+ * Compute keccak256 hash (Ethereum's version of SHA3-256).
24
+ * Uses Node.js crypto which supports keccak256 natively.
25
+ */
26
+ function keccak256(data) {
27
+ return crypto_1.default.createHash('sha3-256').update(data).digest();
28
+ }
29
+ /**
30
+ * Sign a message hash with secp256k1 private key.
31
+ * Returns { r, s, v } where v is recovery id (0 or 1).
32
+ */
33
+ function signSecp256k1(msgHash, privateKey) {
34
+ // Use Node.js ECDH to get the public key for recovery
35
+ const ecdh = crypto_1.default.createECDH('secp256k1');
36
+ ecdh.setPrivateKey(privateKey);
37
+ const publicKey = ecdh.getPublicKey(null, 'uncompressed');
38
+ // Sign the message
39
+ const sign = crypto_1.default.createSign('sha256');
40
+ sign.update(msgHash);
41
+ sign.end();
42
+ // Node.js sign() with ECDSA returns DER-encoded signature
43
+ // We need to extract r and s from it
44
+ const derSig = sign.sign({ key: privateKeyToPem(privateKey), dsaEncoding: 'der' });
45
+ // Parse DER signature to get r and s
46
+ const { r, s } = parseDerSignature(derSig);
47
+ // Normalize s to low-S form (required by Ethereum)
48
+ const secp256k1N = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141');
49
+ const halfN = secp256k1N / 2n;
50
+ let sBigInt = BigInt('0x' + s.toString('hex'));
51
+ let sNormalized = s;
52
+ if (sBigInt > halfN) {
53
+ sBigInt = secp256k1N - sBigInt;
54
+ sNormalized = Buffer.from(sBigInt.toString(16).padStart(64, '0'), 'hex');
55
+ }
56
+ // Determine recovery id by trying both values
57
+ const v = recoverV(msgHash, r, sNormalized, publicKey);
58
+ return { r, s: sNormalized, v };
59
+ }
60
+ /**
61
+ * Convert raw private key to PEM format for Node.js crypto.
62
+ */
63
+ function privateKeyToPem(privateKey) {
64
+ // Create SEC1 EC private key DER structure
65
+ const ecdh = crypto_1.default.createECDH('secp256k1');
66
+ ecdh.setPrivateKey(privateKey);
67
+ // Use Node.js KeyObject API
68
+ const keyObject = crypto_1.default.createPrivateKey({
69
+ key: {
70
+ kty: 'EC',
71
+ crv: 'secp256k1',
72
+ d: privateKey.toString('base64url'),
73
+ x: ecdh.getPublicKey().subarray(1, 33).toString('base64url'),
74
+ y: ecdh.getPublicKey().subarray(33, 65).toString('base64url'),
75
+ },
76
+ format: 'jwk',
77
+ });
78
+ return keyObject.export({ type: 'pkcs8', format: 'pem' });
79
+ }
80
+ /**
81
+ * Parse DER-encoded ECDSA signature to extract r and s values.
82
+ */
83
+ function parseDerSignature(der) {
84
+ // DER: 30 <len> 02 <r-len> <r> 02 <s-len> <s>
85
+ let offset = 2; // Skip SEQUENCE header
86
+ // Read r
87
+ if (der[offset] !== 0x02)
88
+ throw new Error('Invalid DER signature');
89
+ offset++;
90
+ const rLen = der[offset];
91
+ offset++;
92
+ let r = der.subarray(offset, offset + rLen);
93
+ offset += rLen;
94
+ // Read s
95
+ if (der[offset] !== 0x02)
96
+ throw new Error('Invalid DER signature');
97
+ offset++;
98
+ const sLen = der[offset];
99
+ offset++;
100
+ let s = der.subarray(offset, offset + sLen);
101
+ // Remove leading zeros if present (DER may add 0x00 prefix for positive numbers)
102
+ if (r.length === 33 && r[0] === 0x00)
103
+ r = r.subarray(1);
104
+ if (s.length === 33 && s[0] === 0x00)
105
+ s = s.subarray(1);
106
+ // Pad to 32 bytes if needed
107
+ if (r.length < 32)
108
+ r = Buffer.concat([Buffer.alloc(32 - r.length), r]);
109
+ if (s.length < 32)
110
+ s = Buffer.concat([Buffer.alloc(32 - s.length), s]);
111
+ return { r, s };
112
+ }
113
+ /**
114
+ * Determine the recovery id (v) by verifying which value recovers the correct public key.
115
+ */
116
+ function recoverV(msgHash, r, s, expectedPubKey) {
117
+ // Try v=0 and v=1, see which recovers the correct public key
118
+ // For simplicity, we'll use a mathematical approach based on Y parity
119
+ // The recovery id is based on the Y coordinate of the signature point
120
+ // For Ethereum, v is typically 0 or 1 (added to 27 for legacy reasons)
121
+ // Extract Y coordinate from the expected public key
122
+ const yCoord = expectedPubKey.subarray(33, 65);
123
+ const yBigInt = BigInt('0x' + yCoord.toString('hex'));
124
+ // If Y is even, v = 0; if odd, v = 1
125
+ return yBigInt % 2n === 0n ? 0 : 1;
126
+ }
127
+ // ============= Encryption for Wallet Storage =============
128
+ const SCRYPT_N = 131072;
129
+ const SCRYPT_R = 8;
130
+ const SCRYPT_P = 1;
131
+ const SCRYPT_KEYLEN = 32;
132
+ const SALT_LEN = 16;
133
+ const IV_LEN = 12;
134
+ /**
135
+ * Derive encryption key from password using scrypt.
136
+ */
137
+ function deriveKey(password, salt) {
138
+ return crypto_1.default.scryptSync(password, salt, SCRYPT_KEYLEN, {
139
+ N: SCRYPT_N,
140
+ r: SCRYPT_R,
141
+ p: SCRYPT_P,
142
+ maxmem: 256 * 1024 * 1024,
143
+ });
144
+ }
145
+ /**
146
+ * Encrypt a private key with a password.
147
+ */
148
+ function encryptKey(privateKeyHex, password) {
149
+ if (password === null) {
150
+ return { data: privateKeyHex, encrypted: false };
151
+ }
152
+ const salt = crypto_1.default.randomBytes(SALT_LEN);
153
+ const iv = crypto_1.default.randomBytes(IV_LEN);
154
+ const key = deriveKey(password, salt);
155
+ const cipher = crypto_1.default.createCipheriv('aes-256-gcm', key, iv);
156
+ const encrypted = Buffer.concat([cipher.update(privateKeyHex, 'utf8'), cipher.final()]);
157
+ const authTag = cipher.getAuthTag();
158
+ return {
159
+ cipher: 'aes-256-gcm',
160
+ kdf: 'scrypt',
161
+ kdfParams: { N: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P },
162
+ salt: salt.toString('hex'),
163
+ iv: iv.toString('hex'),
164
+ authTag: authTag.toString('hex'),
165
+ ciphertext: encrypted.toString('hex'),
166
+ };
167
+ }
168
+ /**
169
+ * Decrypt a private key with a password.
170
+ */
171
+ function decryptKey(encryptedData, password) {
172
+ const ENCRYPTED_FIELDS = ['salt', 'iv', 'authTag', 'ciphertext'];
173
+ const hasEncryptionFields = ENCRYPTED_FIELDS.some(f => f in encryptedData);
174
+ // Unencrypted blob
175
+ if (encryptedData.encrypted === false) {
176
+ if (hasEncryptionFields) {
177
+ throw new Error('Wallet data corrupted or tampered');
178
+ }
179
+ return encryptedData.data;
180
+ }
181
+ // Encrypted blob with missing fields
182
+ if (!ENCRYPTED_FIELDS.every(f => f in encryptedData)) {
183
+ throw new Error('Wallet data corrupted or tampered');
184
+ }
185
+ // Encrypted blob but no password provided
186
+ if (password === null || password === undefined) {
187
+ throw new Error('Wallet is encrypted. Set OPENMM_WALLET_PASSWORD.');
188
+ }
189
+ const salt = Buffer.from(encryptedData.salt, 'hex');
190
+ const iv = Buffer.from(encryptedData.iv, 'hex');
191
+ const authTag = Buffer.from(encryptedData.authTag, 'hex');
192
+ const ciphertext = Buffer.from(encryptedData.ciphertext, 'hex');
193
+ const key = deriveKey(password, salt);
194
+ const decipher = crypto_1.default.createDecipheriv('aes-256-gcm', key, iv);
195
+ decipher.setAuthTag(authTag);
196
+ try {
197
+ const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
198
+ return decrypted.toString('utf8');
199
+ }
200
+ catch {
201
+ throw new Error('Incorrect password');
202
+ }
203
+ }
204
+ /**
205
+ * Hash a password for verification (not encryption).
206
+ */
207
+ function hashPassword(password) {
208
+ const salt = crypto_1.default.randomBytes(16);
209
+ const hash = crypto_1.default.scryptSync(password, salt, 32, {
210
+ N: SCRYPT_N,
211
+ r: SCRYPT_R,
212
+ p: SCRYPT_P,
213
+ maxmem: 256 * 1024 * 1024,
214
+ });
215
+ return { salt: salt.toString('hex'), hash: hash.toString('hex') };
216
+ }
217
+ /**
218
+ * Verify a password against stored hash.
219
+ */
220
+ function verifyPassword(password, storedHash) {
221
+ const derived = crypto_1.default.scryptSync(password, Buffer.from(storedHash.salt, 'hex'), 32, {
222
+ N: SCRYPT_N,
223
+ r: SCRYPT_R,
224
+ p: SCRYPT_P,
225
+ maxmem: 256 * 1024 * 1024,
226
+ });
227
+ return crypto_1.default.timingSafeEqual(derived, Buffer.from(storedHash.hash, 'hex'));
228
+ }
229
+ /**
230
+ * Generate a random 32-byte private key.
231
+ */
232
+ function generatePrivateKey() {
233
+ return crypto_1.default.randomBytes(32);
234
+ }
235
+ /**
236
+ * Derive EVM address from private key.
237
+ */
238
+ function privateKeyToEvmAddress(privateKey) {
239
+ // Derive public key (uncompressed, 65 bytes: 0x04 + x + y)
240
+ const ecdh = crypto_1.default.createECDH('secp256k1');
241
+ ecdh.setPrivateKey(privateKey);
242
+ const publicKey = ecdh.getPublicKey(null, 'uncompressed');
243
+ // Address = last 20 bytes of keccak256(publicKey without 0x04 prefix)
244
+ const hash = keccak256(publicKey.subarray(1));
245
+ const addressBytes = hash.subarray(12);
246
+ const addressHex = addressBytes.toString('hex');
247
+ // EIP-55 checksum
248
+ const addressHash = keccak256(Buffer.from(addressHex, 'utf8')).toString('hex');
249
+ let checksummed = '0x';
250
+ for (let i = 0; i < 40; i++) {
251
+ checksummed += parseInt(addressHash[i], 16) >= 8 ? addressHex[i].toUpperCase() : addressHex[i];
252
+ }
253
+ return checksummed;
254
+ }
255
+ /**
256
+ * Generate Ed25519 keypair for Solana.
257
+ */
258
+ function generateSolanaKeypair() {
259
+ const { publicKey, privateKey } = crypto_1.default.generateKeyPairSync('ed25519', {
260
+ publicKeyEncoding: { type: 'spki', format: 'der' },
261
+ privateKeyEncoding: { type: 'pkcs8', format: 'der' },
262
+ });
263
+ // Extract raw 32-byte keys from DER encoding
264
+ const rawPrivate = privateKey.subarray(privateKey.length - 32);
265
+ const rawPublic = publicKey.subarray(publicKey.length - 32);
266
+ // Solana keypair format: 64 bytes = private seed (32) + public key (32)
267
+ const keypair = Buffer.concat([rawPrivate, rawPublic]);
268
+ return { privateKey: keypair, publicKey: rawPublic };
269
+ }
270
+ // ============= Base58 for Solana addresses =============
271
+ const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
272
+ /**
273
+ * Encode buffer to Base58 string (for Solana addresses).
274
+ */
275
+ function base58Encode(buffer) {
276
+ const bytes = [...buffer];
277
+ const digits = [0];
278
+ for (const byte of bytes) {
279
+ let carry = byte;
280
+ for (let j = 0; j < digits.length; j++) {
281
+ carry += digits[j] << 8;
282
+ digits[j] = carry % 58;
283
+ carry = Math.floor(carry / 58);
284
+ }
285
+ while (carry > 0) {
286
+ digits.push(carry % 58);
287
+ carry = Math.floor(carry / 58);
288
+ }
289
+ }
290
+ // Handle leading zeros
291
+ let leadingZeros = '';
292
+ for (const byte of bytes) {
293
+ if (byte === 0)
294
+ leadingZeros += '1';
295
+ else
296
+ break;
297
+ }
298
+ return leadingZeros + digits.reverse().map(d => BASE58_ALPHABET[d]).join('');
299
+ }
300
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/x402/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * OpenMM x402 EVM Auto-Payment
3
+ * Implements EIP-3009 TransferWithAuthorization via EIP-712 typed data signing.
4
+ * Pure Node.js implementation — no external dependencies.
5
+ */
6
+ import type { PaymentRequirement, EIP712Domain } from './types';
7
+ interface TypeField {
8
+ name: string;
9
+ type: string;
10
+ }
11
+ /**
12
+ * Compute EIP-712 final hash: keccak256("\x19\x01" || domainSeparator || structHash)
13
+ */
14
+ export declare function hashTypedData(domain: EIP712Domain, primaryType: string, fields: TypeField[], message: Record<string, unknown>): Buffer;
15
+ /**
16
+ * Check if a network string is an EVM network.
17
+ */
18
+ export declare function isEvmNetwork(network: string): boolean;
19
+ /**
20
+ * Create an x402 payment payload for EVM (EIP-3009 TransferWithAuthorization).
21
+ *
22
+ * @param requirements - Parsed PaymentRequirements from 402 response
23
+ * @param privateKeyHex - 32-byte EVM private key as hex
24
+ * @param walletAddress - Signer's EVM address
25
+ * @param resource - Original request URL
26
+ * @returns Base64-encoded PaymentPayload for Payment-Signature header
27
+ */
28
+ export declare function createEvmPaymentPayload(requirements: PaymentRequirement, privateKeyHex: string, walletAddress: string, resource: string): string;
29
+ /**
30
+ * Check USDC balance on Base network.
31
+ *
32
+ * @param address - EVM address to check
33
+ * @returns Balance in USD (number) or null if check fails
34
+ */
35
+ export declare function checkEvmBalance(address: string): Promise<number | null>;
36
+ /**
37
+ * Get Base network RPC URL.
38
+ */
39
+ export declare function getBaseRpcUrl(): string;
40
+ export {};
41
+ //# sourceMappingURL=evm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../../src/x402/evm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,kBAAkB,EAClB,YAAY,EAGb,MAAM,SAAS,CAAC;AAIjB,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AA0GD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,SAAS,EAAE,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAKR;AAcD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,kBAAkB,EAChC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,MAAM,CAwER;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwB7E;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ /**
3
+ * OpenMM x402 EVM Auto-Payment
4
+ * Implements EIP-3009 TransferWithAuthorization via EIP-712 typed data signing.
5
+ * Pure Node.js implementation — no external dependencies.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.hashTypedData = hashTypedData;
12
+ exports.isEvmNetwork = isEvmNetwork;
13
+ exports.createEvmPaymentPayload = createEvmPaymentPayload;
14
+ exports.checkEvmBalance = checkEvmBalance;
15
+ exports.getBaseRpcUrl = getBaseRpcUrl;
16
+ const crypto_1 = __importDefault(require("crypto"));
17
+ const crypto_2 = require("./crypto");
18
+ const DOMAIN_TYPES = [
19
+ { name: 'name', type: 'string' },
20
+ { name: 'version', type: 'string' },
21
+ { name: 'chainId', type: 'uint256' },
22
+ { name: 'verifyingContract', type: 'address' },
23
+ ];
24
+ const AUTHORIZATION_TYPES = [
25
+ { name: 'from', type: 'address' },
26
+ { name: 'to', type: 'address' },
27
+ { name: 'value', type: 'uint256' },
28
+ { name: 'validAfter', type: 'uint256' },
29
+ { name: 'validBefore', type: 'uint256' },
30
+ { name: 'nonce', type: 'bytes32' },
31
+ ];
32
+ /**
33
+ * Encode a type string for EIP-712 typeHash.
34
+ */
35
+ function encodeType(typeName, fields) {
36
+ const fieldStrs = fields.map(f => `${f.type} ${f.name}`);
37
+ return `${typeName}(${fieldStrs.join(',')})`;
38
+ }
39
+ /**
40
+ * Compute typeHash = keccak256(encodeType(...))
41
+ */
42
+ function typeHash(typeName, fields) {
43
+ return (0, crypto_2.keccak256)(Buffer.from(encodeType(typeName, fields), 'utf8'));
44
+ }
45
+ /**
46
+ * ABI-encode a single value to 32 bytes based on its EIP-712 type.
47
+ */
48
+ function encodeValue(fieldType, value) {
49
+ if (fieldType === 'string') {
50
+ // Strings are hashed
51
+ return (0, crypto_2.keccak256)(Buffer.from(value, 'utf8'));
52
+ }
53
+ if (fieldType === 'bytes') {
54
+ const buf = typeof value === 'string'
55
+ ? Buffer.from(value.replace(/^0x/, ''), 'hex')
56
+ : value;
57
+ return (0, crypto_2.keccak256)(buf);
58
+ }
59
+ if (fieldType === 'bytes32') {
60
+ if (typeof value === 'string') {
61
+ return Buffer.from(value.replace(/^0x/, ''), 'hex');
62
+ }
63
+ return value;
64
+ }
65
+ if (fieldType === 'address') {
66
+ // Left-pad address to 32 bytes
67
+ const addr = value.replace(/^0x/, '').toLowerCase();
68
+ return Buffer.from(addr.padStart(64, '0'), 'hex');
69
+ }
70
+ if (fieldType.startsWith('uint') || fieldType.startsWith('int')) {
71
+ // Encode as 32-byte big-endian
72
+ const hex = BigInt(value)
73
+ .toString(16)
74
+ .padStart(64, '0');
75
+ return Buffer.from(hex, 'hex');
76
+ }
77
+ if (fieldType === 'bool') {
78
+ return Buffer.from((value ? '1' : '0').padStart(64, '0'), 'hex');
79
+ }
80
+ throw new Error(`Unsupported EIP-712 field type: ${fieldType}`);
81
+ }
82
+ /**
83
+ * Compute struct hash = keccak256(typeHash || encodeValue(field1) || ...)
84
+ */
85
+ function hashStruct(typeName, fields, data) {
86
+ const parts = [typeHash(typeName, fields)];
87
+ for (const field of fields) {
88
+ const value = data[field.name];
89
+ if (value === undefined || value === null) {
90
+ throw new Error(`Missing EIP-712 field: ${field.name}`);
91
+ }
92
+ parts.push(encodeValue(field.type, value));
93
+ }
94
+ return (0, crypto_2.keccak256)(Buffer.concat(parts));
95
+ }
96
+ /**
97
+ * Compute EIP-712 domain separator hash.
98
+ */
99
+ function hashDomain(domain) {
100
+ return hashStruct('EIP712Domain', DOMAIN_TYPES, domain);
101
+ }
102
+ /**
103
+ * Compute EIP-712 final hash: keccak256("\x19\x01" || domainSeparator || structHash)
104
+ */
105
+ function hashTypedData(domain, primaryType, fields, message) {
106
+ const domainSeparator = hashDomain(domain);
107
+ const structHash = hashStruct(primaryType, fields, message);
108
+ return (0, crypto_2.keccak256)(Buffer.concat([Buffer.from([0x19, 0x01]), domainSeparator, structHash]));
109
+ }
110
+ // ============= x402 EVM Payment =============
111
+ /**
112
+ * Extract chain ID from CAIP-2 network identifier.
113
+ * e.g., "eip155:8453" → 8453
114
+ */
115
+ function getChainId(network) {
116
+ const match = network.match(/^eip155:(\d+)$/);
117
+ if (!match)
118
+ throw new Error(`Invalid EVM network: ${network}`);
119
+ return parseInt(match[1], 10);
120
+ }
121
+ /**
122
+ * Check if a network string is an EVM network.
123
+ */
124
+ function isEvmNetwork(network) {
125
+ return typeof network === 'string' && network.startsWith('eip155:');
126
+ }
127
+ /**
128
+ * Create an x402 payment payload for EVM (EIP-3009 TransferWithAuthorization).
129
+ *
130
+ * @param requirements - Parsed PaymentRequirements from 402 response
131
+ * @param privateKeyHex - 32-byte EVM private key as hex
132
+ * @param walletAddress - Signer's EVM address
133
+ * @param resource - Original request URL
134
+ * @returns Base64-encoded PaymentPayload for Payment-Signature header
135
+ */
136
+ function createEvmPaymentPayload(requirements, privateKeyHex, walletAddress, resource) {
137
+ const chainId = getChainId(requirements.network);
138
+ const extra = requirements.extra || {};
139
+ // Token name and version from requirements.extra (set by server/facilitator)
140
+ const tokenName = extra.name;
141
+ const tokenVersion = extra.version || '1';
142
+ if (!tokenName) {
143
+ throw new Error('EIP-712 domain name missing from requirements.extra');
144
+ }
145
+ // Generate random nonce (32 bytes)
146
+ const nonce = '0x' + crypto_1.default.randomBytes(32).toString('hex');
147
+ // Validity window: valid now, expires in 1 hour
148
+ const now = Math.floor(Date.now() / 1000);
149
+ const validAfter = '0';
150
+ const validBefore = String(now + 3600);
151
+ // EIP-712 domain
152
+ const domain = {
153
+ name: tokenName,
154
+ version: tokenVersion,
155
+ chainId,
156
+ verifyingContract: requirements.asset,
157
+ };
158
+ // EIP-3009 message
159
+ const message = {
160
+ from: walletAddress,
161
+ to: requirements.payTo || requirements.pay_to || '',
162
+ value: BigInt(requirements.amount),
163
+ validAfter: BigInt(validAfter),
164
+ validBefore: BigInt(validBefore),
165
+ nonce,
166
+ };
167
+ // Hash and sign
168
+ const msgHash = hashTypedData(domain, 'TransferWithAuthorization', AUTHORIZATION_TYPES, message);
169
+ const { r, s, v } = (0, crypto_2.signSecp256k1)(msgHash, Buffer.from(privateKeyHex, 'hex'));
170
+ const signature = '0x' + r.toString('hex') + s.toString('hex') + (27 + v).toString(16);
171
+ // Build payload (camelCase keys per x402 spec)
172
+ const payload = {
173
+ x402Version: 2,
174
+ payload: {
175
+ authorization: {
176
+ from: walletAddress,
177
+ to: message.to,
178
+ value: String(requirements.amount),
179
+ validAfter: validAfter,
180
+ validBefore: validBefore,
181
+ nonce: nonce,
182
+ },
183
+ signature: signature,
184
+ },
185
+ accepted: requirements,
186
+ };
187
+ // Add resource if provided
188
+ if (resource) {
189
+ payload.resource = { url: resource };
190
+ }
191
+ return Buffer.from(JSON.stringify(payload)).toString('base64');
192
+ }
193
+ /**
194
+ * Check USDC balance on Base network.
195
+ *
196
+ * @param address - EVM address to check
197
+ * @returns Balance in USD (number) or null if check fails
198
+ */
199
+ async function checkEvmBalance(address) {
200
+ try {
201
+ // Base USDC contract address
202
+ const USDC_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';
203
+ const addr = address.replace('0x', '').toLowerCase().padStart(64, '0');
204
+ const response = await fetch('https://mainnet.base.org', {
205
+ method: 'POST',
206
+ headers: { 'Content-Type': 'application/json' },
207
+ body: JSON.stringify({
208
+ jsonrpc: '2.0',
209
+ id: 1,
210
+ method: 'eth_call',
211
+ params: [{ to: USDC_BASE, data: `0x70a08231${addr}` }, 'latest'],
212
+ }),
213
+ });
214
+ const data = (await response.json());
215
+ if (!data.result)
216
+ return null;
217
+ return parseInt(data.result, 16) / 1e6;
218
+ }
219
+ catch {
220
+ return null;
221
+ }
222
+ }
223
+ /**
224
+ * Get Base network RPC URL.
225
+ */
226
+ function getBaseRpcUrl() {
227
+ return process.env.OPENMM_BASE_RPC || 'https://mainnet.base.org';
228
+ }
229
+ //# sourceMappingURL=evm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evm.js","sourceRoot":"","sources":["../../src/x402/evm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * OpenMM x402 Auto-Payment Handler
3
+ * Detects 402 responses and auto-signs payment using local wallet.
4
+ */
5
+ import type { PaymentRequirement, X402FetchOptions, X402BalanceResult } from './types';
6
+ /**
7
+ * Parse PaymentRequirements from a 402 response.
8
+ */
9
+ export declare function parsePaymentRequirements(response: Response): PaymentRequirement[] | null;
10
+ /**
11
+ * Generate payment signatures for all viable payment options, in priority order.
12
+ * Yields { signature, network } objects. Caller should try each until one succeeds.
13
+ */
14
+ export declare function createPaymentSignatures(response: Response, url: string, options?: {
15
+ password?: string;
16
+ walletName?: string;
17
+ }): AsyncGenerator<{
18
+ signature: string;
19
+ network: string;
20
+ }>;
21
+ /**
22
+ * Attempt to auto-pay a 402 response (single-shot, returns first viable signature).
23
+ */
24
+ export declare function createPaymentSignature(response: Response, url: string, options?: {
25
+ password?: string;
26
+ walletName?: string;
27
+ }): Promise<string | null>;
28
+ /**
29
+ * Check x402 payment wallet balance.
30
+ */
31
+ export declare function checkX402Balance(network: string): Promise<X402BalanceResult | null>;
32
+ /**
33
+ * Wrapper for fetch that handles x402 auto-payment.
34
+ *
35
+ * When a request returns HTTP 402:
36
+ * 1. Parses payment requirements from Payment-Required header
37
+ * 2. Signs payment using local wallet
38
+ * 3. Retries request with Payment-Signature header
39
+ */
40
+ export declare function x402Fetch(url: string, options?: X402FetchOptions): Promise<Response>;
41
+ /**
42
+ * Format payment requirements for display.
43
+ */
44
+ export declare function formatPaymentRequirements(requirements: PaymentRequirement[]): string;
45
+ /**
46
+ * Check if a response is a 402 payment required.
47
+ */
48
+ export declare function isPaymentRequired(response: Response): boolean;
49
+ /**
50
+ * Get supported payment networks from requirements.
51
+ */
52
+ export declare function getSupportedNetworks(requirements: PaymentRequirement[]): string[];
53
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/x402/handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAEhB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,kBAAkB,EAAE,GAAG,IAAI,CAiBxF;AA2CD;;;GAGG;AACH,wBAAuB,uBAAuB,CAC5C,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACvD,cAAc,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA8CxD;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACvD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAKxB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAkBzF;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,QAAQ,CAAC,CAoEnB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAepF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,kBAAkB,EAAE,GAAG,MAAM,EAAE,CAEjF"}