@agent-shield/custody-crossmint 0.1.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/adapter.d.ts +104 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +180 -0
- package/dist/adapter.js.map +1 -0
- package/dist/config.d.ts +45 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +58 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CrossmintWallet — WalletLike adapter for Crossmint TEE-backed signing.
|
|
3
|
+
*
|
|
4
|
+
* The private key lives in Crossmint's hardware enclave (Intel TDX).
|
|
5
|
+
* The agent only gets a signing interface — it never sees or touches the key.
|
|
6
|
+
*
|
|
7
|
+
* Works with shield() out of the box:
|
|
8
|
+
* const wallet = shield(await crossmint({ apiKey }), { maxSpend: '500 USDC/day' });
|
|
9
|
+
*/
|
|
10
|
+
import { PublicKey, Transaction, VersionedTransaction } from "@solana/web3.js";
|
|
11
|
+
import { CrossmintWalletConfig } from "./config";
|
|
12
|
+
/**
|
|
13
|
+
* Minimal wallet interface — identical to the one in @agent-shield/solana.
|
|
14
|
+
* Duplicated here to avoid a hard dependency on the wrapper package.
|
|
15
|
+
*/
|
|
16
|
+
export interface WalletLike {
|
|
17
|
+
publicKey: PublicKey;
|
|
18
|
+
signTransaction<T extends Transaction | VersionedTransaction>(tx: T): Promise<T>;
|
|
19
|
+
signAllTransactions?<T extends Transaction | VersionedTransaction>(txs: T[]): Promise<T[]>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Abstraction over the Crossmint SDK client for testability.
|
|
23
|
+
* In production, this wraps @crossmint/wallets-sdk.
|
|
24
|
+
* In tests, a mock implementation is injected.
|
|
25
|
+
*/
|
|
26
|
+
export interface CrossmintSDKClient {
|
|
27
|
+
/** Create a new wallet and return its address + locator. */
|
|
28
|
+
createWallet(params: {
|
|
29
|
+
chain: string;
|
|
30
|
+
signer: {
|
|
31
|
+
type: string;
|
|
32
|
+
};
|
|
33
|
+
linkedUser?: string;
|
|
34
|
+
}): Promise<{
|
|
35
|
+
address: string;
|
|
36
|
+
locator: string;
|
|
37
|
+
}>;
|
|
38
|
+
/** Get an existing wallet's address by locator. */
|
|
39
|
+
getWallet(locator: string): Promise<{
|
|
40
|
+
address: string;
|
|
41
|
+
}>;
|
|
42
|
+
/** Sign a serialized transaction. Returns the signed transaction bytes (base64). */
|
|
43
|
+
signTransaction(locator: string, transaction: string, encoding: "base58" | "base64"): Promise<{
|
|
44
|
+
signedTransaction: string;
|
|
45
|
+
}>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Default SDK client that calls Crossmint's REST API directly.
|
|
49
|
+
* This avoids a hard dependency on @crossmint/wallets-sdk at runtime,
|
|
50
|
+
* making it easy to swap, mock, or use the REST API directly.
|
|
51
|
+
*/
|
|
52
|
+
export declare class CrossmintRESTClient implements CrossmintSDKClient {
|
|
53
|
+
private readonly apiKey;
|
|
54
|
+
private readonly baseUrl;
|
|
55
|
+
constructor(apiKey: string, baseUrl: string);
|
|
56
|
+
createWallet(params: {
|
|
57
|
+
chain: string;
|
|
58
|
+
signer: {
|
|
59
|
+
type: string;
|
|
60
|
+
};
|
|
61
|
+
linkedUser?: string;
|
|
62
|
+
}): Promise<{
|
|
63
|
+
address: string;
|
|
64
|
+
locator: string;
|
|
65
|
+
}>;
|
|
66
|
+
getWallet(locator: string): Promise<{
|
|
67
|
+
address: string;
|
|
68
|
+
}>;
|
|
69
|
+
signTransaction(locator: string, transaction: string, encoding: "base58" | "base64"): Promise<{
|
|
70
|
+
signedTransaction: string;
|
|
71
|
+
}>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* CrossmintWallet — a WalletLike that signs transactions via Crossmint's TEE.
|
|
75
|
+
*
|
|
76
|
+
* Use the static `create()` method to instantiate:
|
|
77
|
+
* const wallet = await CrossmintWallet.create({ apiKey: '...' });
|
|
78
|
+
* const shielded = shield(wallet, { maxSpend: '500 USDC/day' });
|
|
79
|
+
*/
|
|
80
|
+
export declare class CrossmintWallet implements WalletLike {
|
|
81
|
+
readonly publicKey: PublicKey;
|
|
82
|
+
readonly locator: string;
|
|
83
|
+
readonly provider: string;
|
|
84
|
+
private readonly client;
|
|
85
|
+
private constructor();
|
|
86
|
+
/**
|
|
87
|
+
* Create a CrossmintWallet. If no locator is provided, a new wallet is created
|
|
88
|
+
* via the Crossmint API. The private key never leaves the TEE.
|
|
89
|
+
*/
|
|
90
|
+
static create(config: CrossmintWalletConfig,
|
|
91
|
+
/** Injectable SDK client for testing. Uses REST client by default. */
|
|
92
|
+
client?: CrossmintSDKClient): Promise<CrossmintWallet>;
|
|
93
|
+
/**
|
|
94
|
+
* Sign a transaction via Crossmint's TEE.
|
|
95
|
+
* The transaction is serialized, sent to Crossmint, signed in hardware,
|
|
96
|
+
* and the signed result is deserialized back.
|
|
97
|
+
*/
|
|
98
|
+
signTransaction<T extends Transaction | VersionedTransaction>(tx: T): Promise<T>;
|
|
99
|
+
/**
|
|
100
|
+
* Sign multiple transactions sequentially via the TEE.
|
|
101
|
+
*/
|
|
102
|
+
signAllTransactions<T extends Transaction | VersionedTransaction>(txs: T[]): Promise<T[]>;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/adapter.js
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CrossmintWallet — WalletLike adapter for Crossmint TEE-backed signing.
|
|
4
|
+
*
|
|
5
|
+
* The private key lives in Crossmint's hardware enclave (Intel TDX).
|
|
6
|
+
* The agent only gets a signing interface — it never sees or touches the key.
|
|
7
|
+
*
|
|
8
|
+
* Works with shield() out of the box:
|
|
9
|
+
* const wallet = shield(await crossmint({ apiKey }), { maxSpend: '500 USDC/day' });
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CrossmintWallet = exports.CrossmintRESTClient = void 0;
|
|
13
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
14
|
+
const config_1 = require("./config");
|
|
15
|
+
/**
|
|
16
|
+
* Default SDK client that calls Crossmint's REST API directly.
|
|
17
|
+
* This avoids a hard dependency on @crossmint/wallets-sdk at runtime,
|
|
18
|
+
* making it easy to swap, mock, or use the REST API directly.
|
|
19
|
+
*/
|
|
20
|
+
class CrossmintRESTClient {
|
|
21
|
+
constructor(apiKey, baseUrl) {
|
|
22
|
+
this.apiKey = apiKey;
|
|
23
|
+
this.baseUrl = baseUrl.replace(/\/$/, "");
|
|
24
|
+
}
|
|
25
|
+
async createWallet(params) {
|
|
26
|
+
const body = {
|
|
27
|
+
type: "solana-mpc-wallet",
|
|
28
|
+
config: {
|
|
29
|
+
adminSigner: { type: params.signer.type },
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
if (params.linkedUser) {
|
|
33
|
+
body.linkedUser = params.linkedUser;
|
|
34
|
+
}
|
|
35
|
+
const res = await fetch(`${this.baseUrl}/api/2022-06-09/wallets`, {
|
|
36
|
+
method: "POST",
|
|
37
|
+
headers: {
|
|
38
|
+
"X-API-KEY": this.apiKey,
|
|
39
|
+
"Content-Type": "application/json",
|
|
40
|
+
},
|
|
41
|
+
body: JSON.stringify(body),
|
|
42
|
+
});
|
|
43
|
+
if (!res.ok) {
|
|
44
|
+
const text = await res.text();
|
|
45
|
+
throw new Error(`Crossmint wallet creation failed (${res.status}): ${text}`);
|
|
46
|
+
}
|
|
47
|
+
const data = (await res.json());
|
|
48
|
+
const address = data.address;
|
|
49
|
+
if (!address) {
|
|
50
|
+
throw new Error("Crossmint wallet creation returned no address. Response: " +
|
|
51
|
+
JSON.stringify(data));
|
|
52
|
+
}
|
|
53
|
+
const locator = data.locator || `wallet:${address}`;
|
|
54
|
+
return { address, locator };
|
|
55
|
+
}
|
|
56
|
+
async getWallet(locator) {
|
|
57
|
+
const encodedLocator = encodeURIComponent(locator);
|
|
58
|
+
const res = await fetch(`${this.baseUrl}/api/2022-06-09/wallets/${encodedLocator}`, {
|
|
59
|
+
method: "GET",
|
|
60
|
+
headers: {
|
|
61
|
+
"X-API-KEY": this.apiKey,
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
if (!res.ok) {
|
|
65
|
+
const text = await res.text();
|
|
66
|
+
throw new Error(`Crossmint get wallet failed (${res.status}): ${text}`);
|
|
67
|
+
}
|
|
68
|
+
const data = (await res.json());
|
|
69
|
+
const address = data.address;
|
|
70
|
+
if (!address) {
|
|
71
|
+
throw new Error("Crossmint wallet lookup returned no address. Response: " +
|
|
72
|
+
JSON.stringify(data));
|
|
73
|
+
}
|
|
74
|
+
return { address };
|
|
75
|
+
}
|
|
76
|
+
async signTransaction(locator, transaction, encoding) {
|
|
77
|
+
const encodedLocator = encodeURIComponent(locator);
|
|
78
|
+
const res = await fetch(`${this.baseUrl}/api/2022-06-09/wallets/${encodedLocator}/transactions`, {
|
|
79
|
+
method: "POST",
|
|
80
|
+
headers: {
|
|
81
|
+
"X-API-KEY": this.apiKey,
|
|
82
|
+
"Content-Type": "application/json",
|
|
83
|
+
},
|
|
84
|
+
body: JSON.stringify({
|
|
85
|
+
params: {
|
|
86
|
+
transaction,
|
|
87
|
+
encoding,
|
|
88
|
+
},
|
|
89
|
+
}),
|
|
90
|
+
});
|
|
91
|
+
if (!res.ok) {
|
|
92
|
+
const text = await res.text();
|
|
93
|
+
throw new Error(`Crossmint transaction signing failed (${res.status}): ${text}`);
|
|
94
|
+
}
|
|
95
|
+
const data = (await res.json());
|
|
96
|
+
const signedTransaction = data.signedTransaction;
|
|
97
|
+
if (!signedTransaction) {
|
|
98
|
+
throw new Error("Crossmint signing returned no signedTransaction. Response: " +
|
|
99
|
+
JSON.stringify(data));
|
|
100
|
+
}
|
|
101
|
+
return { signedTransaction };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.CrossmintRESTClient = CrossmintRESTClient;
|
|
105
|
+
/**
|
|
106
|
+
* CrossmintWallet — a WalletLike that signs transactions via Crossmint's TEE.
|
|
107
|
+
*
|
|
108
|
+
* Use the static `create()` method to instantiate:
|
|
109
|
+
* const wallet = await CrossmintWallet.create({ apiKey: '...' });
|
|
110
|
+
* const shielded = shield(wallet, { maxSpend: '500 USDC/day' });
|
|
111
|
+
*/
|
|
112
|
+
class CrossmintWallet {
|
|
113
|
+
constructor(publicKey, locator, client) {
|
|
114
|
+
this.provider = "crossmint";
|
|
115
|
+
this.publicKey = publicKey;
|
|
116
|
+
this.locator = locator;
|
|
117
|
+
this.client = client;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create a CrossmintWallet. If no locator is provided, a new wallet is created
|
|
121
|
+
* via the Crossmint API. The private key never leaves the TEE.
|
|
122
|
+
*/
|
|
123
|
+
static async create(config,
|
|
124
|
+
/** Injectable SDK client for testing. Uses REST client by default. */
|
|
125
|
+
client) {
|
|
126
|
+
(0, config_1.validateConfig)(config);
|
|
127
|
+
const baseUrl = config.baseUrl || "https://www.crossmint.com";
|
|
128
|
+
const sdkClient = client || new CrossmintRESTClient(config.apiKey, baseUrl);
|
|
129
|
+
const chain = config.chain || "solana";
|
|
130
|
+
const signerType = config.signerType || "api-key";
|
|
131
|
+
let address;
|
|
132
|
+
let locator;
|
|
133
|
+
if (config.locator) {
|
|
134
|
+
// Use existing wallet
|
|
135
|
+
locator = config.locator;
|
|
136
|
+
const wallet = await sdkClient.getWallet(locator);
|
|
137
|
+
address = wallet.address;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
// Create new wallet
|
|
141
|
+
const result = await sdkClient.createWallet({
|
|
142
|
+
chain,
|
|
143
|
+
signer: { type: signerType },
|
|
144
|
+
linkedUser: config.linkedUser,
|
|
145
|
+
});
|
|
146
|
+
address = result.address;
|
|
147
|
+
locator = result.locator;
|
|
148
|
+
}
|
|
149
|
+
const publicKey = new web3_js_1.PublicKey(address);
|
|
150
|
+
return new CrossmintWallet(publicKey, locator, sdkClient);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Sign a transaction via Crossmint's TEE.
|
|
154
|
+
* The transaction is serialized, sent to Crossmint, signed in hardware,
|
|
155
|
+
* and the signed result is deserialized back.
|
|
156
|
+
*/
|
|
157
|
+
async signTransaction(tx) {
|
|
158
|
+
const serialized = Buffer.from(tx.serialize({ requireAllSignatures: false, verifySignatures: false })).toString("base64");
|
|
159
|
+
const { signedTransaction } = await this.client.signTransaction(this.locator, serialized, "base64");
|
|
160
|
+
const signedBytes = Buffer.from(signedTransaction, "base64");
|
|
161
|
+
if (tx instanceof web3_js_1.Transaction) {
|
|
162
|
+
return web3_js_1.Transaction.from(signedBytes);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
return web3_js_1.VersionedTransaction.deserialize(signedBytes);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Sign multiple transactions sequentially via the TEE.
|
|
170
|
+
*/
|
|
171
|
+
async signAllTransactions(txs) {
|
|
172
|
+
const results = [];
|
|
173
|
+
for (const tx of txs) {
|
|
174
|
+
results.push(await this.signTransaction(tx));
|
|
175
|
+
}
|
|
176
|
+
return results;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
exports.CrossmintWallet = CrossmintWallet;
|
|
180
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration and environment variable parsing for Crossmint custody adapter.
|
|
3
|
+
*/
|
|
4
|
+
/** Signer type for the Crossmint wallet. */
|
|
5
|
+
export type CrossmintSignerType = "api-key" | "evm-keypair";
|
|
6
|
+
/**
|
|
7
|
+
* Configuration for creating a CrossmintWallet.
|
|
8
|
+
*/
|
|
9
|
+
export interface CrossmintWalletConfig {
|
|
10
|
+
/** Crossmint server-side API key (requires wallets.create + wallets:transactions.sign scopes) */
|
|
11
|
+
apiKey: string;
|
|
12
|
+
/** Existing wallet locator (e.g. "wallet:<address>" or "email:<user>"). Creates new wallet if omitted. */
|
|
13
|
+
locator?: string;
|
|
14
|
+
/** Chain to use. Default: "solana" */
|
|
15
|
+
chain?: string;
|
|
16
|
+
/** Signer type for wallet creation. Default: "api-key" (custodial, fully headless) */
|
|
17
|
+
signerType?: CrossmintSignerType;
|
|
18
|
+
/** Crossmint API base URL. Default: "https://www.crossmint.com" */
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
/** Linked user identifier for wallet association (e.g. "email:agent@example.com") */
|
|
21
|
+
linkedUser?: string;
|
|
22
|
+
}
|
|
23
|
+
/** Environment variable keys for Crossmint custody configuration. */
|
|
24
|
+
export declare const CROSSMINT_ENV_KEYS: {
|
|
25
|
+
/** Crossmint server-side API key */
|
|
26
|
+
readonly API_KEY: "CROSSMINT_API_KEY";
|
|
27
|
+
/** Existing wallet locator (optional — creates new wallet if omitted) */
|
|
28
|
+
readonly LOCATOR: "CROSSMINT_WALLET_LOCATOR";
|
|
29
|
+
/** Signer type: "api-key" or "evm-keypair" */
|
|
30
|
+
readonly SIGNER_TYPE: "CROSSMINT_SIGNER_TYPE";
|
|
31
|
+
/** Crossmint API base URL override */
|
|
32
|
+
readonly BASE_URL: "CROSSMINT_BASE_URL";
|
|
33
|
+
/** Linked user for wallet association */
|
|
34
|
+
readonly LINKED_USER: "CROSSMINT_LINKED_USER";
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Parse CrossmintWalletConfig from environment variables.
|
|
38
|
+
* Throws if CROSSMINT_API_KEY is not set.
|
|
39
|
+
*/
|
|
40
|
+
export declare function configFromEnv(): CrossmintWalletConfig;
|
|
41
|
+
/**
|
|
42
|
+
* Validate a CrossmintWalletConfig. Throws descriptive errors for missing/invalid fields.
|
|
43
|
+
*/
|
|
44
|
+
export declare function validateConfig(config: CrossmintWalletConfig): void;
|
|
45
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,4CAA4C;AAC5C,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,aAAa,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,iGAAiG;IACjG,MAAM,EAAE,MAAM,CAAC;IACf,0GAA0G;IAC1G,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sFAAsF;IACtF,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qEAAqE;AACrE,eAAO,MAAM,kBAAkB;IAC7B,oCAAoC;;IAEpC,yEAAyE;;IAEzE,8CAA8C;;IAE9C,sCAAsC;;IAEtC,yCAAyC;;CAEjC,CAAC;AAEX;;;GAGG;AACH,wBAAgB,aAAa,IAAI,qBAAqB,CA6BrD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAMlE"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration and environment variable parsing for Crossmint custody adapter.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CROSSMINT_ENV_KEYS = void 0;
|
|
7
|
+
exports.configFromEnv = configFromEnv;
|
|
8
|
+
exports.validateConfig = validateConfig;
|
|
9
|
+
/** Environment variable keys for Crossmint custody configuration. */
|
|
10
|
+
exports.CROSSMINT_ENV_KEYS = {
|
|
11
|
+
/** Crossmint server-side API key */
|
|
12
|
+
API_KEY: "CROSSMINT_API_KEY",
|
|
13
|
+
/** Existing wallet locator (optional — creates new wallet if omitted) */
|
|
14
|
+
LOCATOR: "CROSSMINT_WALLET_LOCATOR",
|
|
15
|
+
/** Signer type: "api-key" or "evm-keypair" */
|
|
16
|
+
SIGNER_TYPE: "CROSSMINT_SIGNER_TYPE",
|
|
17
|
+
/** Crossmint API base URL override */
|
|
18
|
+
BASE_URL: "CROSSMINT_BASE_URL",
|
|
19
|
+
/** Linked user for wallet association */
|
|
20
|
+
LINKED_USER: "CROSSMINT_LINKED_USER",
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Parse CrossmintWalletConfig from environment variables.
|
|
24
|
+
* Throws if CROSSMINT_API_KEY is not set.
|
|
25
|
+
*/
|
|
26
|
+
function configFromEnv() {
|
|
27
|
+
const apiKey = process.env[exports.CROSSMINT_ENV_KEYS.API_KEY];
|
|
28
|
+
if (!apiKey) {
|
|
29
|
+
throw new Error(`Crossmint custody: ${exports.CROSSMINT_ENV_KEYS.API_KEY} environment variable is required. ` +
|
|
30
|
+
"Get a server-side API key from https://crossmint.com/console with " +
|
|
31
|
+
"wallets.create and wallets:transactions.sign scopes.");
|
|
32
|
+
}
|
|
33
|
+
const signerTypeRaw = process.env[exports.CROSSMINT_ENV_KEYS.SIGNER_TYPE];
|
|
34
|
+
let signerType;
|
|
35
|
+
if (signerTypeRaw) {
|
|
36
|
+
if (signerTypeRaw !== "api-key" && signerTypeRaw !== "evm-keypair") {
|
|
37
|
+
throw new Error(`Crossmint custody: invalid ${exports.CROSSMINT_ENV_KEYS.SIGNER_TYPE}="${signerTypeRaw}". ` +
|
|
38
|
+
'Expected "api-key" or "evm-keypair".');
|
|
39
|
+
}
|
|
40
|
+
signerType = signerTypeRaw;
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
apiKey,
|
|
44
|
+
locator: process.env[exports.CROSSMINT_ENV_KEYS.LOCATOR] || undefined,
|
|
45
|
+
signerType,
|
|
46
|
+
baseUrl: process.env[exports.CROSSMINT_ENV_KEYS.BASE_URL] || undefined,
|
|
47
|
+
linkedUser: process.env[exports.CROSSMINT_ENV_KEYS.LINKED_USER] || undefined,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Validate a CrossmintWalletConfig. Throws descriptive errors for missing/invalid fields.
|
|
52
|
+
*/
|
|
53
|
+
function validateConfig(config) {
|
|
54
|
+
if (!config.apiKey || config.apiKey.trim() === "") {
|
|
55
|
+
throw new Error("Crossmint custody: apiKey is required and cannot be empty.");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAyCH,sCA6BC;AAKD,wCAMC;AA1DD,qEAAqE;AACxD,QAAA,kBAAkB,GAAG;IAChC,oCAAoC;IACpC,OAAO,EAAE,mBAAmB;IAC5B,yEAAyE;IACzE,OAAO,EAAE,0BAA0B;IACnC,8CAA8C;IAC9C,WAAW,EAAE,uBAAuB;IACpC,sCAAsC;IACtC,QAAQ,EAAE,oBAAoB;IAC9B,yCAAyC;IACzC,WAAW,EAAE,uBAAuB;CAC5B,CAAC;AAEX;;;GAGG;AACH,SAAgB,aAAa;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,0BAAkB,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,sBAAsB,0BAAkB,CAAC,OAAO,qCAAqC;YACnF,oEAAoE;YACpE,sDAAsD,CACzD,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,0BAAkB,CAAC,WAAW,CAAC,CAAC;IAClE,IAAI,UAA2C,CAAC;IAChD,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CACb,8BAA8B,0BAAkB,CAAC,WAAW,KAAK,aAAa,KAAK;gBACjF,sCAAsC,CACzC,CAAC;QACJ,CAAC;QACD,UAAU,GAAG,aAAa,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,0BAAkB,CAAC,OAAO,CAAC,IAAI,SAAS;QAC7D,UAAU;QACV,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,0BAAkB,CAAC,QAAQ,CAAC,IAAI,SAAS;QAC9D,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,0BAAkB,CAAC,WAAW,CAAC,IAAI,SAAS;KACrE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,MAA6B;IAC1D,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @agent-shield/custody-crossmint
|
|
3
|
+
*
|
|
4
|
+
* Crossmint TEE custody adapter for AgentShield.
|
|
5
|
+
* Hardware-enclave signing — the private key never leaves the TEE.
|
|
6
|
+
*
|
|
7
|
+
* @example One-liner with shield():
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { shield } from '@agent-shield/solana';
|
|
10
|
+
* import { crossmint } from '@agent-shield/custody-crossmint';
|
|
11
|
+
*
|
|
12
|
+
* const wallet = shield(
|
|
13
|
+
* await crossmint({ apiKey: 'sk_...' }),
|
|
14
|
+
* { maxSpend: '500 USDC/day' }
|
|
15
|
+
* );
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* @example Zero-config from environment:
|
|
19
|
+
* ```typescript
|
|
20
|
+
* import { shield } from '@agent-shield/solana';
|
|
21
|
+
* import { crossmintFromEnv } from '@agent-shield/custody-crossmint';
|
|
22
|
+
*
|
|
23
|
+
* // Reads CROSSMINT_API_KEY (+ optional CROSSMINT_WALLET_LOCATOR) from env
|
|
24
|
+
* const wallet = shield(await crossmintFromEnv(), { maxSpend: '500 USDC/day' });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export { CrossmintWallet, CrossmintRESTClient, type CrossmintSDKClient, type WalletLike, } from "./adapter";
|
|
28
|
+
export { type CrossmintWalletConfig, type CrossmintSignerType, CROSSMINT_ENV_KEYS, configFromEnv, validateConfig, } from "./config";
|
|
29
|
+
import { CrossmintWallet, CrossmintSDKClient } from "./adapter";
|
|
30
|
+
import { CrossmintWalletConfig } from "./config";
|
|
31
|
+
/**
|
|
32
|
+
* Create a CrossmintWallet from explicit configuration.
|
|
33
|
+
*
|
|
34
|
+
* If no `locator` is provided, a new wallet is created via the Crossmint API.
|
|
35
|
+
* The private key lives in Crossmint's Intel TDX enclave — the agent never sees it.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* const wallet = await crossmint({ apiKey: 'sk_production_...' });
|
|
40
|
+
* console.log(wallet.publicKey.toBase58()); // Solana address
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function crossmint(config: CrossmintWalletConfig, client?: CrossmintSDKClient): Promise<CrossmintWallet>;
|
|
44
|
+
/**
|
|
45
|
+
* Create a CrossmintWallet from environment variables.
|
|
46
|
+
*
|
|
47
|
+
* Required: CROSSMINT_API_KEY
|
|
48
|
+
* Optional: CROSSMINT_WALLET_LOCATOR, CROSSMINT_SIGNER_TYPE, CROSSMINT_BASE_URL
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* // Set CROSSMINT_API_KEY=sk_production_... in .env
|
|
53
|
+
* const wallet = await crossmintFromEnv();
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare function crossmintFromEnv(client?: CrossmintSDKClient): Promise<CrossmintWallet>;
|
|
57
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,UAAU,GAChB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,kBAAkB,EAClB,aAAa,EACb,cAAc,GACf,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAiB,MAAM,UAAU,CAAC;AAEhE;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,qBAAqB,EAC7B,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAG1B"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @agent-shield/custody-crossmint
|
|
4
|
+
*
|
|
5
|
+
* Crossmint TEE custody adapter for AgentShield.
|
|
6
|
+
* Hardware-enclave signing — the private key never leaves the TEE.
|
|
7
|
+
*
|
|
8
|
+
* @example One-liner with shield():
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { shield } from '@agent-shield/solana';
|
|
11
|
+
* import { crossmint } from '@agent-shield/custody-crossmint';
|
|
12
|
+
*
|
|
13
|
+
* const wallet = shield(
|
|
14
|
+
* await crossmint({ apiKey: 'sk_...' }),
|
|
15
|
+
* { maxSpend: '500 USDC/day' }
|
|
16
|
+
* );
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @example Zero-config from environment:
|
|
20
|
+
* ```typescript
|
|
21
|
+
* import { shield } from '@agent-shield/solana';
|
|
22
|
+
* import { crossmintFromEnv } from '@agent-shield/custody-crossmint';
|
|
23
|
+
*
|
|
24
|
+
* // Reads CROSSMINT_API_KEY (+ optional CROSSMINT_WALLET_LOCATOR) from env
|
|
25
|
+
* const wallet = shield(await crossmintFromEnv(), { maxSpend: '500 USDC/day' });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.validateConfig = exports.configFromEnv = exports.CROSSMINT_ENV_KEYS = exports.CrossmintRESTClient = exports.CrossmintWallet = void 0;
|
|
30
|
+
exports.crossmint = crossmint;
|
|
31
|
+
exports.crossmintFromEnv = crossmintFromEnv;
|
|
32
|
+
var adapter_1 = require("./adapter");
|
|
33
|
+
Object.defineProperty(exports, "CrossmintWallet", { enumerable: true, get: function () { return adapter_1.CrossmintWallet; } });
|
|
34
|
+
Object.defineProperty(exports, "CrossmintRESTClient", { enumerable: true, get: function () { return adapter_1.CrossmintRESTClient; } });
|
|
35
|
+
var config_1 = require("./config");
|
|
36
|
+
Object.defineProperty(exports, "CROSSMINT_ENV_KEYS", { enumerable: true, get: function () { return config_1.CROSSMINT_ENV_KEYS; } });
|
|
37
|
+
Object.defineProperty(exports, "configFromEnv", { enumerable: true, get: function () { return config_1.configFromEnv; } });
|
|
38
|
+
Object.defineProperty(exports, "validateConfig", { enumerable: true, get: function () { return config_1.validateConfig; } });
|
|
39
|
+
const adapter_2 = require("./adapter");
|
|
40
|
+
const config_2 = require("./config");
|
|
41
|
+
/**
|
|
42
|
+
* Create a CrossmintWallet from explicit configuration.
|
|
43
|
+
*
|
|
44
|
+
* If no `locator` is provided, a new wallet is created via the Crossmint API.
|
|
45
|
+
* The private key lives in Crossmint's Intel TDX enclave — the agent never sees it.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* const wallet = await crossmint({ apiKey: 'sk_production_...' });
|
|
50
|
+
* console.log(wallet.publicKey.toBase58()); // Solana address
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
async function crossmint(config, client) {
|
|
54
|
+
return adapter_2.CrossmintWallet.create(config, client);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create a CrossmintWallet from environment variables.
|
|
58
|
+
*
|
|
59
|
+
* Required: CROSSMINT_API_KEY
|
|
60
|
+
* Optional: CROSSMINT_WALLET_LOCATOR, CROSSMINT_SIGNER_TYPE, CROSSMINT_BASE_URL
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```typescript
|
|
64
|
+
* // Set CROSSMINT_API_KEY=sk_production_... in .env
|
|
65
|
+
* const wallet = await crossmintFromEnv();
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
async function crossmintFromEnv(client) {
|
|
69
|
+
const config = (0, config_2.configFromEnv)();
|
|
70
|
+
return adapter_2.CrossmintWallet.create(config, client);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;AAgCH,8BAKC;AAcD,4CAKC;AAtDD,qCAKmB;AAJjB,0GAAA,eAAe,OAAA;AACf,8GAAA,mBAAmB,OAAA;AAKrB,mCAMkB;AAHhB,4GAAA,kBAAkB,OAAA;AAClB,uGAAA,aAAa,OAAA;AACb,wGAAA,cAAc,OAAA;AAGhB,uCAAgE;AAChE,qCAAgE;AAEhE;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,SAAS,CAC7B,MAA6B,EAC7B,MAA2B;IAE3B,OAAO,yBAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,gBAAgB,CACpC,MAA2B;IAE3B,MAAM,MAAM,GAAG,IAAA,sBAAa,GAAE,CAAC;IAC/B,OAAO,yBAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agent-shield/custody-crossmint",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Crossmint TEE custody adapter for AgentShield — hardware-enclave signing for AI agents",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md"
|
|
10
|
+
],
|
|
11
|
+
"sideEffects": false,
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=18.0.0"
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"clean": "rm -rf dist",
|
|
18
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
19
|
+
"test": "TS_NODE_PROJECT=tsconfig.test.json mocha --require ts-node/register tests/**/*.test.ts --timeout 30000"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@crossmint/wallets-sdk": "^0.2.0",
|
|
23
|
+
"@solana/web3.js": "^1.95.0"
|
|
24
|
+
},
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"@agent-shield/solana": ">=0.1.0"
|
|
27
|
+
},
|
|
28
|
+
"peerDependenciesMeta": {
|
|
29
|
+
"@agent-shield/solana": {
|
|
30
|
+
"optional": true
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@agent-shield/solana": "workspace:*",
|
|
35
|
+
"@types/chai": "^4.3.11",
|
|
36
|
+
"@types/mocha": "^10.0.6",
|
|
37
|
+
"@types/node": "^20.11.0",
|
|
38
|
+
"chai": "^4.4.1",
|
|
39
|
+
"mocha": "^10.3.0",
|
|
40
|
+
"ts-node": "^10.9.2",
|
|
41
|
+
"typescript": "^5.3.3"
|
|
42
|
+
},
|
|
43
|
+
"keywords": [
|
|
44
|
+
"solana",
|
|
45
|
+
"ai-agent",
|
|
46
|
+
"tee",
|
|
47
|
+
"custody",
|
|
48
|
+
"crossmint",
|
|
49
|
+
"hardware-enclave",
|
|
50
|
+
"wallet"
|
|
51
|
+
],
|
|
52
|
+
"license": "MIT",
|
|
53
|
+
"repository": {
|
|
54
|
+
"type": "git",
|
|
55
|
+
"url": "https://github.com/agent-shield/agent-shield",
|
|
56
|
+
"directory": "sdk/custody/crossmint"
|
|
57
|
+
}
|
|
58
|
+
}
|