@3rd-eye-labs/openmm 0.1.1 → 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.
- package/dist/cli/cli.js +4 -0
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/commands/ohlcv.d.ts +3 -0
- package/dist/cli/commands/ohlcv.d.ts.map +1 -0
- package/dist/cli/commands/ohlcv.js +115 -0
- package/dist/cli/commands/ohlcv.js.map +1 -0
- package/dist/cli/commands/wallet.d.ts +7 -0
- package/dist/cli/commands/wallet.d.ts.map +1 -0
- package/dist/cli/commands/wallet.js +271 -0
- package/dist/cli/commands/wallet.js.map +1 -0
- package/dist/core/exchange/base-exchange-connector.d.ts +2 -1
- package/dist/core/exchange/base-exchange-connector.d.ts.map +1 -1
- package/dist/core/exchange/base-exchange-connector.js.map +1 -1
- package/dist/exchanges/bitget/bitget-connector.d.ts +11 -1
- package/dist/exchanges/bitget/bitget-connector.d.ts.map +1 -1
- package/dist/exchanges/bitget/bitget-connector.js +52 -0
- package/dist/exchanges/bitget/bitget-connector.js.map +1 -1
- package/dist/exchanges/gateio/gateio-connector.d.ts +11 -1
- package/dist/exchanges/gateio/gateio-connector.d.ts.map +1 -1
- package/dist/exchanges/gateio/gateio-connector.js +54 -0
- package/dist/exchanges/gateio/gateio-connector.js.map +1 -1
- package/dist/exchanges/kraken/kraken-connector.d.ts +6 -1
- package/dist/exchanges/kraken/kraken-connector.d.ts.map +1 -1
- package/dist/exchanges/kraken/kraken-connector.js +44 -0
- package/dist/exchanges/kraken/kraken-connector.js.map +1 -1
- package/dist/exchanges/mexc/mexc-auth.d.ts +1 -0
- package/dist/exchanges/mexc/mexc-auth.d.ts.map +1 -1
- package/dist/exchanges/mexc/mexc-auth.js +4 -1
- package/dist/exchanges/mexc/mexc-auth.js.map +1 -1
- package/dist/exchanges/mexc/mexc-connector.d.ts +6 -1
- package/dist/exchanges/mexc/mexc-connector.d.ts.map +1 -1
- package/dist/exchanges/mexc/mexc-connector.js +37 -0
- package/dist/exchanges/mexc/mexc-connector.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -1
- package/dist/index.js.map +1 -1
- package/dist/types/market.d.ts +15 -0
- package/dist/types/market.d.ts.map +1 -1
- package/dist/x402/crypto.d.ts +79 -0
- package/dist/x402/crypto.d.ts.map +1 -0
- package/dist/x402/crypto.js +300 -0
- package/dist/x402/crypto.js.map +1 -0
- package/dist/x402/evm.d.ts +41 -0
- package/dist/x402/evm.d.ts.map +1 -0
- package/dist/x402/evm.js +229 -0
- package/dist/x402/evm.js.map +1 -0
- package/dist/x402/handler.d.ts +53 -0
- package/dist/x402/handler.d.ts.map +1 -0
- package/dist/x402/handler.js +233 -0
- package/dist/x402/handler.js.map +1 -0
- package/dist/x402/index.d.ts +29 -0
- package/dist/x402/index.d.ts.map +1 -0
- package/dist/x402/index.js +67 -0
- package/dist/x402/index.js.map +1 -0
- package/dist/x402/types.d.ts +185 -0
- package/dist/x402/types.d.ts.map +1 -0
- package/dist/x402/types.js +7 -0
- package/dist/x402/types.js.map +1 -0
- package/dist/x402/wallet.d.ts +65 -0
- package/dist/x402/wallet.d.ts.map +1 -0
- package/dist/x402/wallet.js +282 -0
- package/dist/x402/wallet.js.map +1 -0
- package/package.json +1 -1
- package/dist/cli/commands/grid.d.ts +0 -3
- package/dist/cli/commands/grid.d.ts.map +0 -1
- package/dist/cli/commands/grid.js +0 -103
- package/dist/cli/commands/grid.js.map +0 -1
- package/dist/cli/commands/multi-trade.d.ts +0 -3
- package/dist/cli/commands/multi-trade.d.ts.map +0 -1
- package/dist/cli/commands/multi-trade.js +0 -175
- package/dist/cli/commands/multi-trade.js.map +0 -1
- package/dist/cli/pool-discovery.d.ts +0 -56
- package/dist/cli/pool-discovery.d.ts.map +0 -1
- package/dist/cli/pool-discovery.js +0 -283
- package/dist/cli/pool-discovery.js.map +0 -1
- package/dist/core/price-aggregation/price-cache.d.ts +0 -55
- package/dist/core/price-aggregation/price-cache.d.ts.map +0 -1
- package/dist/core/price-aggregation/price-cache.js +0 -152
- package/dist/core/price-aggregation/price-cache.js.map +0 -1
- package/dist/examples/mexc-connector-comprehensive-test.d.ts +0 -15
- package/dist/examples/mexc-connector-comprehensive-test.d.ts.map +0 -1
- package/dist/examples/mexc-connector-comprehensive-test.js +0 -514
- package/dist/examples/mexc-connector-comprehensive-test.js.map +0 -1
- package/dist/examples/mexc-order-update-test.d.ts +0 -4
- package/dist/examples/mexc-order-update-test.d.ts.map +0 -1
- package/dist/examples/mexc-order-update-test.js +0 -186
- package/dist/examples/mexc-order-update-test.js.map +0 -1
- package/dist/examples/mexc-test.d.ts +0 -9
- package/dist/examples/mexc-test.d.ts.map +0 -1
- package/dist/examples/mexc-test.js +0 -218
- package/dist/examples/mexc-test.js.map +0 -1
- package/dist/examples/mexc-trades-debug.d.ts +0 -2
- package/dist/examples/mexc-trades-debug.d.ts.map +0 -1
- package/dist/examples/mexc-trades-debug.js +0 -101
- package/dist/examples/mexc-trades-debug.js.map +0 -1
- package/dist/examples/mexc-trades-subscription-debug.d.ts +0 -2
- package/dist/examples/mexc-trades-subscription-debug.d.ts.map +0 -1
- package/dist/examples/mexc-trades-subscription-debug.js +0 -150
- package/dist/examples/mexc-trades-subscription-debug.js.map +0 -1
- package/dist/examples/mexc-websocket-test.d.ts +0 -8
- package/dist/examples/mexc-websocket-test.d.ts.map +0 -1
- package/dist/examples/mexc-websocket-test.js +0 -115
- package/dist/examples/mexc-websocket-test.js.map +0 -1
- package/dist/examples/test-protobuf-status-detection.d.ts +0 -9
- package/dist/examples/test-protobuf-status-detection.d.ts.map +0 -1
- package/dist/examples/test-protobuf-status-detection.js +0 -83
- package/dist/examples/test-protobuf-status-detection.js.map +0 -1
- package/dist/exchanges/base-exchange-connector.d.ts +0 -33
- package/dist/exchanges/base-exchange-connector.d.ts.map +0 -1
- package/dist/exchanges/base-exchange-connector.js +0 -55
- package/dist/exchanges/base-exchange-connector.js.map +0 -1
- package/dist/exchanges/kraken/test-kraken-websocket.d.ts +0 -19
- package/dist/exchanges/kraken/test-kraken-websocket.d.ts.map +0 -1
- package/dist/exchanges/kraken/test-kraken-websocket.js +0 -413
- package/dist/exchanges/kraken/test-kraken-websocket.js.map +0 -1
- package/dist/mcp/resources/index.d.ts +0 -3
- package/dist/mcp/resources/index.d.ts.map +0 -1
- package/dist/mcp/resources/index.js +0 -11
- package/dist/mcp/resources/index.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -4
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -29
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/tools/index.d.ts +0 -3
- package/dist/mcp/tools/index.d.ts.map +0 -1
- package/dist/mcp/tools/index.js +0 -12
- package/dist/mcp/tools/index.js.map +0 -1
- package/dist/tests/fixtures/test-helpers.d.ts +0 -5
- package/dist/tests/fixtures/test-helpers.d.ts.map +0 -1
- package/dist/tests/fixtures/test-helpers.js +0 -8
- package/dist/tests/fixtures/test-helpers.js.map +0 -1
- package/dist/tests/integration/exchanges/mexc/mexc-integration.test.d.ts +0 -2
- package/dist/tests/integration/exchanges/mexc/mexc-integration.test.d.ts.map +0 -1
- package/dist/tests/integration/exchanges/mexc/mexc-integration.test.js +0 -237
- package/dist/tests/integration/exchanges/mexc/mexc-integration.test.js.map +0 -1
- package/dist/tests/integration/price-aggregation/cardano-price-service.test.d.ts +0 -2
- package/dist/tests/integration/price-aggregation/cardano-price-service.test.d.ts.map +0 -1
- package/dist/tests/integration/price-aggregation/cardano-price-service.test.js +0 -57
- package/dist/tests/integration/price-aggregation/cardano-price-service.test.js.map +0 -1
- package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.d.ts +0 -2
- package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.d.ts.map +0 -1
- package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.js +0 -141
- package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.js.map +0 -1
- package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.d.ts +0 -2
- package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.d.ts.map +0 -1
- package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.js +0 -375
- package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.js.map +0 -1
- package/dist/tests/unit/cli/exchange-factory.test.d.ts +0 -2
- package/dist/tests/unit/cli/exchange-factory.test.d.ts.map +0 -1
- package/dist/tests/unit/cli/exchange-factory.test.js +0 -148
- package/dist/tests/unit/cli/exchange-factory.test.js.map +0 -1
- package/dist/tests/unit/config/environment.test.d.ts +0 -2
- package/dist/tests/unit/config/environment.test.d.ts.map +0 -1
- package/dist/tests/unit/config/environment.test.js +0 -158
- package/dist/tests/unit/config/environment.test.js.map +0 -1
- package/dist/tests/unit/config/launcher-config.test.d.ts +0 -2
- package/dist/tests/unit/config/launcher-config.test.d.ts.map +0 -1
- package/dist/tests/unit/config/launcher-config.test.js +0 -117
- package/dist/tests/unit/config/launcher-config.test.js.map +0 -1
- package/dist/tests/unit/config/price-aggregation.test.d.ts +0 -2
- package/dist/tests/unit/config/price-aggregation.test.d.ts.map +0 -1
- package/dist/tests/unit/config/price-aggregation.test.js +0 -144
- package/dist/tests/unit/config/price-aggregation.test.js.map +0 -1
- package/dist/tests/unit/core/exchange/base-exchange-connector.test.d.ts +0 -2
- package/dist/tests/unit/core/exchange/base-exchange-connector.test.d.ts.map +0 -1
- package/dist/tests/unit/core/exchange/base-exchange-connector.test.js +0 -191
- package/dist/tests/unit/core/exchange/base-exchange-connector.test.js.map +0 -1
- package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.d.ts +0 -2
- package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.d.ts.map +0 -1
- package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.js +0 -324
- package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.js.map +0 -1
- package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.d.ts +0 -2
- package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.d.ts.map +0 -1
- package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.js +0 -177
- package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.js.map +0 -1
- package/dist/tests/unit/core/price-aggregation/iris-api-client.test.d.ts +0 -2
- package/dist/tests/unit/core/price-aggregation/iris-api-client.test.d.ts.map +0 -1
- package/dist/tests/unit/core/price-aggregation/iris-api-client.test.js +0 -168
- package/dist/tests/unit/core/price-aggregation/iris-api-client.test.js.map +0 -1
- package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.d.ts +0 -2
- package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.d.ts.map +0 -1
- package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.js +0 -217
- package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.js.map +0 -1
- package/dist/tests/unit/core/price-aggregation/price-calculator.test.d.ts +0 -2
- package/dist/tests/unit/core/price-aggregation/price-calculator.test.d.ts.map +0 -1
- package/dist/tests/unit/core/price-aggregation/price-calculator.test.js +0 -229
- package/dist/tests/unit/core/price-aggregation/price-calculator.test.js.map +0 -1
- package/dist/tests/unit/core/risk-management/risk-manager.test.d.ts +0 -2
- package/dist/tests/unit/core/risk-management/risk-manager.test.d.ts.map +0 -1
- package/dist/tests/unit/core/risk-management/risk-manager.test.js +0 -194
- package/dist/tests/unit/core/risk-management/risk-manager.test.js.map +0 -1
- package/dist/tests/unit/core/strategy/base-strategy.test.d.ts +0 -2
- package/dist/tests/unit/core/strategy/base-strategy.test.d.ts.map +0 -1
- package/dist/tests/unit/core/strategy/base-strategy.test.js +0 -254
- package/dist/tests/unit/core/strategy/base-strategy.test.js.map +0 -1
- package/dist/tests/unit/core/strategy/strategy-factory.test.d.ts +0 -2
- package/dist/tests/unit/core/strategy/strategy-factory.test.d.ts.map +0 -1
- package/dist/tests/unit/core/strategy/strategy-factory.test.js +0 -213
- package/dist/tests/unit/core/strategy/strategy-factory.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-auth.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-auth.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-auth.test.js +0 -452
- package/dist/tests/unit/exchanges/mexc/mexc-auth.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-connector.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-connector.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-connector.test.js +0 -1419
- package/dist/tests/unit/exchanges/mexc/mexc-connector.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.js +0 -435
- package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.js +0 -314
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.js +0 -178
- package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.js +0 -502
- package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-utils.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-utils.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-utils.test.js +0 -317
- package/dist/tests/unit/exchanges/mexc/mexc-utils.test.js.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.d.ts +0 -2
- package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.d.ts.map +0 -1
- package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.js +0 -843
- package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.js.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-calculator.test.d.ts +0 -2
- package/dist/tests/unit/strategies/grid/grid-calculator.test.d.ts.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-calculator.test.js +0 -67
- package/dist/tests/unit/strategies/grid/grid-calculator.test.js.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-order-manager.test.d.ts +0 -2
- package/dist/tests/unit/strategies/grid/grid-order-manager.test.d.ts.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-order-manager.test.js +0 -211
- package/dist/tests/unit/strategies/grid/grid-order-manager.test.js.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.d.ts +0 -2
- package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.d.ts.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.js +0 -197
- package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.js.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-strategy.test.d.ts +0 -2
- package/dist/tests/unit/strategies/grid/grid-strategy.test.d.ts.map +0 -1
- package/dist/tests/unit/strategies/grid/grid-strategy.test.js +0 -429
- package/dist/tests/unit/strategies/grid/grid-strategy.test.js.map +0 -1
- package/dist/tests/unit/utils/logger.test.d.ts +0 -2
- package/dist/tests/unit/utils/logger.test.d.ts.map +0 -1
- package/dist/tests/unit/utils/logger.test.js +0 -260
- package/dist/tests/unit/utils/logger.test.js.map +0 -1
- package/dist/tests/unit/utils/symbol-utils.test.d.ts +0 -2
- package/dist/tests/unit/utils/symbol-utils.test.d.ts.map +0 -1
- package/dist/tests/unit/utils/symbol-utils.test.js +0 -178
- package/dist/tests/unit/utils/symbol-utils.test.js.map +0 -1
- package/dist/types/price-aggregation.d.ts +0 -31
- package/dist/types/price-aggregation.d.ts.map +0 -1
- package/dist/types/price-aggregation.js +0 -6
- package/dist/types/price-aggregation.js.map +0 -1
- package/dist/utils/crypto.d.ts +0 -15
- package/dist/utils/crypto.d.ts.map +0 -1
- package/dist/utils/crypto.js +0 -50
- package/dist/utils/crypto.js.map +0 -1
- package/dist/utils/validation.d.ts +0 -36
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/validation.js +0 -174
- package/dist/utils/validation.js.map +0 -1
package/dist/x402/evm.js
ADDED
|
@@ -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"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenMM x402 Auto-Payment Handler
|
|
4
|
+
* Detects 402 responses and auto-signs payment using local wallet.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.parsePaymentRequirements = parsePaymentRequirements;
|
|
8
|
+
exports.createPaymentSignatures = createPaymentSignatures;
|
|
9
|
+
exports.createPaymentSignature = createPaymentSignature;
|
|
10
|
+
exports.checkX402Balance = checkX402Balance;
|
|
11
|
+
exports.x402Fetch = x402Fetch;
|
|
12
|
+
exports.formatPaymentRequirements = formatPaymentRequirements;
|
|
13
|
+
exports.isPaymentRequired = isPaymentRequired;
|
|
14
|
+
exports.getSupportedNetworks = getSupportedNetworks;
|
|
15
|
+
const evm_1 = require("./evm");
|
|
16
|
+
const wallet_1 = require("./wallet");
|
|
17
|
+
/**
|
|
18
|
+
* Parse PaymentRequirements from a 402 response.
|
|
19
|
+
*/
|
|
20
|
+
function parsePaymentRequirements(response) {
|
|
21
|
+
const header = response.headers.get('payment-required');
|
|
22
|
+
if (!header)
|
|
23
|
+
return null;
|
|
24
|
+
try {
|
|
25
|
+
const decoded = JSON.parse(atob(header));
|
|
26
|
+
// V2 format: { accepts: [...], ... }
|
|
27
|
+
if (decoded.accepts && Array.isArray(decoded.accepts)) {
|
|
28
|
+
return decoded.accepts;
|
|
29
|
+
}
|
|
30
|
+
// Can be a single object or array of requirements
|
|
31
|
+
return Array.isArray(decoded) ? decoded : [decoded];
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Rank payment requirements. Prefers EVM (gasless) over Solana.
|
|
39
|
+
* Returns all supported requirements in priority order.
|
|
40
|
+
*/
|
|
41
|
+
function rankRequirements(requirements) {
|
|
42
|
+
const ranked = [];
|
|
43
|
+
// EVM first (gasless for client)
|
|
44
|
+
for (const r of requirements) {
|
|
45
|
+
if ((0, evm_1.isEvmNetwork)(r.network))
|
|
46
|
+
ranked.push(r);
|
|
47
|
+
}
|
|
48
|
+
// Solana support could be added here in the future
|
|
49
|
+
// for (const r of requirements) {
|
|
50
|
+
// if (isSvmNetwork(r.network)) ranked.push(r);
|
|
51
|
+
// }
|
|
52
|
+
return ranked;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Build a payment signature for a single requirement.
|
|
56
|
+
*/
|
|
57
|
+
async function buildPaymentForRequirement(requirement, exported, url) {
|
|
58
|
+
if ((0, evm_1.isEvmNetwork)(requirement.network)) {
|
|
59
|
+
return (0, evm_1.createEvmPaymentPayload)(requirement, exported.evm.privateKey, exported.evm.address, url);
|
|
60
|
+
}
|
|
61
|
+
// Solana support could be added here
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Generate payment signatures for all viable payment options, in priority order.
|
|
66
|
+
* Yields { signature, network } objects. Caller should try each until one succeeds.
|
|
67
|
+
*/
|
|
68
|
+
async function* createPaymentSignatures(response, url, options = {}) {
|
|
69
|
+
const requirements = parsePaymentRequirements(response);
|
|
70
|
+
if (!requirements || requirements.length === 0)
|
|
71
|
+
return;
|
|
72
|
+
const ranked = rankRequirements(requirements);
|
|
73
|
+
if (ranked.length === 0)
|
|
74
|
+
return;
|
|
75
|
+
const walletConfig = (0, wallet_1.getWalletConfig)();
|
|
76
|
+
const password = walletConfig.passwordHash
|
|
77
|
+
? options.password || (0, wallet_1.resolvePassword)() || null
|
|
78
|
+
: null;
|
|
79
|
+
if (walletConfig.passwordHash && password === null) {
|
|
80
|
+
console.error('Wallet is encrypted but no password provided.');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const wallets = (0, wallet_1.listWallets)();
|
|
84
|
+
if (wallets.wallets.length === 0) {
|
|
85
|
+
console.error('No wallets found. Create one with: openmm wallet create');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const walletName = options.walletName || wallets.defaultWallet;
|
|
89
|
+
if (!walletName) {
|
|
90
|
+
console.error('No default wallet set.');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
let exported;
|
|
94
|
+
try {
|
|
95
|
+
exported = (0, wallet_1.exportWallet)(walletName, password);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
console.error(`Failed to export wallet: ${err.message}`);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
for (const req of ranked) {
|
|
102
|
+
try {
|
|
103
|
+
const sig = await buildPaymentForRequirement(req, exported, url);
|
|
104
|
+
if (sig)
|
|
105
|
+
yield { signature: sig, network: req.network };
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// This payment option failed to build, try next
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Attempt to auto-pay a 402 response (single-shot, returns first viable signature).
|
|
115
|
+
*/
|
|
116
|
+
async function createPaymentSignature(response, url, options = {}) {
|
|
117
|
+
for await (const { signature } of createPaymentSignatures(response, url, options)) {
|
|
118
|
+
return signature;
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check x402 payment wallet balance.
|
|
124
|
+
*/
|
|
125
|
+
async function checkX402Balance(network) {
|
|
126
|
+
const addresses = (0, wallet_1.getDefaultWalletAddresses)();
|
|
127
|
+
if (!addresses)
|
|
128
|
+
return null;
|
|
129
|
+
if (network.startsWith('eip155:') && addresses.evm) {
|
|
130
|
+
const balance = await (0, evm_1.checkEvmBalance)(addresses.evm);
|
|
131
|
+
if (balance === null)
|
|
132
|
+
return null;
|
|
133
|
+
return {
|
|
134
|
+
network,
|
|
135
|
+
address: addresses.evm,
|
|
136
|
+
balance,
|
|
137
|
+
symbol: 'USDC',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// Solana support could be added here
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Wrapper for fetch that handles x402 auto-payment.
|
|
145
|
+
*
|
|
146
|
+
* When a request returns HTTP 402:
|
|
147
|
+
* 1. Parses payment requirements from Payment-Required header
|
|
148
|
+
* 2. Signs payment using local wallet
|
|
149
|
+
* 3. Retries request with Payment-Signature header
|
|
150
|
+
*/
|
|
151
|
+
async function x402Fetch(url, options = {}) {
|
|
152
|
+
const { walletName, password, skipPayment, maxRetries = 1, ...fetchOptions } = options;
|
|
153
|
+
// Make initial request
|
|
154
|
+
let response = await fetch(url, fetchOptions);
|
|
155
|
+
// If not a 402 or payment is skipped, return as-is
|
|
156
|
+
if (response.status !== 402 || skipPayment) {
|
|
157
|
+
return response;
|
|
158
|
+
}
|
|
159
|
+
// Parse payment requirements
|
|
160
|
+
const requirements = parsePaymentRequirements(response);
|
|
161
|
+
if (!requirements || requirements.length === 0) {
|
|
162
|
+
console.error('402 response but no valid payment requirements found');
|
|
163
|
+
return response;
|
|
164
|
+
}
|
|
165
|
+
// Check wallet balance before attempting payment
|
|
166
|
+
const ranked = rankRequirements(requirements);
|
|
167
|
+
if (ranked.length === 0) {
|
|
168
|
+
console.error('No supported payment networks in requirements');
|
|
169
|
+
return response;
|
|
170
|
+
}
|
|
171
|
+
const firstReq = ranked[0];
|
|
172
|
+
const balanceResult = await checkX402Balance(firstReq.network);
|
|
173
|
+
if (balanceResult) {
|
|
174
|
+
const requiredAmount = parseFloat(firstReq.amount) / 1e6; // Assuming 6 decimals
|
|
175
|
+
if (balanceResult.balance < requiredAmount) {
|
|
176
|
+
console.error(`Insufficient balance: ${balanceResult.balance} ${balanceResult.symbol}, ` +
|
|
177
|
+
`required: ${requiredAmount} ${balanceResult.symbol}`);
|
|
178
|
+
console.error(`Fund your wallet: ${balanceResult.address}`);
|
|
179
|
+
return response;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Try to create payment signature
|
|
183
|
+
const signature = await createPaymentSignature(response, url, { password, walletName });
|
|
184
|
+
if (!signature) {
|
|
185
|
+
console.error('Failed to create payment signature');
|
|
186
|
+
return response;
|
|
187
|
+
}
|
|
188
|
+
// Retry with payment signature
|
|
189
|
+
let retries = 0;
|
|
190
|
+
while (retries < maxRetries) {
|
|
191
|
+
const retryHeaders = new Headers(fetchOptions.headers);
|
|
192
|
+
retryHeaders.set('Payment-Signature', signature);
|
|
193
|
+
response = await fetch(url, {
|
|
194
|
+
...fetchOptions,
|
|
195
|
+
headers: retryHeaders,
|
|
196
|
+
});
|
|
197
|
+
// If no longer 402, we're done
|
|
198
|
+
if (response.status !== 402) {
|
|
199
|
+
return response;
|
|
200
|
+
}
|
|
201
|
+
retries++;
|
|
202
|
+
}
|
|
203
|
+
return response;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Format payment requirements for display.
|
|
207
|
+
*/
|
|
208
|
+
function formatPaymentRequirements(requirements) {
|
|
209
|
+
const lines = ['Payment required:'];
|
|
210
|
+
for (const req of requirements) {
|
|
211
|
+
const network = req.network;
|
|
212
|
+
const amount = parseFloat(req.amount) / 1e6; // Assuming 6 decimals
|
|
213
|
+
const payTo = req.payTo || req.pay_to || 'unknown';
|
|
214
|
+
lines.push(` Network: ${network}`);
|
|
215
|
+
lines.push(` Amount: ${amount.toFixed(6)} USDC`);
|
|
216
|
+
lines.push(` Pay to: ${payTo}`);
|
|
217
|
+
lines.push('');
|
|
218
|
+
}
|
|
219
|
+
return lines.join('\n');
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Check if a response is a 402 payment required.
|
|
223
|
+
*/
|
|
224
|
+
function isPaymentRequired(response) {
|
|
225
|
+
return response.status === 402;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Get supported payment networks from requirements.
|
|
229
|
+
*/
|
|
230
|
+
function getSupportedNetworks(requirements) {
|
|
231
|
+
return rankRequirements(requirements).map(r => r.network);
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/x402/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenMM x402 Payment Module
|
|
3
|
+
*
|
|
4
|
+
* Provides x402 payment protocol support for auto-paying API requests
|
|
5
|
+
* that return HTTP 402 Payment Required.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Local wallet management (EVM + Solana)
|
|
9
|
+
* - EIP-3009 TransferWithAuthorization for gasless USDC payments on Base
|
|
10
|
+
* - Auto-detection and handling of 402 responses
|
|
11
|
+
* - Secure key storage with AES-256-GCM encryption
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { x402Fetch, createWallet, checkX402Balance } from './x402';
|
|
16
|
+
*
|
|
17
|
+
* // Create a wallet
|
|
18
|
+
* const wallet = createWallet('my-wallet', 'my-secure-password');
|
|
19
|
+
*
|
|
20
|
+
* // Use x402Fetch instead of fetch for auto-payment
|
|
21
|
+
* const response = await x402Fetch('https://api.example.com/data');
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export type { PaymentRequirement, PaymentRequiredResponse, EvmWallet, SolanaWallet, EncryptedKey, StoredWallet, WalletConfig, ExportedWallet, WalletListEntry, EIP712Domain, TransferAuthorization, ECDSASignature, X402PaymentPayload, X402FetchOptions, X402BalanceResult, } from './types';
|
|
25
|
+
export { createWallet, listWallets, showWallet, exportWallet, setDefaultWallet, deleteWallet, getWalletConfig, resolvePassword, getDefaultWalletAddresses, } from './wallet';
|
|
26
|
+
export { createEvmPaymentPayload, isEvmNetwork, checkEvmBalance, hashTypedData, getBaseRpcUrl, } from './evm';
|
|
27
|
+
export { x402Fetch, parsePaymentRequirements, createPaymentSignature, createPaymentSignatures, checkX402Balance, formatPaymentRequirements, isPaymentRequired, getSupportedNetworks, } from './handler';
|
|
28
|
+
export { keccak256, signSecp256k1, encryptKey, decryptKey, hashPassword, verifyPassword, generatePrivateKey, privateKeyToEvmAddress, generateSolanaKeypair, base58Encode, } from './crypto';
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/x402/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,YAAY,EACV,kBAAkB,EAClB,uBAAuB,EACvB,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EACf,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,yBAAyB,GAC1B,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,GACd,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,SAAS,EACT,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,SAAS,EACT,aAAa,EACb,UAAU,EACV,UAAU,EACV,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,YAAY,GACb,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenMM x402 Payment Module
|
|
4
|
+
*
|
|
5
|
+
* Provides x402 payment protocol support for auto-paying API requests
|
|
6
|
+
* that return HTTP 402 Payment Required.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Local wallet management (EVM + Solana)
|
|
10
|
+
* - EIP-3009 TransferWithAuthorization for gasless USDC payments on Base
|
|
11
|
+
* - Auto-detection and handling of 402 responses
|
|
12
|
+
* - Secure key storage with AES-256-GCM encryption
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* ```typescript
|
|
16
|
+
* import { x402Fetch, createWallet, checkX402Balance } from './x402';
|
|
17
|
+
*
|
|
18
|
+
* // Create a wallet
|
|
19
|
+
* const wallet = createWallet('my-wallet', 'my-secure-password');
|
|
20
|
+
*
|
|
21
|
+
* // Use x402Fetch instead of fetch for auto-payment
|
|
22
|
+
* const response = await x402Fetch('https://api.example.com/data');
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.base58Encode = exports.generateSolanaKeypair = exports.privateKeyToEvmAddress = exports.generatePrivateKey = exports.verifyPassword = exports.hashPassword = exports.decryptKey = exports.encryptKey = exports.signSecp256k1 = exports.keccak256 = exports.getSupportedNetworks = exports.isPaymentRequired = exports.formatPaymentRequirements = exports.checkX402Balance = exports.createPaymentSignatures = exports.createPaymentSignature = exports.parsePaymentRequirements = exports.x402Fetch = exports.getBaseRpcUrl = exports.hashTypedData = exports.checkEvmBalance = exports.isEvmNetwork = exports.createEvmPaymentPayload = exports.getDefaultWalletAddresses = exports.resolvePassword = exports.getWalletConfig = exports.deleteWallet = exports.setDefaultWallet = exports.exportWallet = exports.showWallet = exports.listWallets = exports.createWallet = void 0;
|
|
27
|
+
// Wallet management
|
|
28
|
+
var wallet_1 = require("./wallet");
|
|
29
|
+
Object.defineProperty(exports, "createWallet", { enumerable: true, get: function () { return wallet_1.createWallet; } });
|
|
30
|
+
Object.defineProperty(exports, "listWallets", { enumerable: true, get: function () { return wallet_1.listWallets; } });
|
|
31
|
+
Object.defineProperty(exports, "showWallet", { enumerable: true, get: function () { return wallet_1.showWallet; } });
|
|
32
|
+
Object.defineProperty(exports, "exportWallet", { enumerable: true, get: function () { return wallet_1.exportWallet; } });
|
|
33
|
+
Object.defineProperty(exports, "setDefaultWallet", { enumerable: true, get: function () { return wallet_1.setDefaultWallet; } });
|
|
34
|
+
Object.defineProperty(exports, "deleteWallet", { enumerable: true, get: function () { return wallet_1.deleteWallet; } });
|
|
35
|
+
Object.defineProperty(exports, "getWalletConfig", { enumerable: true, get: function () { return wallet_1.getWalletConfig; } });
|
|
36
|
+
Object.defineProperty(exports, "resolvePassword", { enumerable: true, get: function () { return wallet_1.resolvePassword; } });
|
|
37
|
+
Object.defineProperty(exports, "getDefaultWalletAddresses", { enumerable: true, get: function () { return wallet_1.getDefaultWalletAddresses; } });
|
|
38
|
+
// EVM payment
|
|
39
|
+
var evm_1 = require("./evm");
|
|
40
|
+
Object.defineProperty(exports, "createEvmPaymentPayload", { enumerable: true, get: function () { return evm_1.createEvmPaymentPayload; } });
|
|
41
|
+
Object.defineProperty(exports, "isEvmNetwork", { enumerable: true, get: function () { return evm_1.isEvmNetwork; } });
|
|
42
|
+
Object.defineProperty(exports, "checkEvmBalance", { enumerable: true, get: function () { return evm_1.checkEvmBalance; } });
|
|
43
|
+
Object.defineProperty(exports, "hashTypedData", { enumerable: true, get: function () { return evm_1.hashTypedData; } });
|
|
44
|
+
Object.defineProperty(exports, "getBaseRpcUrl", { enumerable: true, get: function () { return evm_1.getBaseRpcUrl; } });
|
|
45
|
+
// x402 handler
|
|
46
|
+
var handler_1 = require("./handler");
|
|
47
|
+
Object.defineProperty(exports, "x402Fetch", { enumerable: true, get: function () { return handler_1.x402Fetch; } });
|
|
48
|
+
Object.defineProperty(exports, "parsePaymentRequirements", { enumerable: true, get: function () { return handler_1.parsePaymentRequirements; } });
|
|
49
|
+
Object.defineProperty(exports, "createPaymentSignature", { enumerable: true, get: function () { return handler_1.createPaymentSignature; } });
|
|
50
|
+
Object.defineProperty(exports, "createPaymentSignatures", { enumerable: true, get: function () { return handler_1.createPaymentSignatures; } });
|
|
51
|
+
Object.defineProperty(exports, "checkX402Balance", { enumerable: true, get: function () { return handler_1.checkX402Balance; } });
|
|
52
|
+
Object.defineProperty(exports, "formatPaymentRequirements", { enumerable: true, get: function () { return handler_1.formatPaymentRequirements; } });
|
|
53
|
+
Object.defineProperty(exports, "isPaymentRequired", { enumerable: true, get: function () { return handler_1.isPaymentRequired; } });
|
|
54
|
+
Object.defineProperty(exports, "getSupportedNetworks", { enumerable: true, get: function () { return handler_1.getSupportedNetworks; } });
|
|
55
|
+
// Crypto utilities (for advanced use)
|
|
56
|
+
var crypto_1 = require("./crypto");
|
|
57
|
+
Object.defineProperty(exports, "keccak256", { enumerable: true, get: function () { return crypto_1.keccak256; } });
|
|
58
|
+
Object.defineProperty(exports, "signSecp256k1", { enumerable: true, get: function () { return crypto_1.signSecp256k1; } });
|
|
59
|
+
Object.defineProperty(exports, "encryptKey", { enumerable: true, get: function () { return crypto_1.encryptKey; } });
|
|
60
|
+
Object.defineProperty(exports, "decryptKey", { enumerable: true, get: function () { return crypto_1.decryptKey; } });
|
|
61
|
+
Object.defineProperty(exports, "hashPassword", { enumerable: true, get: function () { return crypto_1.hashPassword; } });
|
|
62
|
+
Object.defineProperty(exports, "verifyPassword", { enumerable: true, get: function () { return crypto_1.verifyPassword; } });
|
|
63
|
+
Object.defineProperty(exports, "generatePrivateKey", { enumerable: true, get: function () { return crypto_1.generatePrivateKey; } });
|
|
64
|
+
Object.defineProperty(exports, "privateKeyToEvmAddress", { enumerable: true, get: function () { return crypto_1.privateKeyToEvmAddress; } });
|
|
65
|
+
Object.defineProperty(exports, "generateSolanaKeypair", { enumerable: true, get: function () { return crypto_1.generateSolanaKeypair; } });
|
|
66
|
+
Object.defineProperty(exports, "base58Encode", { enumerable: true, get: function () { return crypto_1.base58Encode; } });
|
|
67
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/x402/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAqBH,oBAAoB;AACpB,mCAUkB;AAThB,sGAAA,YAAY,OAAA;AACZ,qGAAA,WAAW,OAAA;AACX,oGAAA,UAAU,OAAA;AACV,sGAAA,YAAY,OAAA;AACZ,0GAAA,gBAAgB,OAAA;AAChB,sGAAA,YAAY,OAAA;AACZ,yGAAA,eAAe,OAAA;AACf,yGAAA,eAAe,OAAA;AACf,mHAAA,yBAAyB,OAAA;AAG3B,cAAc;AACd,6BAMe;AALb,8GAAA,uBAAuB,OAAA;AACvB,mGAAA,YAAY,OAAA;AACZ,sGAAA,eAAe,OAAA;AACf,oGAAA,aAAa,OAAA;AACb,oGAAA,aAAa,OAAA;AAGf,eAAe;AACf,qCASmB;AARjB,oGAAA,SAAS,OAAA;AACT,mHAAA,wBAAwB,OAAA;AACxB,iHAAA,sBAAsB,OAAA;AACtB,kHAAA,uBAAuB,OAAA;AACvB,2GAAA,gBAAgB,OAAA;AAChB,oHAAA,yBAAyB,OAAA;AACzB,4GAAA,iBAAiB,OAAA;AACjB,+GAAA,oBAAoB,OAAA;AAGtB,sCAAsC;AACtC,mCAWkB;AAVhB,mGAAA,SAAS,OAAA;AACT,uGAAA,aAAa,OAAA;AACb,oGAAA,UAAU,OAAA;AACV,oGAAA,UAAU,OAAA;AACV,sGAAA,YAAY,OAAA;AACZ,wGAAA,cAAc,OAAA;AACd,4GAAA,kBAAkB,OAAA;AAClB,gHAAA,sBAAsB,OAAA;AACtB,+GAAA,qBAAqB,OAAA;AACrB,sGAAA,YAAY,OAAA"}
|