@atxp/client 0.7.4 → 0.8.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/atxpAccount.d.ts +8 -6
- package/dist/atxpAccount.d.ts.map +1 -1
- package/dist/atxpAccount.js +57 -19
- package/dist/atxpAccount.js.map +1 -1
- package/dist/atxpClient.d.ts +1 -1
- package/dist/atxpClient.d.ts.map +1 -1
- package/dist/atxpClient.js +18 -2
- package/dist/atxpClient.js.map +1 -1
- package/dist/atxpFetcher.d.ts +5 -15
- package/dist/atxpFetcher.d.ts.map +1 -1
- package/dist/atxpFetcher.js +95 -229
- package/dist/atxpFetcher.js.map +1 -1
- package/dist/baseAccount.d.ts +7 -4
- package/dist/baseAccount.d.ts.map +1 -1
- package/dist/baseAccount.js +15 -4
- package/dist/baseAccount.js.map +1 -1
- package/dist/basePaymentMaker.d.ts +4 -3
- package/dist/basePaymentMaker.d.ts.map +1 -1
- package/dist/basePaymentMaker.js +20 -3
- package/dist/basePaymentMaker.js.map +1 -1
- package/dist/clientTestHelpers.d.ts.map +1 -1
- package/dist/destinationMakers/atxpDestinationMaker.d.ts +15 -0
- package/dist/destinationMakers/atxpDestinationMaker.d.ts.map +1 -0
- package/dist/destinationMakers/atxpDestinationMaker.js +128 -0
- package/dist/destinationMakers/atxpDestinationMaker.js.map +1 -0
- package/dist/destinationMakers/index.d.ts +9 -0
- package/dist/destinationMakers/index.d.ts.map +1 -0
- package/dist/destinationMakers/index.js +42 -0
- package/dist/destinationMakers/index.js.map +1 -0
- package/dist/destinationMakers/passthroughDestinationMaker.d.ts +8 -0
- package/dist/destinationMakers/passthroughDestinationMaker.d.ts.map +1 -0
- package/dist/destinationMakers/passthroughDestinationMaker.js +27 -0
- package/dist/destinationMakers/passthroughDestinationMaker.js.map +1 -0
- package/dist/index.cjs +803 -584
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +99 -42
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +798 -586
- package/dist/index.js.map +1 -1
- package/dist/polygonConstants.d.ts +46 -0
- package/dist/polygonConstants.d.ts.map +1 -0
- package/dist/polygonConstants.js +54 -0
- package/dist/polygonConstants.js.map +1 -0
- package/dist/solanaAccount.d.ts +8 -4
- package/dist/solanaAccount.d.ts.map +1 -1
- package/dist/solanaAccount.js +16 -4
- package/dist/solanaAccount.js.map +1 -1
- package/dist/solanaPaymentMaker.d.ts +4 -3
- package/dist/solanaPaymentMaker.d.ts.map +1 -1
- package/dist/solanaPaymentMaker.js +24 -5
- package/dist/solanaPaymentMaker.js.map +1 -1
- package/dist/types.d.ts +5 -23
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
package/dist/atxpAccount.d.ts
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import type { Account, PaymentMaker } from './types.js';
|
|
2
|
-
import type { FetchLike,
|
|
2
|
+
import type { FetchLike, AccountId, Source } from '@atxp/common';
|
|
3
3
|
import { LocalAccount } from 'viem';
|
|
4
4
|
export declare class ATXPAccount implements Account {
|
|
5
|
-
accountId:
|
|
6
|
-
paymentMakers:
|
|
7
|
-
[key: string]: PaymentMaker;
|
|
8
|
-
};
|
|
5
|
+
accountId: AccountId;
|
|
6
|
+
paymentMakers: PaymentMaker[];
|
|
9
7
|
origin: string;
|
|
10
8
|
token: string;
|
|
11
9
|
fetchFn: FetchLike;
|
|
10
|
+
private unqualifiedAccountId;
|
|
12
11
|
constructor(connectionString: string, opts?: {
|
|
13
12
|
fetchFn?: FetchLike;
|
|
14
|
-
network?: Network;
|
|
15
13
|
});
|
|
16
14
|
getSigner(): Promise<LocalAccount>;
|
|
15
|
+
/**
|
|
16
|
+
* Get sources for this account by calling the accounts service
|
|
17
|
+
*/
|
|
18
|
+
getSources(): Promise<Source[]>;
|
|
17
19
|
}
|
|
18
20
|
//# sourceMappingURL=atxpAccount.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atxpAccount.d.ts","sourceRoot":"","sources":["../src/atxpAccount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"atxpAccount.d.ts","sourceRoot":"","sources":["../src/atxpAccount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAY,SAAS,EAAyC,MAAM,EAAE,MAAM,cAAc,CAAC;AAElH,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AA2IpC,qBAAa,WAAY,YAAW,OAAO;IACzC,SAAS,EAAE,SAAS,CAAC;IACrB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,CAAC,oBAAoB,CAAS;gBAEzB,gBAAgB,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,SAAS,CAAC;KAAE;IAmB/D,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;IAQxC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAuBtC"}
|
package/dist/atxpAccount.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { crypto } from '@atxp/common';
|
|
2
1
|
import { ATXPLocalAccount } from './atxpLocalAccount.js';
|
|
3
2
|
|
|
4
3
|
function toBasicAuth(token) {
|
|
@@ -14,6 +13,9 @@ function parseConnectionString(connectionString) {
|
|
|
14
13
|
if (!token) {
|
|
15
14
|
throw new Error('ATXPAccount: connection string missing connection token');
|
|
16
15
|
}
|
|
16
|
+
if (!accountId) {
|
|
17
|
+
throw new Error('ATXPAccount: connection string missing account id');
|
|
18
|
+
}
|
|
17
19
|
return { origin, token, accountId };
|
|
18
20
|
}
|
|
19
21
|
class ATXPHttpPaymentMaker {
|
|
@@ -47,8 +49,8 @@ class ATXPHttpPaymentMaker {
|
|
|
47
49
|
}
|
|
48
50
|
return json.sourceAddress;
|
|
49
51
|
}
|
|
50
|
-
async makePayment(
|
|
51
|
-
// Make a
|
|
52
|
+
async makePayment(destinations, memo, paymentRequestId) {
|
|
53
|
+
// Make a payment via the /pay endpoint with multiple destinations
|
|
52
54
|
const response = await this.fetchFn(`${this.origin}/pay`, {
|
|
53
55
|
method: 'POST',
|
|
54
56
|
headers: {
|
|
@@ -56,10 +58,14 @@ class ATXPHttpPaymentMaker {
|
|
|
56
58
|
'Content-Type': 'application/json',
|
|
57
59
|
},
|
|
58
60
|
body: JSON.stringify({
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
61
|
+
destinations: destinations.map(d => ({
|
|
62
|
+
chain: d.chain,
|
|
63
|
+
address: d.address,
|
|
64
|
+
amount: d.amount.toString(),
|
|
65
|
+
currency: d.currency
|
|
66
|
+
})),
|
|
62
67
|
memo,
|
|
68
|
+
...(paymentRequestId && { paymentRequestId })
|
|
63
69
|
}),
|
|
64
70
|
});
|
|
65
71
|
if (!response.ok) {
|
|
@@ -67,10 +73,22 @@ class ATXPHttpPaymentMaker {
|
|
|
67
73
|
throw new Error(`ATXPAccount: /pay failed: ${response.status} ${response.statusText} ${text}`);
|
|
68
74
|
}
|
|
69
75
|
const json = await response.json();
|
|
70
|
-
|
|
71
|
-
|
|
76
|
+
const transactionId = json.transactionId;
|
|
77
|
+
if (!transactionId) {
|
|
78
|
+
throw new Error('ATXPAccount: /pay did not return transactionId or txHash');
|
|
79
|
+
}
|
|
80
|
+
if (!json?.chain) {
|
|
81
|
+
throw new Error('ATXPAccount: /pay did not return chain');
|
|
72
82
|
}
|
|
73
|
-
|
|
83
|
+
if (!json?.currency) {
|
|
84
|
+
throw new Error('ATXPAccount: /pay did not return currency');
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
transactionId,
|
|
88
|
+
...(json.transactionSubId ? { transactionSubId: json.transactionSubId } : {}),
|
|
89
|
+
chain: json.chain,
|
|
90
|
+
currency: json.currency
|
|
91
|
+
};
|
|
74
92
|
}
|
|
75
93
|
async generateJWT(params) {
|
|
76
94
|
const response = await this.fetchFn(`${this.origin}/sign`, {
|
|
@@ -82,6 +100,7 @@ class ATXPHttpPaymentMaker {
|
|
|
82
100
|
body: JSON.stringify({
|
|
83
101
|
paymentRequestId: params.paymentRequestId,
|
|
84
102
|
codeChallenge: params.codeChallenge,
|
|
103
|
+
...(params.accountId ? { accountId: params.accountId } : {}),
|
|
85
104
|
}),
|
|
86
105
|
});
|
|
87
106
|
if (!response.ok) {
|
|
@@ -99,24 +118,43 @@ class ATXPAccount {
|
|
|
99
118
|
constructor(connectionString, opts) {
|
|
100
119
|
const { origin, token, accountId } = parseConnectionString(connectionString);
|
|
101
120
|
const fetchFn = opts?.fetchFn ?? fetch;
|
|
102
|
-
const network = opts?.network ?? 'base';
|
|
103
121
|
// Store for use in X402 payment creation
|
|
104
122
|
this.origin = origin;
|
|
105
123
|
this.token = token;
|
|
106
124
|
this.fetchFn = fetchFn;
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
[network]: new ATXPHttpPaymentMaker(origin, token, fetchFn),
|
|
115
|
-
};
|
|
125
|
+
// Format accountId as network:address
|
|
126
|
+
// Connection string provides just the atxp_acct_xxx part (no prefix for UI)
|
|
127
|
+
this.unqualifiedAccountId = accountId;
|
|
128
|
+
this.accountId = `atxp:${accountId}`;
|
|
129
|
+
this.paymentMakers = [
|
|
130
|
+
new ATXPHttpPaymentMaker(origin, token, fetchFn)
|
|
131
|
+
];
|
|
116
132
|
}
|
|
117
133
|
async getSigner() {
|
|
118
134
|
return ATXPLocalAccount.create(this.origin, this.token, this.fetchFn);
|
|
119
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* Get sources for this account by calling the accounts service
|
|
138
|
+
*/
|
|
139
|
+
async getSources() {
|
|
140
|
+
// Use the unqualified account ID (without atxp: prefix) for the API call
|
|
141
|
+
const response = await this.fetchFn(`${this.origin}/account/${this.unqualifiedAccountId}/sources`, {
|
|
142
|
+
method: 'GET',
|
|
143
|
+
headers: {
|
|
144
|
+
'Accept': 'application/json',
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
if (!response.ok) {
|
|
148
|
+
const text = await response.text();
|
|
149
|
+
throw new Error(`ATXPAccount: /account/${this.unqualifiedAccountId}/sources failed: ${response.status} ${response.statusText} ${text}`);
|
|
150
|
+
}
|
|
151
|
+
const json = await response.json();
|
|
152
|
+
// The accounts service returns the sources array directly, not wrapped in an object
|
|
153
|
+
if (!Array.isArray(json)) {
|
|
154
|
+
throw new Error(`ATXPAccount: /account/${this.unqualifiedAccountId}/sources did not return sources array`);
|
|
155
|
+
}
|
|
156
|
+
return json;
|
|
157
|
+
}
|
|
120
158
|
}
|
|
121
159
|
|
|
122
160
|
export { ATXPAccount };
|
package/dist/atxpAccount.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atxpAccount.js","sources":["../src/atxpAccount.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"atxpAccount.js","sources":["../src/atxpAccount.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAMA,SAAS,WAAW,CAAC,KAAa,EAAA;;AAEhC,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA,EAAG,KAAK,CAAA,CAAA,CAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACvD,OAAO,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE;AACvB;AAEA,SAAS,qBAAqB,CAAC,gBAAwB,EAAA;AACrD,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC;AACrC,IAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM;AACzB,IAAA,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE;IAC5D,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;IACpD,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC;IAC5E;IACA,IAAI,CAAC,SAAS,EAAE;AACd,QAAA,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;IACtE;AACA,IAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE;AACrC;AAEA,MAAM,oBAAoB,CAAA;AAKxB,IAAA,WAAA,CAAY,MAAc,EAAE,KAAa,EAAE,UAAqB,KAAK,EAAA;AACnE,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;IACxB;IAEA,MAAM,gBAAgB,CAAC,MAA+E,EAAA;;AAEpG,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,oBAAA,CAAsB,EAAE;AACxE,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,eAAe,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;AACxC,gBAAA,cAAc,EAAE,kBAAkB;AACnC,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;AACnB,gBAAA,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;gBAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAC;AACH,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAChB,YAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;AAClC,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,0CAAA,EAA6C,QAAQ,CAAC,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAC,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAC;QAChH;AAEA,QAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAwD;AACxF,QAAA,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE;AACxB,YAAA,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC;QACnF;QACA,OAAO,IAAI,CAAC,aAAa;IAC3B;AAEA,IAAA,MAAM,WAAW,CAAC,YAA2B,EAAE,IAAY,EAAE,gBAAyB,EAAA;;AAEpF,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,IAAA,CAAM,EAAE;AACxD,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,eAAe,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;AACxC,gBAAA,cAAc,EAAE,kBAAkB;AACnC,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,YAAY,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK;oBACnC,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,OAAO,EAAE,CAAC,CAAC,OAAO;AAClB,oBAAA,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;oBAC3B,QAAQ,EAAE,CAAC,CAAC;AACb,iBAAA,CAAC,CAAC;gBACH,IAAI;AACJ,gBAAA,IAAI,gBAAgB,IAAI,EAAE,gBAAgB,EAAE;aAC7C,CAAC;AACH,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAChB,YAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;AAClC,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,0BAAA,EAA6B,QAAQ,CAAC,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAC,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAC;QAChG;AAEA,QAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAM/B;AAED,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa;QACxC,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC;QAC7E;AACA,QAAA,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC;QAC3D;AACA,QAAA,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC;QAC9D;QAEA,OAAO;YACL,aAAa;AACb,YAAA,IAAI,IAAI,CAAC,gBAAgB,GAAG,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC;YAC7E,KAAK,EAAE,IAAI,CAAC,KAAc;YAC1B,QAAQ,EAAE,IAAI,CAAC;SAChB;IACH;IAEA,MAAM,WAAW,CAAC,MAAyF,EAAA;AACzG,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,KAAA,CAAO,EAAE;AACzD,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,eAAe,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;AACxC,gBAAA,cAAc,EAAE,kBAAkB;AACnC,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;gBACzC,aAAa,EAAE,MAAM,CAAC,aAAa;AACnC,gBAAA,IAAI,MAAM,CAAC,SAAS,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;aAC7D,CAAC;AACH,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAChB,YAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;AAClC,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,2BAAA,EAA8B,QAAQ,CAAC,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAC,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAC;QACjG;AACA,QAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAsB;AACtD,QAAA,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;AACd,YAAA,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC;QAC1D;QACA,OAAO,IAAI,CAAC,GAAG;IACjB;AACD;MAEY,WAAW,CAAA;IAQtB,WAAA,CAAY,gBAAwB,EAAE,IAA+B,EAAA;AACnE,QAAA,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,qBAAqB,CAAC,gBAAgB,CAAC;AAC5E,QAAA,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,KAAK;;AAGtC,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;;;AAItB,QAAA,IAAI,CAAC,oBAAoB,GAAG,SAAS;AACrC,QAAA,IAAI,CAAC,SAAS,GAAG,CAAA,KAAA,EAAQ,SAAS,EAAe;QACjD,IAAI,CAAC,aAAa,GAAG;AACnB,YAAA,IAAI,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO;SAChD;IACH;AAGA,IAAA,MAAM,SAAS,GAAA;AACb,QAAA,OAAO,gBAAgB,CAAC,MAAM,CAC5B,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,OAAO,CACb;IACH;AAEA;;AAEG;AACH,IAAA,MAAM,UAAU,GAAA;;AAEd,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,SAAA,EAAY,IAAI,CAAC,oBAAoB,UAAU,EAAE;AACjG,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,OAAO,EAAE;AACP,gBAAA,QAAQ,EAAE,kBAAkB;AAC7B;AACF,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAChB,YAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;AAClC,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,oBAAoB,CAAA,iBAAA,EAAoB,QAAQ,CAAC,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAA,CAAE,CAAC;QACzI;AAEA,QAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAc;;QAG9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACxB,MAAM,IAAI,KAAK,CAAC,CAAA,sBAAA,EAAyB,IAAI,CAAC,oBAAoB,CAAA,qCAAA,CAAuC,CAAC;QAC5G;AAEA,QAAA,OAAO,IAAI;IACb;AACD;;;;"}
|
package/dist/atxpClient.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
|
3
3
|
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
4
4
|
type RequiredClientConfigFields = 'mcpServer' | 'account';
|
|
5
5
|
type OptionalClientConfig = Omit<ClientConfig, RequiredClientConfigFields>;
|
|
6
|
-
type BuildableClientConfigFields = 'oAuthDb' | 'logger';
|
|
6
|
+
type BuildableClientConfigFields = 'oAuthDb' | 'logger' | 'destinationMakers';
|
|
7
7
|
export declare const DEFAULT_CLIENT_CONFIG: Required<Omit<OptionalClientConfig, BuildableClientConfigFields>>;
|
|
8
8
|
export declare function buildClientConfig(args: ClientArgs): ClientConfig;
|
|
9
9
|
export declare function buildStreamableTransport(args: ClientArgs): StreamableHTTPClientTransport;
|
package/dist/atxpClient.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atxpClient.d.ts","sourceRoot":"","sources":["../src/atxpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;
|
|
1
|
+
{"version":3,"file":"atxpClient.d.ts","sourceRoot":"","sources":["../src/atxpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAKnG,KAAK,0BAA0B,GAAG,WAAW,GAAG,SAAS,CAAC;AAC1D,KAAK,oBAAoB,GAAG,IAAI,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAC;AAC3E,KAAK,2BAA2B,GAAG,SAAS,GAAG,QAAQ,GAAG,mBAAmB,CAAC;AAY9E,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,2BAA2B,CAAC,CAkBnG,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,CA8BhE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,6BAA6B,CAQxF;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlE"}
|
package/dist/atxpClient.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { DEFAULT_AUTHORIZATION_SERVER, ConsoleLogger, MemoryOAuthDb } from '@atxp/common';
|
|
1
|
+
import { DEFAULT_ATXP_ACCOUNTS_SERVER, DEFAULT_AUTHORIZATION_SERVER, ConsoleLogger, MemoryOAuthDb } from '@atxp/common';
|
|
2
2
|
import { atxpFetch } from './atxpFetcher.js';
|
|
3
3
|
import { Client } from './node_modules/@modelcontextprotocol/sdk/dist/esm/client/index.js';
|
|
4
4
|
import { StreamableHTTPClientTransport } from './node_modules/@modelcontextprotocol/sdk/dist/esm/client/streamableHttp.js';
|
|
5
|
+
import { createDestinationMakers } from './destinationMakers/index.js';
|
|
6
|
+
import { ATXPAccount } from './atxpAccount.js';
|
|
5
7
|
|
|
6
8
|
// Detect if we're in a browser environment and bind fetch appropriately
|
|
7
9
|
const getFetch = () => {
|
|
@@ -14,6 +16,7 @@ const getFetch = () => {
|
|
|
14
16
|
};
|
|
15
17
|
const DEFAULT_CLIENT_CONFIG = {
|
|
16
18
|
allowedAuthorizationServers: [DEFAULT_AUTHORIZATION_SERVER],
|
|
19
|
+
atxpAccountsServer: DEFAULT_ATXP_ACCOUNTS_SERVER,
|
|
17
20
|
approvePayment: async (_p) => true,
|
|
18
21
|
fetchFn: getFetch(),
|
|
19
22
|
oAuthChannelFetch: getFetch(),
|
|
@@ -43,7 +46,20 @@ function buildClientConfig(args) {
|
|
|
43
46
|
const withDefaults = { ...envDefaults, ...args };
|
|
44
47
|
const logger = withDefaults.logger ?? new ConsoleLogger();
|
|
45
48
|
const oAuthDb = withDefaults.oAuthDb ?? new MemoryOAuthDb({ logger });
|
|
46
|
-
const
|
|
49
|
+
const fetchFn = withDefaults.fetchFn;
|
|
50
|
+
// Build destination makers if not provided
|
|
51
|
+
let accountsServer = withDefaults.atxpAccountsServer;
|
|
52
|
+
// QoL hack for unspecified accounts server - if the caller is passing an atxpAccount, then assume the origin for that
|
|
53
|
+
// is what we should use for the accounts server. In practice, the only option is accounts.atxp.ai,
|
|
54
|
+
// but this supports staging environment
|
|
55
|
+
if (args.atxpAccountsServer === undefined && withDefaults.account && withDefaults.account instanceof ATXPAccount) {
|
|
56
|
+
accountsServer = withDefaults.account.origin;
|
|
57
|
+
}
|
|
58
|
+
const destinationMakers = withDefaults.destinationMakers ?? createDestinationMakers({
|
|
59
|
+
atxpAccountsServer: accountsServer,
|
|
60
|
+
fetchFn
|
|
61
|
+
});
|
|
62
|
+
const built = { oAuthDb, logger, destinationMakers };
|
|
47
63
|
return Object.freeze({ ...withDefaults, ...built });
|
|
48
64
|
}
|
|
49
65
|
function buildStreamableTransport(args) {
|
package/dist/atxpClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atxpClient.js","sources":["../src/atxpClient.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"atxpClient.js","sources":["../src/atxpClient.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/dist/atxpFetcher.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OAuthAuthenticationRequiredError, OAuthClient } from './oAuth.js';
|
|
2
|
-
import { AccessToken, AuthorizationServerUrl, FetchLike, OAuthDb, PaymentRequestData, Logger, Network,
|
|
2
|
+
import { AccessToken, AuthorizationServerUrl, FetchLike, OAuthDb, PaymentRequestData, Logger, Network, DestinationMaker, Account } from '@atxp/common';
|
|
3
3
|
import type { PaymentMaker, ProspectivePayment, ClientConfig } from './types.js';
|
|
4
4
|
import { McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
5
5
|
/**
|
|
@@ -12,10 +12,10 @@ import { McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
|
12
12
|
export declare function atxpFetch(config: ClientConfig): FetchLike;
|
|
13
13
|
export declare class ATXPFetcher {
|
|
14
14
|
protected oauthClient: OAuthClient;
|
|
15
|
-
protected
|
|
15
|
+
protected account: Account;
|
|
16
|
+
protected destinationMakers: Map<Network, DestinationMaker>;
|
|
16
17
|
protected sideChannelFetch: FetchLike;
|
|
17
18
|
protected db: OAuthDb;
|
|
18
|
-
protected accountId: string;
|
|
19
19
|
protected allowedAuthorizationServers: AuthorizationServerUrl[];
|
|
20
20
|
protected approvePayment: (payment: ProspectivePayment) => Promise<boolean>;
|
|
21
21
|
protected logger: Logger;
|
|
@@ -36,11 +36,9 @@ export declare class ATXPFetcher {
|
|
|
36
36
|
error: Error;
|
|
37
37
|
}) => Promise<void>;
|
|
38
38
|
constructor(config: {
|
|
39
|
-
|
|
39
|
+
account: Account;
|
|
40
40
|
db: OAuthDb;
|
|
41
|
-
|
|
42
|
-
[key: string]: PaymentMaker;
|
|
43
|
-
};
|
|
41
|
+
destinationMakers: Map<Network, DestinationMaker>;
|
|
44
42
|
fetchFn?: FetchLike;
|
|
45
43
|
sideChannelFetch?: FetchLike;
|
|
46
44
|
strict?: boolean;
|
|
@@ -66,14 +64,6 @@ export declare class ATXPFetcher {
|
|
|
66
64
|
}) => Promise<void>;
|
|
67
65
|
});
|
|
68
66
|
private defaultPaymentFailureHandler;
|
|
69
|
-
/**
|
|
70
|
-
* Resolves atxp_base or atxp_base_sepolia destinations to real base network destinations
|
|
71
|
-
* by calling the payment_info endpoint to get the destination address and network
|
|
72
|
-
*/
|
|
73
|
-
protected resolveAtxpBaseDestination(network: string, paymentInfoUrl: string, paymentRequestId: string, amount: BigNumber, currency: Currency, receiver: string, memo: string): Promise<{
|
|
74
|
-
destinationAddress: string;
|
|
75
|
-
network: Network;
|
|
76
|
-
} | null>;
|
|
77
67
|
protected handleMultiDestinationPayment: (paymentRequestData: PaymentRequestData, paymentRequestUrl: string, paymentRequestId: string) => Promise<boolean>;
|
|
78
68
|
protected handlePaymentRequestError: (paymentRequestError: McpError) => Promise<boolean>;
|
|
79
69
|
protected getPaymentRequestData: (paymentRequestUrl: string) => Promise<PaymentRequestData | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atxpFetcher.d.ts","sourceRoot":"","sources":["../src/atxpFetcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"atxpFetcher.d.ts","sourceRoot":"","sources":["../src/atxpFetcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAqD,WAAW,EAAE,sBAAsB,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,EAAgC,MAAM,EAAwE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC9S,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGjF,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAG9D;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAiBzD;AAED,qBAAa,WAAW;IACtB,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC;IACnC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,iBAAiB,EAAE,GAAG,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC5D,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC;IACtC,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,2BAA2B,EAAE,sBAAsB,EAAE,CAAC;IAChE,SAAS,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;QAAE,mBAAmB,EAAE,sBAAsB,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChH,SAAS,CAAC,kBAAkB,EAAE,CAAC,IAAI,EAAE;QAAE,mBAAmB,EAAE,sBAAsB,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrI,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,kBAAkB,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,SAAS,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,kBAAkB,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;gBACvF,MAAM,EAAE;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,EAAE,EAAE,OAAO,CAAC;QACZ,iBAAiB,EAAE,GAAG,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QAClD,OAAO,CAAC,EAAE,SAAS,CAAC;QACpB,gBAAgB,CAAC,EAAE,SAAS,CAAC;QAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,2BAA2B,CAAC,EAAE,sBAAsB,EAAE,CAAC;QACvD,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACnE,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,mBAAmB,EAAE,sBAAsB,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACvG,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,mBAAmB,EAAE,sBAAsB,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,KAAK,CAAA;SAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5H,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,OAAO,EAAE,kBAAkB,CAAA;SAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACrE,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,OAAO,EAAE,kBAAkB,CAAC;YAAC,KAAK,EAAE,KAAK,CAAA;SAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC3F;IAgDD,OAAO,CAAC,4BAA4B,CAclC;IAGF,SAAS,CAAC,6BAA6B,GACrC,oBAAoB,kBAAkB,EACtC,mBAAmB,MAAM,EACzB,kBAAkB,MAAM,KACvB,OAAO,CAAC,OAAO,CAAC,CAgHlB;IAED,SAAS,CAAC,yBAAyB,GAAU,qBAAqB,QAAQ,KAAG,OAAO,CAAC,OAAO,CAAC,CA6B5F;IAED,SAAS,CAAC,qBAAqB,GAAU,mBAAmB,MAAM,KAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAiBtG;IAED,SAAS,CAAC,mBAAmB,GAAI,KAAK,MAAM,GAAG,GAAG,KAAG,OAAO,CAI3D;IAED,SAAS,CAAC,+BAA+B,GAAU,kBAAkB,GAAG,EAAE,cAAc,YAAY,KAAG,OAAO,CAAC,MAAM,CAAC,CA6DrH;IAED,SAAS,CAAC,aAAa,GAAU,OAAO,gCAAgC,KAAG,OAAO,CAAC,IAAI,CAAC,CAmDvF;IAED,SAAS,CAAC,aAAa,GAAU,SAAS,WAAW,EAAE,gBAAgB,MAAM,KAAG,OAAO,CAAC,WAAW,CAAC,CAKnG;IAED,SAAS,CAAC,oBAAoB,GAAU,UAAU,QAAQ,KAAG,OAAO,CAAC,IAAI,CAAC,CA+BzE;IAED,KAAK,EAAE,SAAS,CAkDf;CACF"}
|