@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.
- package/README.md +6 -1
- 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/pool-discovery.d.ts.map +1 -1
- package/dist/cli/commands/pool-discovery.js +13 -4
- package/dist/cli/commands/pool-discovery.js.map +1 -1
- 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/cli/pool-discovery-core.d.ts +2 -1
- package/dist/cli/pool-discovery-core.d.ts.map +1 -1
- package/dist/cli/pool-discovery-core.js +66 -30
- package/dist/cli/pool-discovery-core.js.map +1 -1
- 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
|
@@ -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"}
|
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"}
|