@faremeter/payment-evm 0.1.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAYhC,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE;QACP,aAAa,EAAE,CAAC,MAAM,EAAE;YACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC/B,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAClC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;KACpB,CAAC;CACH;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,cAAc,CA2F7E"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,kBAAkB,CAAC;AAO1B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAWhC,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE;QACP,aAAa,EAAE,CAAC,MAAM,EAAE;YACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC/B,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAClC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;KACpB,CAAC;CACH;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,cAAc,CA+G7E"}
@@ -1,8 +1,20 @@
1
1
  import { randomBytes } from "crypto";
2
+ import { isKnownNetwork, lookupKnownNetwork, lookupKnownAsset, } from "@faremeter/info/evm";
2
3
  import { isAddress } from "viem";
3
4
  import { type } from "arktype";
4
- import { X402_EXACT_SCHEME, USDC_BASE_SEPOLIA, EIP712_TYPES, eip712Domain, } from "./constants.js";
5
+ import { X402_EXACT_SCHEME, EIP712_TYPES, eip712Domain, } from "./constants.js";
5
6
  export function createPaymentHandler(wallet) {
7
+ if (!isKnownNetwork(wallet.network)) {
8
+ throw new Error(`Wallet was created for unsupported network '${wallet.network}'`);
9
+ }
10
+ const networkInfo = lookupKnownNetwork(wallet.network);
11
+ if (!networkInfo) {
12
+ throw new Error(`Couldn't look up network info for network '${wallet.network}'`);
13
+ }
14
+ const assetInfo = lookupKnownAsset(wallet.network, "USDC");
15
+ if (!assetInfo) {
16
+ throw new Error(`Couldn't look up USDC information on network '${wallet.network}'`);
17
+ }
6
18
  return async function handlePayment(context, accepts) {
7
19
  const compatibleRequirements = accepts.filter((req) => req.scheme === X402_EXACT_SCHEME && req.network === wallet.network);
8
20
  return compatibleRequirements.map((requirements) => ({
@@ -32,13 +44,13 @@ export function createPaymentHandler(wallet) {
32
44
  throw new Error(`Invalid EIP-712 domain parameters: ${extraResult.summary}`);
33
45
  }
34
46
  const domain = {
35
- name: extraResult.name ?? "USDC",
47
+ name: extraResult.name ?? assetInfo.name,
36
48
  version: extraResult.version ?? "2",
37
- chainId: extraResult.chainId ?? 84532,
49
+ chainId: extraResult.chainId ?? networkInfo.chainId,
38
50
  verifyingContract: (() => {
39
51
  const asset = extraResult.verifyingContract ??
40
52
  requirements.asset ??
41
- USDC_BASE_SEPOLIA;
53
+ assetInfo.address;
42
54
  if (!isAddress(asset)) {
43
55
  throw new Error(`Invalid asset address: ${asset}`);
44
56
  }
@@ -1,7 +1,5 @@
1
1
  export declare const X402_EXACT_SCHEME = "exact";
2
2
  export declare const BASE_SEPOLIA_NETWORK = "base-sepolia";
3
- export declare const BASE_SEPOLIA_CHAIN_ID = 84532;
4
- export declare const USDC_BASE_SEPOLIA = "0x036cbd53842c5426634e7929541ec2318f3dcf7e";
5
3
  export declare const TRANSFER_WITH_AUTHORIZATION_ABI: readonly [{
6
4
  readonly name: "transferWithAuthorization";
7
5
  readonly type: "function";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,iBAAiB,UAAU,CAAC;AACzC,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AACnD,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAC3C,eAAO,MAAM,iBAAiB,+CAA+C,CAAC;AAE9E,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDlC,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;CASf,CAAC;AAEX,eAAO,MAAM,gBAAgB;;;;;;;;;;MAU3B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,OAAO,gBAAgB,CAAC,KAAK,CAAC;AAC7D,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;AAErE,eAAO,MAAM,YAAY;;;;;MAKvB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,KAAK,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,iBAAiB,UAAU,CAAC;AACzC,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AAEnD,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDlC,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;CASf,CAAC;AAEX,eAAO,MAAM,gBAAgB;;;;;;;;;;MAU3B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,OAAO,gBAAgB,CAAC,KAAK,CAAC;AAC7D,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;AAErE,eAAO,MAAM,YAAY;;;;;MAKvB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,KAAK,CAAC"}
@@ -8,8 +8,6 @@ const prefixedHexString = type("string").pipe.try((x) => {
8
8
  });
9
9
  export const X402_EXACT_SCHEME = "exact";
10
10
  export const BASE_SEPOLIA_NETWORK = "base-sepolia";
11
- export const BASE_SEPOLIA_CHAIN_ID = 84532;
12
- export const USDC_BASE_SEPOLIA = "0x036cbd53842c5426634e7929541ec2318f3dcf7e";
13
11
  export const TRANSFER_WITH_AUTHORIZATION_ABI = [
14
12
  {
15
13
  name: "transferWithAuthorization",
@@ -1,4 +1,4 @@
1
1
  import { type FacilitatorHandler } from "@faremeter/types";
2
- import type { PublicClient, Hex, WalletClient } from "viem";
3
- export declare function createFacilitatorHandler(network: string, publicClient: PublicClient, walletClient: WalletClient, receivingAddress: Hex, asset?: string): FacilitatorHandler;
2
+ import type { PublicClient, WalletClient } from "viem";
3
+ export declare function createFacilitatorHandler(network: string, publicClient: PublicClient, walletClient: WalletClient, assetName: string): FacilitatorHandler;
4
4
  //# sourceMappingURL=facilitator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"facilitator.d.ts","sourceRoot":"","sources":["../../src/facilitator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAKxB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAW,MAAM,MAAM,CAAC;AAgCrE,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,GAAG,EACrB,KAAK,SAAoB,GACxB,kBAAkB,CA4PpB"}
1
+ {"version":3,"file":"facilitator.d.ts","sourceRoot":"","sources":["../../src/facilitator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAMxB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,YAAY,EAAO,YAAY,EAAW,MAAM,MAAM,CAAC;AAoCrE,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,GAChB,kBAAkB,CA6QpB"}
@@ -1,8 +1,9 @@
1
- import { isValidationError, } from "@faremeter/types";
1
+ import { isValidationError, caseInsensitiveLiteral, } from "@faremeter/types";
2
2
  import { type } from "arktype";
3
3
  import { verifyTypedData, encodeFunctionData, isAddress } from "viem";
4
4
  import { baseSepolia } from "viem/chains";
5
- import { X402_EXACT_SCHEME, BASE_SEPOLIA_NETWORK, BASE_SEPOLIA_CHAIN_ID, USDC_BASE_SEPOLIA, TRANSFER_WITH_AUTHORIZATION_ABI, EIP712_TYPES, x402ExactPayload, } from "./constants.js";
5
+ import { isKnownAsset, lookupKnownAsset, lookupKnownNetwork, } from "@faremeter/info/evm";
6
+ import { X402_EXACT_SCHEME, BASE_SEPOLIA_NETWORK, TRANSFER_WITH_AUTHORIZATION_ABI, EIP712_TYPES, x402ExactPayload, } from "./constants.js";
6
7
  function errorResponse(msg) {
7
8
  return {
8
9
  success: false,
@@ -19,18 +20,32 @@ function parseSignature(signature) {
19
20
  const v = parseInt(sig.slice(128, 130), 16);
20
21
  return { v, r, s };
21
22
  }
22
- export function createFacilitatorHandler(network, publicClient, walletClient, receivingAddress, asset = USDC_BASE_SEPOLIA) {
23
+ export function createFacilitatorHandler(network, publicClient, walletClient, assetName) {
23
24
  if (network !== BASE_SEPOLIA_NETWORK) {
24
25
  throw new Error(`Unsupported network: ${network}. Only base-sepolia is supported.`);
25
26
  }
27
+ const networkInfo = lookupKnownNetwork(network);
28
+ if (!networkInfo) {
29
+ throw new Error(`Couldn't look up information for ${network}`);
30
+ }
31
+ if (!isKnownAsset(assetName)) {
32
+ throw new Error(`Unknown asset: ${assetName}`);
33
+ }
34
+ const assetInfo = lookupKnownAsset(network, assetName);
35
+ if (!assetInfo) {
36
+ throw new Error(`Couldn't look up asset ${assetName} on ${network}`);
37
+ }
38
+ const asset = assetInfo.address;
26
39
  if (!isAddress(asset)) {
27
40
  throw new Error(`Invalid asset address: ${asset}`);
28
41
  }
29
42
  const checkTuple = type({
30
- scheme: `'${X402_EXACT_SCHEME}'`,
31
- network: `'${network}'`,
43
+ scheme: caseInsensitiveLiteral(X402_EXACT_SCHEME),
44
+ network: caseInsensitiveLiteral(network),
45
+ });
46
+ const checkTupleAndAsset = checkTuple.and({
47
+ asset: caseInsensitiveLiteral(asset),
32
48
  });
33
- const checkTupleAndAsset = checkTuple.and({ asset: `'${asset}'` });
34
49
  const getRequirements = async (req) => {
35
50
  return req
36
51
  .filter((x) => !isValidationError(checkTupleAndAsset(x)))
@@ -38,12 +53,11 @@ export function createFacilitatorHandler(network, publicClient, walletClient, re
38
53
  ...x,
39
54
  asset,
40
55
  maxTimeoutSeconds: 300,
41
- payTo: receivingAddress,
42
56
  // Provide EIP-712 domain parameters for client signing
43
57
  extra: {
44
- name: "USDC",
58
+ name: assetName,
45
59
  version: "2",
46
- chainId: BASE_SEPOLIA_CHAIN_ID,
60
+ chainId: networkInfo.chainId,
47
61
  verifyingContract: asset,
48
62
  },
49
63
  }));
@@ -60,7 +74,7 @@ export function createFacilitatorHandler(network, publicClient, walletClient, re
60
74
  }
61
75
  const { authorization, signature } = payloadResult;
62
76
  // Check if the payment is to the correct address
63
- if (authorization.to.toLowerCase() !== receivingAddress.toLowerCase()) {
77
+ if (authorization.to.toLowerCase() !== requirements.payTo.toLowerCase()) {
64
78
  return errorResponse("Payment authorized to wrong address");
65
79
  }
66
80
  // Check if the amount matches
@@ -211,7 +225,7 @@ export function createFacilitatorHandler(network, publicClient, walletClient, re
211
225
  success: true,
212
226
  error: null,
213
227
  txHash,
214
- networkId: BASE_SEPOLIA_CHAIN_ID.toString(),
228
+ networkId: networkInfo.chainId.toString(),
215
229
  };
216
230
  }
217
231
  catch (error) {
@@ -1,4 +1,4 @@
1
1
  export { createPaymentHandler } from "./client.js";
2
2
  export { createFacilitatorHandler } from "./facilitator.js";
3
- export { X402_EXACT_SCHEME, BASE_SEPOLIA_NETWORK, BASE_SEPOLIA_CHAIN_ID, USDC_BASE_SEPOLIA, TRANSFER_WITH_AUTHORIZATION_ABI, EIP712_TYPES, x402ExactPayload, eip712Domain, } from "./constants.js";
3
+ export { X402_EXACT_SCHEME, BASE_SEPOLIA_NETWORK, TRANSFER_WITH_AUTHORIZATION_ABI, EIP712_TYPES, x402ExactPayload, eip712Domain, } from "./constants.js";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,+BAA+B,EAC/B,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACb,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,+BAA+B,EAC/B,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACb,MAAM,gBAAgB,CAAC"}
package/dist/src/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  export { createPaymentHandler } from "./client.js";
2
2
  export { createFacilitatorHandler } from "./facilitator.js";
3
- export { X402_EXACT_SCHEME, BASE_SEPOLIA_NETWORK, BASE_SEPOLIA_CHAIN_ID, USDC_BASE_SEPOLIA, TRANSFER_WITH_AUTHORIZATION_ABI, EIP712_TYPES, x402ExactPayload, eip712Domain, } from "./constants.js";
3
+ export { X402_EXACT_SCHEME, BASE_SEPOLIA_NETWORK, TRANSFER_WITH_AUTHORIZATION_ABI, EIP712_TYPES, x402ExactPayload, eip712Domain, } from "./constants.js";