@armory-sh/client-ethers 0.2.25-beta.20260216.66 → 0.2.26-alpha.23.73
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/index.d.ts +1 -5
- package/dist/index.js +58 -13
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -32,10 +32,6 @@ declare function parsePaymentRequired(response: Response): ParsedPaymentRequirem
|
|
|
32
32
|
* Create x402 payment payload (V2-only wrapper)
|
|
33
33
|
*/
|
|
34
34
|
declare function createX402Payment(signer: Signer, parsed: ParsedPaymentRequirements, fromAddress: Address, nonce?: `0x${string}`, validBefore?: number, domainName?: string, domainVersion?: string): Promise<PaymentPayloadV2>;
|
|
35
|
-
/**
|
|
36
|
-
* Encode x402 payment payload to Base64 for transport
|
|
37
|
-
*/
|
|
38
|
-
declare function encodeX402Payment(payload: PaymentPayloadV2): string;
|
|
39
35
|
|
|
40
36
|
declare class X402ClientError extends Error {
|
|
41
37
|
readonly cause?: unknown;
|
|
@@ -310,4 +306,4 @@ interface ArmoryInstance {
|
|
|
310
306
|
}
|
|
311
307
|
declare const createArmory: (config: ArmoryConfig) => ArmoryInstance;
|
|
312
308
|
|
|
313
|
-
export { type ArmoryConfig, type ArmoryInstance, AuthorizationError, type ClientConfig, type HttpMethod, type NormalizedWallet, type ParsedPaymentRequirements, PaymentError, type PaymentOptions, ProviderRequiredError, SignerRequiredError, SigningError, type SimpleWalletInput, type X402Client, type X402ClientConfig, X402ClientError, type X402RequestInit, type X402Transport, type X402TransportConfig, armoryDelete, armoryGet, armoryPatch, armoryPay, armoryPost, armoryPut, createArmory, createX402Client, createX402Payment, createX402Transport, detectX402Version,
|
|
309
|
+
export { type ArmoryConfig, type ArmoryInstance, AuthorizationError, type ClientConfig, type HttpMethod, type NormalizedWallet, type ParsedPaymentRequirements, PaymentError, type PaymentOptions, ProviderRequiredError, SignerRequiredError, SigningError, type SimpleWalletInput, type X402Client, type X402ClientConfig, X402ClientError, type X402RequestInit, type X402Transport, type X402TransportConfig, armoryDelete, armoryGet, armoryPatch, armoryPay, armoryPost, armoryPut, createArmory, createX402Client, createX402Payment, createX402Transport, detectX402Version, getNetworks, getPaymentHeaderName, getTokens, getWalletAddress, normalizeWallet, parsePaymentRequired, recoverEIP3009Signer, signEIP3009, signEIP3009WithDomain, signPayment, validateNetwork, validateToken };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createEIP712Domain, V2_HEADERS, isX402V2PaymentRequired, validatePaymentConfig, isValidationError, resolveNetwork, resolveToken, getNetworkConfig, normalizeNetworkName, decodeSettlementV2 } from '@armory-sh/base';
|
|
1
|
+
import { createEIP712Domain, V2_HEADERS, isX402V2PaymentRequired, validatePaymentConfig, isValidationError, resolveNetwork, resolveToken, getNetworkConfig, normalizeNetworkName, encodePaymentV2, decodeSettlementV2 } from '@armory-sh/base';
|
|
2
2
|
export { EIP712_TYPES, ERC20_ABI, NETWORKS, V2_HEADERS, createEIP712Domain, createTransferWithAuthorization, decodePayment, decodePaymentV2, decodeSettlementV2, detectPaymentVersion, encodePaymentV2, encodeSettlementV2, getMainnets, getNetworkByChainId, getNetworkConfig, getTestnets, getTxHash, isCAIP2ChainId, isCAIPAssetId, isPaymentV2, isSettlementSuccessful, isSettlementV2, isX402V2PaymentRequired, safeBase64Decode, validateTransferWithAuthorization } from '@armory-sh/base';
|
|
3
3
|
import { ethers } from 'ethers';
|
|
4
4
|
|
|
@@ -116,6 +116,38 @@ async function recoverEIP3009Signer(params, signature, domain) {
|
|
|
116
116
|
return address;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
+
// src/bytes.ts
|
|
120
|
+
new TextEncoder();
|
|
121
|
+
var textDecoder = new TextDecoder();
|
|
122
|
+
function getNodeBuffer() {
|
|
123
|
+
if ("Buffer" in globalThis) {
|
|
124
|
+
return globalThis.Buffer;
|
|
125
|
+
}
|
|
126
|
+
return void 0;
|
|
127
|
+
}
|
|
128
|
+
function fromBase64(base64) {
|
|
129
|
+
if (typeof atob === "function") {
|
|
130
|
+
const binary = atob(base64);
|
|
131
|
+
const bytes = new Uint8Array(binary.length);
|
|
132
|
+
for (let index = 0; index < binary.length; index += 1) {
|
|
133
|
+
bytes[index] = binary.charCodeAt(index);
|
|
134
|
+
}
|
|
135
|
+
return bytes;
|
|
136
|
+
}
|
|
137
|
+
const nodeBuffer = getNodeBuffer();
|
|
138
|
+
if (nodeBuffer) {
|
|
139
|
+
return Uint8Array.from(nodeBuffer.from(base64, "base64"));
|
|
140
|
+
}
|
|
141
|
+
throw new Error("No base64 decoder available in this runtime");
|
|
142
|
+
}
|
|
143
|
+
function decodeBase64ToUtf8(value) {
|
|
144
|
+
const bytes = fromBase64(value);
|
|
145
|
+
return textDecoder.decode(bytes);
|
|
146
|
+
}
|
|
147
|
+
function normalizeBase64Url(value) {
|
|
148
|
+
return value.replace(/-/g, "+").replace(/_/g, "/").padEnd(Math.ceil(value.length / 4) * 4, "=");
|
|
149
|
+
}
|
|
150
|
+
|
|
119
151
|
// src/protocol.ts
|
|
120
152
|
function detectX402Version(_response) {
|
|
121
153
|
return 2;
|
|
@@ -128,8 +160,8 @@ function parseJsonOrBase64(value) {
|
|
|
128
160
|
return JSON.parse(value);
|
|
129
161
|
} catch {
|
|
130
162
|
}
|
|
131
|
-
const normalized =
|
|
132
|
-
return JSON.parse(
|
|
163
|
+
const normalized = normalizeBase64Url(value);
|
|
164
|
+
return JSON.parse(decodeBase64ToUtf8(normalized));
|
|
133
165
|
}
|
|
134
166
|
function parsePaymentRequired(response) {
|
|
135
167
|
const v2Header = response.headers.get(V2_HEADERS.PAYMENT_REQUIRED);
|
|
@@ -153,9 +185,6 @@ function parsePaymentRequired(response) {
|
|
|
153
185
|
throw new PaymentError(`Failed to parse V2 PAYMENT-REQUIRED header: ${error}`);
|
|
154
186
|
}
|
|
155
187
|
}
|
|
156
|
-
function toAtomicUnits(amount) {
|
|
157
|
-
return Math.floor(parseFloat(amount) * 1e6).toString();
|
|
158
|
-
}
|
|
159
188
|
function extractChainId(network) {
|
|
160
189
|
if (network.startsWith("eip155:")) {
|
|
161
190
|
return parseInt(network.split(":")[1], 10);
|
|
@@ -178,7 +207,7 @@ async function createX402V2Payment(signer, requirements, fromAddress, nonce, val
|
|
|
178
207
|
const authorization = {
|
|
179
208
|
from: fromAddress,
|
|
180
209
|
to: requirements.payTo,
|
|
181
|
-
value:
|
|
210
|
+
value: requirements.amount,
|
|
182
211
|
validAfter: "0",
|
|
183
212
|
validBefore: validBefore.toString(),
|
|
184
213
|
nonce
|
|
@@ -216,9 +245,6 @@ async function createX402Payment(signer, parsed, fromAddress, nonce, validBefore
|
|
|
216
245
|
domainVersion
|
|
217
246
|
);
|
|
218
247
|
}
|
|
219
|
-
function encodeX402Payment(payload) {
|
|
220
|
-
return Buffer.from(JSON.stringify(payload)).toString("base64");
|
|
221
|
-
}
|
|
222
248
|
var defaultConfig = {
|
|
223
249
|
baseURL: "",
|
|
224
250
|
headers: {},
|
|
@@ -251,6 +277,16 @@ var fetchWithTimeout = async (url, init, timeout) => {
|
|
|
251
277
|
}
|
|
252
278
|
};
|
|
253
279
|
var delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
280
|
+
var getRequirementDomainOverrides = (parsed) => {
|
|
281
|
+
const requirement = parsed.requirements;
|
|
282
|
+
const extra = requirement.extra;
|
|
283
|
+
const extraName = extra && typeof extra === "object" && typeof extra["name"] === "string" ? extra["name"] : void 0;
|
|
284
|
+
const extraVersion = extra && typeof extra === "object" && typeof extra["version"] === "string" ? extra["version"] : void 0;
|
|
285
|
+
return {
|
|
286
|
+
domainName: requirement.name ?? extraName,
|
|
287
|
+
domainVersion: requirement.version ?? extraVersion
|
|
288
|
+
};
|
|
289
|
+
};
|
|
254
290
|
var handlePaymentRequired = async (state, response) => {
|
|
255
291
|
if (!state.signer) {
|
|
256
292
|
throw new SignerRequiredError("Cannot handle payment: no signer configured.");
|
|
@@ -258,8 +294,17 @@ var handlePaymentRequired = async (state, response) => {
|
|
|
258
294
|
try {
|
|
259
295
|
const parsed = parsePaymentRequired(response);
|
|
260
296
|
const from = await state.signer.getAddress();
|
|
261
|
-
const
|
|
262
|
-
const
|
|
297
|
+
const requirementDomain = getRequirementDomainOverrides(parsed);
|
|
298
|
+
const payload = await createX402Payment(
|
|
299
|
+
state.signer,
|
|
300
|
+
parsed,
|
|
301
|
+
from,
|
|
302
|
+
void 0,
|
|
303
|
+
void 0,
|
|
304
|
+
requirementDomain.domainName,
|
|
305
|
+
requirementDomain.domainVersion
|
|
306
|
+
);
|
|
307
|
+
const encoded = encodePaymentV2(payload);
|
|
263
308
|
const headerName = getPaymentHeaderName(parsed.version);
|
|
264
309
|
const paymentResponse = await fetchWithTimeout(
|
|
265
310
|
response.url,
|
|
@@ -542,4 +587,4 @@ var createArmory = (config) => {
|
|
|
542
587
|
};
|
|
543
588
|
};
|
|
544
589
|
|
|
545
|
-
export { AuthorizationError, PaymentError, ProviderRequiredError, SignerRequiredError, SigningError, X402ClientError, armoryDelete, armoryGet, armoryPatch, armoryPay, armoryPost, armoryPut, createArmory, createX402Client, createX402Payment, createX402Transport, detectX402Version,
|
|
590
|
+
export { AuthorizationError, PaymentError, ProviderRequiredError, SignerRequiredError, SigningError, X402ClientError, armoryDelete, armoryGet, armoryPatch, armoryPay, armoryPost, armoryPut, createArmory, createX402Client, createX402Payment, createX402Transport, detectX402Version, getNetworks, getPaymentHeaderName, getTokens, getWalletAddress, normalizeWallet, parsePaymentRequired, recoverEIP3009Signer, signEIP3009, signEIP3009WithDomain, signPayment, validateNetwork, validateToken };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@armory-sh/client-ethers",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.26-alpha.23.73",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Sawyer Cutler <sawyer@dirtroad.dev>",
|
|
6
6
|
"keywords": [
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"directory": "packages/client-ethers"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@armory-sh/base": "0.2.
|
|
50
|
+
"@armory-sh/base": "0.2.27-alpha.23.73",
|
|
51
51
|
"ethers": "6.16.0"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|