@rozoai/intent-common 0.1.3 → 0.1.5
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/api/payment.d.ts +3 -16
- package/dist/api/payment.js +0 -10
- package/dist/api/payment.js.map +1 -1
- package/dist/bridge-utils.js +5 -4
- package/dist/bridge-utils.js.map +1 -1
- package/dist/rozoPay.d.ts +6 -5
- package/dist/rozoPay.js +1 -1
- package/dist/rozoPay.js.map +1 -1
- package/package.json +5 -1
- package/src/api/base.ts +0 -261
- package/src/api/fee.ts +0 -95
- package/src/api/payment.ts +0 -483
- package/src/assert.ts +0 -29
- package/src/bridge-utils.ts +0 -382
- package/src/chain.ts +0 -257
- package/src/debug.ts +0 -14
- package/src/format.ts +0 -65
- package/src/index.ts +0 -14
- package/src/primitiveTypes.ts +0 -29
- package/src/retryBackoff.ts +0 -30
- package/src/rozoPay.ts +0 -638
- package/src/token.ts +0 -1226
- package/src/try.ts +0 -25
- package/src/validation.ts +0 -54
- package/test/bridge.test.ts +0 -396
- package/tsconfig.json +0 -12
package/src/try.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { debugJson } from "./debug";
|
|
2
|
-
|
|
3
|
-
export async function awaitOrNull<T>(fn: () => Promise<T>): Promise<T | null> {
|
|
4
|
-
try {
|
|
5
|
-
return await fn();
|
|
6
|
-
} catch (e) {
|
|
7
|
-
return null;
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function tryOrNull<T>(fn: () => T): T | null {
|
|
12
|
-
try {
|
|
13
|
-
return fn();
|
|
14
|
-
} catch (e) {
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export async function awaitDebug<T>(fn: () => Promise<T>): Promise<string> {
|
|
20
|
-
try {
|
|
21
|
-
return debugJson(await fn());
|
|
22
|
-
} catch (e: any) {
|
|
23
|
-
return `<error: ${e}>`;
|
|
24
|
-
}
|
|
25
|
-
}
|
package/src/validation.ts
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { PublicKey } from "@solana/web3.js";
|
|
2
|
-
import { Address } from "@stellar/stellar-sdk";
|
|
3
|
-
import { getAddress } from "viem";
|
|
4
|
-
import { Chain, supportedChains } from "./chain";
|
|
5
|
-
import { getKnownToken } from "./token";
|
|
6
|
-
|
|
7
|
-
// Type guards
|
|
8
|
-
export function isChainSupported(
|
|
9
|
-
chainId: number,
|
|
10
|
-
type?: "evm" | "solana" | "stellar"
|
|
11
|
-
): boolean {
|
|
12
|
-
return supportedChains.some(
|
|
13
|
-
(chain: Chain) =>
|
|
14
|
-
chain.chainId === chainId && (type ? chain.type === type : true)
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function isTokenSupported(
|
|
19
|
-
chainId: number,
|
|
20
|
-
tokenAddress: string
|
|
21
|
-
): boolean {
|
|
22
|
-
return !!getKnownToken(chainId, tokenAddress);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Validation helpers
|
|
26
|
-
export function isValidEvmAddress(address: string): boolean {
|
|
27
|
-
return !!getAddress(address);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function isValidSolanaAddress(address: string): boolean {
|
|
31
|
-
const key = new PublicKey(address);
|
|
32
|
-
return PublicKey.isOnCurve(key.toBytes());
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function isValidStellarAddress(address: string): boolean {
|
|
36
|
-
return !!Address.fromString(address);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Validates that an address matches the expected format for a given chain
|
|
41
|
-
*/
|
|
42
|
-
export function validateAddressForChain(
|
|
43
|
-
chainId: number,
|
|
44
|
-
address: string
|
|
45
|
-
): boolean {
|
|
46
|
-
if (isChainSupported(chainId, "evm")) {
|
|
47
|
-
return !!getAddress(address);
|
|
48
|
-
} else if (isChainSupported(chainId, "solana")) {
|
|
49
|
-
return isValidSolanaAddress(address);
|
|
50
|
-
} else if (isChainSupported(chainId, "stellar")) {
|
|
51
|
-
return isValidStellarAddress(address);
|
|
52
|
-
}
|
|
53
|
-
return false;
|
|
54
|
-
}
|
package/test/bridge.test.ts
DELETED
|
@@ -1,396 +0,0 @@
|
|
|
1
|
-
import test from "tape";
|
|
2
|
-
import {
|
|
3
|
-
createPaymentBridgeConfig,
|
|
4
|
-
PaymentBridgeConfig,
|
|
5
|
-
} from "../src/bridge-utils";
|
|
6
|
-
import { base, polygon, rozoSolana, rozoStellar } from "../src/chain";
|
|
7
|
-
import {
|
|
8
|
-
baseUSDC,
|
|
9
|
-
polygonUSDC,
|
|
10
|
-
rozoSolanaUSDC,
|
|
11
|
-
rozoStellarUSDC,
|
|
12
|
-
} from "../src/token";
|
|
13
|
-
|
|
14
|
-
// Valid addresses for testing
|
|
15
|
-
const VALID_EVM_ADDRESS = "0x1a5FdBc891c5D4E6aD68064Ae45D43146D4F9f3a";
|
|
16
|
-
const VALID_SOLANA_ADDRESS = "E35325pbtxCRsA4uVoC3cyBDZy8BMpmxvsvGcHNUa18k";
|
|
17
|
-
const VALID_STELLAR_ADDRESS =
|
|
18
|
-
"GDATMUNQEPN4TPETV47LAKGJELK4DUHHDRPMGD3K5LOHUPXX2DI623KY";
|
|
19
|
-
|
|
20
|
-
test("createPaymentBridgeConfig - Cross-chain payment (Polygon USDC to Base USDC)", (t) => {
|
|
21
|
-
const config: PaymentBridgeConfig = {
|
|
22
|
-
toChain: base.chainId,
|
|
23
|
-
toToken: baseUSDC.token,
|
|
24
|
-
toAddress: VALID_EVM_ADDRESS,
|
|
25
|
-
toUnits: "1", // 1 USDC
|
|
26
|
-
preferredChain: polygon.chainId,
|
|
27
|
-
preferredTokenAddress: polygonUSDC.token,
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
const result = createPaymentBridgeConfig(config);
|
|
31
|
-
|
|
32
|
-
t.equal(
|
|
33
|
-
result.preferred.preferredChain,
|
|
34
|
-
String(polygon.chainId),
|
|
35
|
-
"Preferred chain should be Polygon"
|
|
36
|
-
);
|
|
37
|
-
t.equal(
|
|
38
|
-
result.preferred.preferredToken,
|
|
39
|
-
"USDC",
|
|
40
|
-
"Preferred token should be USDC"
|
|
41
|
-
);
|
|
42
|
-
t.equal(
|
|
43
|
-
result.preferred.preferredTokenAddress,
|
|
44
|
-
polygonUSDC.token,
|
|
45
|
-
"Preferred token address should match Polygon USDC"
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
t.equal(
|
|
49
|
-
result.destination.chainId,
|
|
50
|
-
String(base.chainId),
|
|
51
|
-
"Destination chain should be Base"
|
|
52
|
-
);
|
|
53
|
-
t.equal(
|
|
54
|
-
result.destination.tokenSymbol,
|
|
55
|
-
"USDC",
|
|
56
|
-
"Destination token symbol should be USDC"
|
|
57
|
-
);
|
|
58
|
-
t.equal(
|
|
59
|
-
result.destination.tokenAddress,
|
|
60
|
-
baseUSDC.token,
|
|
61
|
-
"Destination token address should match Base USDC"
|
|
62
|
-
);
|
|
63
|
-
t.equal(
|
|
64
|
-
result.destination.destinationAddress,
|
|
65
|
-
VALID_EVM_ADDRESS,
|
|
66
|
-
"Destination address should match"
|
|
67
|
-
);
|
|
68
|
-
t.equal(result.destination.amountUnits, "1", "Amount units should match");
|
|
69
|
-
|
|
70
|
-
t.equal(
|
|
71
|
-
result.isIntentPayment,
|
|
72
|
-
true,
|
|
73
|
-
"Should be an intent payment (different chains)"
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
t.end();
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test("createPaymentBridgeConfig - Same-chain payment (Base USDC to Base USDC)", (t) => {
|
|
80
|
-
const config: PaymentBridgeConfig = {
|
|
81
|
-
toChain: base.chainId,
|
|
82
|
-
toToken: baseUSDC.token,
|
|
83
|
-
toAddress: VALID_EVM_ADDRESS,
|
|
84
|
-
toUnits: "1",
|
|
85
|
-
preferredChain: base.chainId,
|
|
86
|
-
preferredTokenAddress: baseUSDC.token,
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
const result = createPaymentBridgeConfig(config);
|
|
90
|
-
|
|
91
|
-
t.equal(
|
|
92
|
-
result.preferred.preferredChain,
|
|
93
|
-
String(base.chainId),
|
|
94
|
-
"Preferred chain should be Base"
|
|
95
|
-
);
|
|
96
|
-
t.equal(
|
|
97
|
-
result.preferred.preferredToken,
|
|
98
|
-
"USDC",
|
|
99
|
-
"Preferred token should be USDC"
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
t.equal(
|
|
103
|
-
result.destination.chainId,
|
|
104
|
-
String(base.chainId),
|
|
105
|
-
"Destination chain should be Base"
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
t.equal(
|
|
109
|
-
result.isIntentPayment,
|
|
110
|
-
false,
|
|
111
|
-
"Should not be an intent payment (same chain and token)"
|
|
112
|
-
);
|
|
113
|
-
|
|
114
|
-
t.end();
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
test("createPaymentBridgeConfig - Payment to Stellar destination", (t) => {
|
|
118
|
-
const config: PaymentBridgeConfig = {
|
|
119
|
-
toChain: rozoStellar.chainId,
|
|
120
|
-
toToken: rozoStellarUSDC.token,
|
|
121
|
-
toAddress: VALID_STELLAR_ADDRESS,
|
|
122
|
-
toUnits: "1", // 1 USDC
|
|
123
|
-
preferredChain: base.chainId,
|
|
124
|
-
preferredTokenAddress: baseUSDC.token,
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
const result = createPaymentBridgeConfig(config);
|
|
128
|
-
|
|
129
|
-
t.equal(
|
|
130
|
-
result.preferred.preferredChain,
|
|
131
|
-
String(base.chainId),
|
|
132
|
-
"Preferred chain should be Base"
|
|
133
|
-
);
|
|
134
|
-
t.equal(
|
|
135
|
-
result.preferred.preferredToken,
|
|
136
|
-
"USDC",
|
|
137
|
-
"Preferred token should be USDC"
|
|
138
|
-
);
|
|
139
|
-
|
|
140
|
-
// Destination should be configured for Stellar
|
|
141
|
-
t.equal(
|
|
142
|
-
result.destination.chainId,
|
|
143
|
-
String(rozoStellarUSDC.chainId),
|
|
144
|
-
"Destination chain should be Stellar"
|
|
145
|
-
);
|
|
146
|
-
t.equal(
|
|
147
|
-
result.destination.tokenSymbol,
|
|
148
|
-
rozoStellarUSDC.symbol,
|
|
149
|
-
"Destination token symbol should be Stellar USDC"
|
|
150
|
-
);
|
|
151
|
-
t.equal(
|
|
152
|
-
result.destination.tokenAddress,
|
|
153
|
-
rozoStellarUSDC.token,
|
|
154
|
-
"Destination token address should match Stellar USDC"
|
|
155
|
-
);
|
|
156
|
-
t.equal(
|
|
157
|
-
result.destination.destinationAddress,
|
|
158
|
-
VALID_STELLAR_ADDRESS,
|
|
159
|
-
"Destination address should match Stellar address"
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
t.equal(
|
|
163
|
-
result.isIntentPayment,
|
|
164
|
-
true,
|
|
165
|
-
"Should be an intent payment (Base to Stellar)"
|
|
166
|
-
);
|
|
167
|
-
|
|
168
|
-
t.end();
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
test("createPaymentBridgeConfig - Payment to Solana destination", (t) => {
|
|
172
|
-
const config: PaymentBridgeConfig = {
|
|
173
|
-
toChain: rozoSolana.chainId,
|
|
174
|
-
toToken: rozoSolanaUSDC.token,
|
|
175
|
-
toAddress: VALID_SOLANA_ADDRESS,
|
|
176
|
-
toUnits: "1", // 1 USDC
|
|
177
|
-
preferredChain: base.chainId,
|
|
178
|
-
preferredTokenAddress: baseUSDC.token,
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
const result = createPaymentBridgeConfig(config);
|
|
182
|
-
|
|
183
|
-
t.equal(
|
|
184
|
-
result.preferred.preferredChain,
|
|
185
|
-
String(base.chainId),
|
|
186
|
-
"Preferred chain should be Base"
|
|
187
|
-
);
|
|
188
|
-
t.equal(
|
|
189
|
-
result.preferred.preferredToken,
|
|
190
|
-
"USDC",
|
|
191
|
-
"Preferred token should be USDC"
|
|
192
|
-
);
|
|
193
|
-
|
|
194
|
-
// Destination should be configured for Solana
|
|
195
|
-
t.equal(
|
|
196
|
-
result.destination.chainId,
|
|
197
|
-
String(rozoSolanaUSDC.chainId),
|
|
198
|
-
"Destination chain should be Solana"
|
|
199
|
-
);
|
|
200
|
-
t.equal(
|
|
201
|
-
result.destination.tokenSymbol,
|
|
202
|
-
rozoSolanaUSDC.symbol,
|
|
203
|
-
"Destination token symbol should be Solana USDC"
|
|
204
|
-
);
|
|
205
|
-
t.equal(
|
|
206
|
-
result.destination.tokenAddress,
|
|
207
|
-
rozoSolanaUSDC.token,
|
|
208
|
-
"Destination token address should match Solana USDC"
|
|
209
|
-
);
|
|
210
|
-
t.equal(
|
|
211
|
-
result.destination.destinationAddress,
|
|
212
|
-
VALID_SOLANA_ADDRESS,
|
|
213
|
-
"Destination address should match Solana address"
|
|
214
|
-
);
|
|
215
|
-
|
|
216
|
-
t.equal(
|
|
217
|
-
result.isIntentPayment,
|
|
218
|
-
true,
|
|
219
|
-
"Should be an intent payment (Base to Solana)"
|
|
220
|
-
);
|
|
221
|
-
|
|
222
|
-
t.end();
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
test("createPaymentBridgeConfig - Error: Unsupported token", (t) => {
|
|
226
|
-
const config: PaymentBridgeConfig = {
|
|
227
|
-
toChain: base.chainId,
|
|
228
|
-
toToken: "0x0000000000000000000000000000000000000000", // Invalid token
|
|
229
|
-
toAddress: VALID_EVM_ADDRESS,
|
|
230
|
-
toUnits: "1",
|
|
231
|
-
preferredChain: base.chainId,
|
|
232
|
-
preferredTokenAddress: baseUSDC.token,
|
|
233
|
-
};
|
|
234
|
-
|
|
235
|
-
t.throws(
|
|
236
|
-
() => createPaymentBridgeConfig(config),
|
|
237
|
-
/(Unsupported token|or token)/,
|
|
238
|
-
"Should throw error for unsupported token"
|
|
239
|
-
);
|
|
240
|
-
|
|
241
|
-
t.end();
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
test("createPaymentBridgeConfig - Error: Invalid address for chain", (t) => {
|
|
245
|
-
const config: PaymentBridgeConfig = {
|
|
246
|
-
toChain: base.chainId,
|
|
247
|
-
toToken: baseUSDC.token,
|
|
248
|
-
toAddress: "invalid-address",
|
|
249
|
-
toUnits: "1",
|
|
250
|
-
preferredChain: base.chainId,
|
|
251
|
-
preferredTokenAddress: baseUSDC.token,
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
t.throws(
|
|
255
|
-
() => createPaymentBridgeConfig(config),
|
|
256
|
-
(err: any) => {
|
|
257
|
-
// viem's getAddress throws InvalidAddressError when address is invalid
|
|
258
|
-
// The error will be thrown from validateAddressForChain before the bridge function can catch it
|
|
259
|
-
return (
|
|
260
|
-
err.name === "InvalidAddressError" ||
|
|
261
|
-
err.message?.includes("Address") ||
|
|
262
|
-
err.message?.includes("invalid")
|
|
263
|
-
);
|
|
264
|
-
},
|
|
265
|
-
"Should throw error for invalid address"
|
|
266
|
-
);
|
|
267
|
-
|
|
268
|
-
t.end();
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
test("createPaymentBridgeConfig - Error: Unsupported preferred token", (t) => {
|
|
272
|
-
const config: PaymentBridgeConfig = {
|
|
273
|
-
toChain: base.chainId,
|
|
274
|
-
toToken: baseUSDC.token,
|
|
275
|
-
toAddress: VALID_EVM_ADDRESS,
|
|
276
|
-
toUnits: "1",
|
|
277
|
-
preferredChain: polygon.chainId,
|
|
278
|
-
preferredTokenAddress: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", // Truly invalid token address
|
|
279
|
-
};
|
|
280
|
-
|
|
281
|
-
t.throws(
|
|
282
|
-
() => createPaymentBridgeConfig(config),
|
|
283
|
-
/Unknown token/,
|
|
284
|
-
"Should throw error for unsupported preferred token"
|
|
285
|
-
);
|
|
286
|
-
|
|
287
|
-
t.end();
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
test("createPaymentBridgeConfig - Error: Unsupported chain or token", (t) => {
|
|
291
|
-
const config: PaymentBridgeConfig = {
|
|
292
|
-
toChain: 99999, // Unsupported chain
|
|
293
|
-
toToken: baseUSDC.token,
|
|
294
|
-
toAddress: VALID_EVM_ADDRESS,
|
|
295
|
-
toUnits: "1",
|
|
296
|
-
preferredChain: base.chainId,
|
|
297
|
-
preferredTokenAddress: baseUSDC.token,
|
|
298
|
-
};
|
|
299
|
-
|
|
300
|
-
t.throws(
|
|
301
|
-
() => createPaymentBridgeConfig(config),
|
|
302
|
-
/Unknown chainId/,
|
|
303
|
-
"Should throw error for unsupported chain"
|
|
304
|
-
);
|
|
305
|
-
|
|
306
|
-
t.end();
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
test("createPaymentBridgeConfig - Intent payment detection: different chain, same token", (t) => {
|
|
310
|
-
const config: PaymentBridgeConfig = {
|
|
311
|
-
toChain: base.chainId,
|
|
312
|
-
toToken: baseUSDC.token,
|
|
313
|
-
toAddress: VALID_EVM_ADDRESS,
|
|
314
|
-
toUnits: "1",
|
|
315
|
-
preferredChain: polygon.chainId,
|
|
316
|
-
preferredTokenAddress: polygonUSDC.token,
|
|
317
|
-
};
|
|
318
|
-
|
|
319
|
-
const result = createPaymentBridgeConfig(config);
|
|
320
|
-
|
|
321
|
-
t.equal(
|
|
322
|
-
result.isIntentPayment,
|
|
323
|
-
true,
|
|
324
|
-
"Should be intent payment when chains differ"
|
|
325
|
-
);
|
|
326
|
-
|
|
327
|
-
t.end();
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
test("createPaymentBridgeConfig - Intent payment detection: same chain, different token", (t) => {
|
|
331
|
-
// This test assumes there are different tokens on the same chain
|
|
332
|
-
// For Base, we'll use the same token but the logic should still work
|
|
333
|
-
const config: PaymentBridgeConfig = {
|
|
334
|
-
toChain: base.chainId,
|
|
335
|
-
toToken: baseUSDC.token,
|
|
336
|
-
toAddress: VALID_EVM_ADDRESS,
|
|
337
|
-
toUnits: "1",
|
|
338
|
-
preferredChain: base.chainId,
|
|
339
|
-
preferredTokenAddress: baseUSDC.token,
|
|
340
|
-
};
|
|
341
|
-
|
|
342
|
-
const result = createPaymentBridgeConfig(config);
|
|
343
|
-
|
|
344
|
-
// When same chain and token, preferredTokenAddress will be set but
|
|
345
|
-
// the comparison checks preferredToken (symbol) vs toToken (address)
|
|
346
|
-
// So this might still be false if symbols match
|
|
347
|
-
t.equal(
|
|
348
|
-
result.isIntentPayment,
|
|
349
|
-
false,
|
|
350
|
-
"Should not be intent payment when same chain and token"
|
|
351
|
-
);
|
|
352
|
-
|
|
353
|
-
t.end();
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
test("createPaymentBridgeConfig - Large amount units", (t) => {
|
|
357
|
-
const config: PaymentBridgeConfig = {
|
|
358
|
-
toChain: base.chainId,
|
|
359
|
-
toToken: baseUSDC.token,
|
|
360
|
-
toAddress: VALID_EVM_ADDRESS,
|
|
361
|
-
toUnits: "1000000", // 1 million USDC
|
|
362
|
-
preferredChain: polygon.chainId,
|
|
363
|
-
preferredTokenAddress: polygonUSDC.token,
|
|
364
|
-
};
|
|
365
|
-
|
|
366
|
-
const result = createPaymentBridgeConfig(config);
|
|
367
|
-
|
|
368
|
-
t.equal(
|
|
369
|
-
result.destination.amountUnits,
|
|
370
|
-
"1000000",
|
|
371
|
-
"Should handle large amount units correctly"
|
|
372
|
-
);
|
|
373
|
-
|
|
374
|
-
t.end();
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
test("createPaymentBridgeConfig - Zero amount units", (t) => {
|
|
378
|
-
const config: PaymentBridgeConfig = {
|
|
379
|
-
toChain: base.chainId,
|
|
380
|
-
toToken: baseUSDC.token,
|
|
381
|
-
toAddress: VALID_EVM_ADDRESS,
|
|
382
|
-
toUnits: "0",
|
|
383
|
-
preferredChain: base.chainId,
|
|
384
|
-
preferredTokenAddress: baseUSDC.token,
|
|
385
|
-
};
|
|
386
|
-
|
|
387
|
-
const result = createPaymentBridgeConfig(config);
|
|
388
|
-
|
|
389
|
-
t.equal(
|
|
390
|
-
result.destination.amountUnits,
|
|
391
|
-
"0",
|
|
392
|
-
"Should handle zero amount units correctly"
|
|
393
|
-
);
|
|
394
|
-
|
|
395
|
-
t.end();
|
|
396
|
-
});
|
package/tsconfig.json
DELETED