@faremeter/rides 0.14.0 → 0.15.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.
- package/dist/src/evm.d.ts +4 -4
- package/dist/src/evm.d.ts.map +1 -1
- package/dist/src/evm.js +37 -7
- package/dist/src/internal.d.ts +1 -0
- package/dist/src/internal.d.ts.map +1 -1
- package/dist/src/internal.js +42 -6
- package/dist/src/solana.d.ts +8 -6
- package/dist/src/solana.d.ts.map +1 -1
- package/dist/src/solana.js +32 -6
- package/dist/src/types.d.ts +14 -2
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +5 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -9
package/dist/src/evm.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type ContractInfo } from "@faremeter/info/evm";
|
|
2
|
-
import { type
|
|
3
|
-
import { type
|
|
2
|
+
import { type WalletAdapter } from "./types.js";
|
|
3
|
+
import { type Chain } from "viem";
|
|
4
4
|
export declare function findNetworkAssetCombinations(networks: readonly string[], assets: readonly string[]): {
|
|
5
|
-
chain:
|
|
5
|
+
chain: Chain;
|
|
6
6
|
contractInfo: ContractInfo[];
|
|
7
7
|
}[];
|
|
8
8
|
export type CreateAdapterOptions = {
|
|
@@ -10,6 +10,6 @@ export type CreateAdapterOptions = {
|
|
|
10
10
|
assets: readonly string[];
|
|
11
11
|
};
|
|
12
12
|
export declare function createAdapter(opts: CreateAdapterOptions): {
|
|
13
|
-
addLocalWallet: (input: unknown) => Promise<
|
|
13
|
+
addLocalWallet: (input: unknown) => Promise<WalletAdapter[] | null>;
|
|
14
14
|
} | undefined;
|
|
15
15
|
//# sourceMappingURL=evm.d.ts.map
|
package/dist/src/evm.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../../src/evm.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../../src/evm.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,OAAO,EAA4B,KAAK,KAAK,EAAE,MAAM,MAAM,CAAC;AAa5D,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,MAAM,EAAE,SAAS,MAAM,EAAE,GACxB;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,YAAY,EAAE,YAAY,EAAE,CAAA;CAAE,EAAE,CAyBlD;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,oBAAoB;4BAQtB,OAAO;cAiDxC"}
|
package/dist/src/evm.js
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
|
-
import { lookupKnownAsset, } from "@faremeter/info/evm";
|
|
1
|
+
import { lookupX402Network, lookupKnownAsset, } from "@faremeter/info/evm";
|
|
2
2
|
import { createLocalWallet } from "@faremeter/wallet-evm";
|
|
3
3
|
import { exact } from "@faremeter/payment-evm";
|
|
4
|
+
import { getTokenBalance } from "@faremeter/payment-evm/erc20";
|
|
4
5
|
import { isValidationError } from "@faremeter/types";
|
|
5
|
-
import {} from "
|
|
6
|
+
import {} from "./types.js";
|
|
6
7
|
import { PrivateKey } from "@faremeter/types/evm";
|
|
8
|
+
import { createPublicClient, http } from "viem";
|
|
7
9
|
import * as chains from "viem/chains";
|
|
8
10
|
const networkAliases = new Map(Object.entries({
|
|
9
11
|
base: chains.base,
|
|
10
12
|
"base-sepolia": chains.baseSepolia,
|
|
13
|
+
polygon: chains.polygon,
|
|
14
|
+
"polygon-amoy": chains.polygonAmoy,
|
|
15
|
+
monad: chains.monad,
|
|
16
|
+
"monad-testnet": chains.monadTestnet,
|
|
11
17
|
}));
|
|
12
18
|
export function findNetworkAssetCombinations(networks, assets) {
|
|
13
19
|
const chains = networks
|
|
@@ -43,16 +49,40 @@ export function createAdapter(opts) {
|
|
|
43
49
|
// We don't know what this private key is.
|
|
44
50
|
return null;
|
|
45
51
|
}
|
|
46
|
-
const
|
|
52
|
+
const res = [];
|
|
47
53
|
for (const { chain, contractInfo } of chains) {
|
|
54
|
+
const publicClient = createPublicClient({
|
|
55
|
+
chain,
|
|
56
|
+
transport: http(),
|
|
57
|
+
});
|
|
48
58
|
for (const asset of contractInfo) {
|
|
49
59
|
const wallet = await createLocalWallet(chain, privateKey);
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
60
|
+
res.push({
|
|
61
|
+
x402Id: [
|
|
62
|
+
{
|
|
63
|
+
scheme: "exact",
|
|
64
|
+
asset: asset.address,
|
|
65
|
+
network: lookupX402Network(chain.id),
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
paymentHandler: exact.createPaymentHandler(wallet, {
|
|
69
|
+
asset,
|
|
70
|
+
}),
|
|
71
|
+
getBalance: async () => {
|
|
72
|
+
const balance = await getTokenBalance({
|
|
73
|
+
account: wallet.address,
|
|
74
|
+
asset: asset.address,
|
|
75
|
+
client: publicClient,
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
...balance,
|
|
79
|
+
name: asset.contractName,
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
});
|
|
53
83
|
}
|
|
54
84
|
}
|
|
55
|
-
return
|
|
85
|
+
return res;
|
|
56
86
|
},
|
|
57
87
|
};
|
|
58
88
|
}
|
package/dist/src/internal.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/internal.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/internal.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,UAAU,EAGhB,MAAM,SAAS,CAAC;AAKjB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,QAAQ,CAAC;QACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;KAChC,CAAC;CACH;AAMD,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,eAAe;4BAuEhB,OAAO;mBAiC5B,WAAW,GAAG,GAAG,SACjB,WAAW,KACjB,OAAO,CAAC,QAAQ,CAAC;EAKvB;AAED,eAAO,MAAM,KAAK;4BA1CgB,OAAO;mBAiC5B,WAAW,GAAG,GAAG,SACjB,WAAW,KACjB,OAAO,CAAC,QAAQ,CAAC;CAOU,CAAC"}
|
package/dist/src/internal.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
+
import { x402PaymentId } from "@faremeter/types/x402";
|
|
2
|
+
import {} from "@faremeter/types/client";
|
|
3
|
+
import { wrap as wrapFetch, chooseFirstAvailable, } from "@faremeter/fetch";
|
|
1
4
|
import {} from "@faremeter/types/client";
|
|
2
|
-
import { wrap as wrapFetch } from "@faremeter/fetch";
|
|
3
5
|
import { KnownNetworks, KnownAssets, } from "./types.js";
|
|
4
6
|
import * as solana from "./solana.js";
|
|
5
7
|
import * as evm from "./evm.js";
|
|
8
|
+
function idKey({ network, scheme, asset }) {
|
|
9
|
+
return `${network}\0${scheme}\0${asset}`;
|
|
10
|
+
}
|
|
6
11
|
export function createPayer(args) {
|
|
7
12
|
const { networks = KnownNetworks, assets = KnownAssets, fetch = globalThis.fetch, } = args ?? {};
|
|
8
13
|
const paymentHandlers = [];
|
|
14
|
+
const balanceLookup = new Map();
|
|
9
15
|
const adapters = [];
|
|
10
16
|
for (const plugin of [solana, evm]) {
|
|
11
17
|
const adapter = plugin.createAdapter({ networks, assets });
|
|
@@ -13,12 +19,37 @@ export function createPayer(args) {
|
|
|
13
19
|
adapters.push(adapter);
|
|
14
20
|
}
|
|
15
21
|
}
|
|
22
|
+
const wrapFetchOptions = {
|
|
23
|
+
...(args?.options?.fetch ?? {}),
|
|
24
|
+
};
|
|
25
|
+
if (!args?.options?.disableBalanceChecks) {
|
|
26
|
+
const finalChooser = args?.options?.fetch?.payerChooser ?? chooseFirstAvailable;
|
|
27
|
+
wrapFetchOptions.payerChooser = async function (execer) {
|
|
28
|
+
const viableOptions = [];
|
|
29
|
+
for (const e of execer) {
|
|
30
|
+
const req = e.requirements;
|
|
31
|
+
const getBalance = balanceLookup.get(idKey(req));
|
|
32
|
+
if (getBalance === undefined) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const balance = await getBalance();
|
|
36
|
+
// XXX - We need to do a better job of understanding decimals here.
|
|
37
|
+
if (balance.amount < BigInt(req.maxAmountRequired)) {
|
|
38
|
+
// eslint-disable-next-line no-console
|
|
39
|
+
console.log(`Not paying with ${balance.name} on ${req.network} using the ${req.scheme} scheme: balance is ${balance.amount} which is less than ${req.maxAmountRequired}`);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
viableOptions.push(e);
|
|
43
|
+
}
|
|
44
|
+
return finalChooser(viableOptions);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
16
47
|
const setupFetch = () => {
|
|
17
48
|
if (paymentHandlers.length < 1) {
|
|
18
49
|
throw new Error("no usable wallets have been attached to enable payment");
|
|
19
50
|
}
|
|
20
51
|
return wrapFetch(fetch, {
|
|
21
|
-
...
|
|
52
|
+
...wrapFetchOptions,
|
|
22
53
|
handlers: paymentHandlers,
|
|
23
54
|
});
|
|
24
55
|
};
|
|
@@ -29,18 +60,23 @@ export function createPayer(args) {
|
|
|
29
60
|
throw new Error("undefined is not a valid local wallet");
|
|
30
61
|
}
|
|
31
62
|
_fetch = undefined;
|
|
32
|
-
const
|
|
63
|
+
const newWallets = [];
|
|
33
64
|
for (const adapter of adapters) {
|
|
34
65
|
const res = await adapter.addLocalWallet(input);
|
|
35
66
|
if (res === null) {
|
|
36
67
|
continue;
|
|
37
68
|
}
|
|
38
|
-
|
|
69
|
+
newWallets.push(...res);
|
|
39
70
|
}
|
|
40
|
-
if (
|
|
71
|
+
if (newWallets.length === 0) {
|
|
41
72
|
throw new Error("couldn't find any way to use provided local wallet information");
|
|
42
73
|
}
|
|
43
|
-
paymentHandlers.push(...
|
|
74
|
+
paymentHandlers.push(...newWallets.map((x) => x.paymentHandler));
|
|
75
|
+
for (const wallet of newWallets) {
|
|
76
|
+
for (const id of wallet.x402Id) {
|
|
77
|
+
balanceLookup.set(idKey(id), wallet.getBalance);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
44
80
|
},
|
|
45
81
|
fetch: async (input, init) => {
|
|
46
82
|
_fetch ??= setupFetch();
|
package/dist/src/solana.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import {
|
|
3
|
-
import { PublicKey, Keypair } from "@solana/web3.js";
|
|
1
|
+
import { type WalletAdapter } from "./types.js";
|
|
2
|
+
import { Keypair } from "@solana/web3.js";
|
|
4
3
|
export declare function findNetworkMintCombinations(networks: readonly string[], assets: readonly string[]): {
|
|
5
|
-
cluster:
|
|
6
|
-
mints:
|
|
4
|
+
cluster: "testnet" | "devnet" | "mainnet-beta";
|
|
5
|
+
mints: {
|
|
6
|
+
address: string;
|
|
7
|
+
name: "USDC";
|
|
8
|
+
}[];
|
|
7
9
|
}[];
|
|
8
10
|
export declare const matchKeyPair: import("arktype/internal/match.ts").Match<unknown, [(In: Uint8Array<ArrayBufferLike>) => Keypair, (In: string) => Keypair, () => undefined]>;
|
|
9
11
|
export declare function toKeypair(input: unknown): Promise<Keypair | undefined>;
|
|
@@ -12,6 +14,6 @@ export type CreateAdapterOptions = {
|
|
|
12
14
|
assets: readonly string[];
|
|
13
15
|
};
|
|
14
16
|
export declare function createAdapter(opts: CreateAdapterOptions): {
|
|
15
|
-
addLocalWallet: (input: unknown) => Promise<
|
|
17
|
+
addLocalWallet: (input: unknown) => Promise<WalletAdapter[] | null>;
|
|
16
18
|
} | undefined;
|
|
17
19
|
//# sourceMappingURL=solana.d.ts.map
|
package/dist/src/solana.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../src/solana.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../src/solana.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C,OAAO,EAAa,OAAO,EAA6B,MAAM,iBAAiB,CAAC;AAWhF,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,MAAM,EAAE,SAAS,MAAM,EAAE;;;;;;IA2B1B;AAED,eAAO,MAAM,YAAY,8IAKvB,CAAC;AAEH,wBAAsB,SAAS,CAAC,KAAK,EAAE,OAAO,gCAe7C;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,oBAAoB;4BAQtB,OAAO;cAwDxC"}
|
package/dist/src/solana.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { match } from "arktype";
|
|
2
|
-
import { lookupKnownSPLToken, } from "@faremeter/info/solana";
|
|
2
|
+
import { lookupX402Network, lookupKnownSPLToken, } from "@faremeter/info/solana";
|
|
3
3
|
import { createLocalWallet } from "@faremeter/wallet-solana";
|
|
4
4
|
import { exact } from "@faremeter/payment-solana";
|
|
5
|
-
import {} from "
|
|
5
|
+
import {} from "./types.js";
|
|
6
|
+
import { getTokenBalance } from "@faremeter/payment-solana/splToken";
|
|
6
7
|
import { isValidationError } from "@faremeter/types";
|
|
7
8
|
import { PublicKey, Keypair, clusterApiUrl, Connection } from "@solana/web3.js";
|
|
9
|
+
import { createSolanaRpc } from "@solana/kit";
|
|
8
10
|
import { readLocalFile } from "./common.js";
|
|
9
11
|
const networkAliases = new Map(Object.entries({
|
|
10
12
|
solana: "mainnet-beta",
|
|
@@ -21,7 +23,7 @@ export function findNetworkMintCombinations(networks, assets) {
|
|
|
21
23
|
const mints = assets
|
|
22
24
|
.map((name) => lookupKnownSPLToken(cluster, name))
|
|
23
25
|
.filter((x) => x !== undefined)
|
|
24
|
-
.map((
|
|
26
|
+
.map(({ address, name }) => ({ address, name }));
|
|
25
27
|
if (mints.length === 0) {
|
|
26
28
|
return [];
|
|
27
29
|
}
|
|
@@ -63,15 +65,39 @@ export function createAdapter(opts) {
|
|
|
63
65
|
// We don't know what this private key is.
|
|
64
66
|
return null;
|
|
65
67
|
}
|
|
66
|
-
const
|
|
68
|
+
const res = [];
|
|
67
69
|
for (const { cluster, mints } of clusters) {
|
|
70
|
+
const rpcURL = clusterApiUrl(cluster);
|
|
71
|
+
const rpcClient = createSolanaRpc(rpcURL);
|
|
68
72
|
for (const mint of mints) {
|
|
69
73
|
const connection = new Connection(clusterApiUrl(cluster), "confirmed");
|
|
70
74
|
const wallet = await createLocalWallet(cluster, privateKey);
|
|
71
|
-
|
|
75
|
+
res.push({
|
|
76
|
+
x402Id: lookupX402Network(cluster).map((network) => ({
|
|
77
|
+
scheme: "exact",
|
|
78
|
+
asset: mint.address,
|
|
79
|
+
network,
|
|
80
|
+
})),
|
|
81
|
+
paymentHandler: exact.createPaymentHandler(wallet, new PublicKey(mint.address), connection),
|
|
82
|
+
getBalance: async () => {
|
|
83
|
+
let balance = await getTokenBalance({
|
|
84
|
+
account: privateKey.publicKey.toBase58(),
|
|
85
|
+
asset: mint.address,
|
|
86
|
+
rpcClient,
|
|
87
|
+
});
|
|
88
|
+
balance ??= {
|
|
89
|
+
amount: 0n,
|
|
90
|
+
decimals: 0,
|
|
91
|
+
};
|
|
92
|
+
return {
|
|
93
|
+
...balance,
|
|
94
|
+
name: mint.name,
|
|
95
|
+
};
|
|
96
|
+
},
|
|
97
|
+
});
|
|
72
98
|
}
|
|
73
99
|
}
|
|
74
|
-
return
|
|
100
|
+
return res;
|
|
75
101
|
},
|
|
76
102
|
};
|
|
77
103
|
}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -1,9 +1,21 @@
|
|
|
1
|
+
import { x402PaymentId } from "@faremeter/types/x402";
|
|
1
2
|
import { type PaymentHandler } from "@faremeter/types/client";
|
|
2
|
-
export declare const KnownNetworks: readonly ["base", "base-sepolia", "solana", "solana-devnet"];
|
|
3
|
+
export declare const KnownNetworks: readonly ["base", "base-sepolia", "monad", "monad-testnet", "polygon", "polygon-amoy", "solana", "solana-devnet"];
|
|
3
4
|
export type KnownNetwork = (typeof KnownNetworks)[number];
|
|
4
5
|
export declare const KnownAssets: readonly ["USDC"];
|
|
5
6
|
export type KnownAsset = (typeof KnownAssets)[number];
|
|
7
|
+
export type Balance = {
|
|
8
|
+
name: string;
|
|
9
|
+
amount: bigint;
|
|
10
|
+
decimals: number;
|
|
11
|
+
};
|
|
12
|
+
export type GetBalance = () => Promise<Balance>;
|
|
13
|
+
export interface WalletAdapter {
|
|
14
|
+
x402Id: x402PaymentId[];
|
|
15
|
+
paymentHandler: PaymentHandler;
|
|
16
|
+
getBalance: GetBalance;
|
|
17
|
+
}
|
|
6
18
|
export interface PayerAdapter {
|
|
7
|
-
addLocalWallet: (input: unknown) => Promise<
|
|
19
|
+
addLocalWallet: (input: unknown) => Promise<WalletAdapter[] | null>;
|
|
8
20
|
}
|
|
9
21
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,eAAO,MAAM,aAAa,mHAShB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,eAAO,MAAM,WAAW,mBAAoB,CAAC;AAC7C,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtD,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,CAAC;CACrE"}
|
package/dist/src/types.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
import { x402PaymentId } from "@faremeter/types/x402";
|
|
1
2
|
import {} from "@faremeter/types/client";
|
|
2
3
|
export const KnownNetworks = [
|
|
3
4
|
"base",
|
|
4
5
|
"base-sepolia",
|
|
6
|
+
"monad",
|
|
7
|
+
"monad-testnet",
|
|
8
|
+
"polygon",
|
|
9
|
+
"polygon-amoy",
|
|
5
10
|
"solana",
|
|
6
11
|
"solana-devnet",
|
|
7
12
|
];
|