@t2000/sdk 10.38.2 → 10.40.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/browser.cjs +370 -8
- package/dist/browser.d.cts +1 -1
- package/dist/browser.d.ts +1 -1
- package/dist/browser.js +356 -9
- package/dist/{commerce-D14qzqAV.d.cts → commerce-3ztE5Gg3.d.cts} +178 -8
- package/dist/{commerce-D14qzqAV.d.ts → commerce-3ztE5Gg3.d.ts} +178 -8
- package/dist/index.cjs +322 -1
- package/dist/index.d.cts +43 -4
- package/dist/index.d.ts +43 -4
- package/dist/index.js +302 -2
- package/package.json +2 -2
package/dist/browser.js
CHANGED
|
@@ -1349,19 +1349,88 @@ init_coinSelection();
|
|
|
1349
1349
|
init_errors();
|
|
1350
1350
|
init_token_registry();
|
|
1351
1351
|
init_coinSelection();
|
|
1352
|
-
var MAINNET_A2A_ESCROW_LATEST_PACKAGE_ID = "
|
|
1352
|
+
var MAINNET_A2A_ESCROW_LATEST_PACKAGE_ID = "0x1f88ca77b1980e3d0750e83d1363c6025cd677c2f420cae51a86d4a0bddf93c5";
|
|
1353
1353
|
var A2A_ESCROW_LATEST_PACKAGE_ID = process.env.A2A_ESCROW_OPENING_PACKAGE_ID ?? process.env.A2A_ESCROW_PACKAGE_ID ?? MAINNET_A2A_ESCROW_LATEST_PACKAGE_ID;
|
|
1354
|
+
var A2A_ESCROW_OPENING_PACKAGE_ID = A2A_ESCROW_LATEST_PACKAGE_ID;
|
|
1354
1355
|
var A2A_ESCROW_PACKAGE_V7_ID = "0x4249f0b242c47c7baf0c37304365bc4bbe769bcedf11f3525e84682d59a3b23e";
|
|
1355
1356
|
var A2A_ESCROW_PACKAGE_V8_ID = "0x1595b80bc05a03607f3908702c866ca63cf961025b4263b5ecbe419e07f8ff31";
|
|
1356
1357
|
var A2A_ESCROW_PACKAGE_V10_ID = process.env.A2A_ESCROW_PACKAGE_V10_ID ?? "0x5c90ec07da01bf885a4e65247ce98b75ab8a042cd965d30d7213856d579c4afa";
|
|
1358
|
+
process.env.A2A_ESCROW_PACKAGE_V11_ID ?? "0x2a928916c859a159e6d6f4841073a31397d01336c1ea689ce74344e456463c8d";
|
|
1359
|
+
process.env.A2A_ESCROW_PACKAGE_V12_ID ?? "0x1f88ca77b1980e3d0750e83d1363c6025cd677c2f420cae51a86d4a0bddf93c5";
|
|
1360
|
+
var SHA256_HEX_RE = /^(0x)?[0-9a-fA-F]{64}$/;
|
|
1357
1361
|
var OPENING_CLAIM_POLICY_ANY_ACTIVE = 0;
|
|
1358
1362
|
var OPENING_CLAIM_POLICY_PROVEN = 1;
|
|
1359
1363
|
var OPENING_CLAIM_POLICY_PROVEN_4STAR = 2;
|
|
1364
|
+
var MAX_OPEN_WINDOW_MS = 2592e6;
|
|
1365
|
+
function feeConfigArg(tx) {
|
|
1366
|
+
return tx.sharedObjectRef({
|
|
1367
|
+
objectId: A2A_ESCROW_FEE_CONFIG_ID,
|
|
1368
|
+
initialSharedVersion: A2A_ESCROW_FEE_CONFIG_VERSION,
|
|
1369
|
+
mutable: false
|
|
1370
|
+
});
|
|
1371
|
+
}
|
|
1360
1372
|
var OPENING_CLAIM_POLICIES = [
|
|
1361
1373
|
OPENING_CLAIM_POLICY_ANY_ACTIVE,
|
|
1362
1374
|
OPENING_CLAIM_POLICY_PROVEN,
|
|
1363
1375
|
OPENING_CLAIM_POLICY_PROVEN_4STAR
|
|
1364
1376
|
];
|
|
1377
|
+
var OPEN_REJECT_SPLIT_BPS = 1e4;
|
|
1378
|
+
function preflightCreateOpening(terms) {
|
|
1379
|
+
if (!Number.isFinite(terms.amountUsdc) || terms.amountUsdc <= 0) {
|
|
1380
|
+
return { valid: false, code: "INVALID_AMOUNT", error: "Budget must be positive." };
|
|
1381
|
+
}
|
|
1382
|
+
if (terms.amountUsdc < MIN_JOB_USDC) {
|
|
1383
|
+
return {
|
|
1384
|
+
valid: false,
|
|
1385
|
+
code: "INVALID_AMOUNT",
|
|
1386
|
+
error: `Open jobs start at ${MIN_JOB_USDC} USDC (contract-enforced minimum). Got ${terms.amountUsdc}.`
|
|
1387
|
+
};
|
|
1388
|
+
}
|
|
1389
|
+
if (terms.amountUsdc > MAX_JOB_USDC) {
|
|
1390
|
+
return {
|
|
1391
|
+
valid: false,
|
|
1392
|
+
code: "INVALID_AMOUNT",
|
|
1393
|
+
error: `Open jobs cap at ${MAX_JOB_USDC} USDC (v1).`
|
|
1394
|
+
};
|
|
1395
|
+
}
|
|
1396
|
+
if (!SHA256_HEX_RE.test(terms.specHash)) {
|
|
1397
|
+
return { valid: false, code: "INVALID_INPUT", error: "specHash must be a sha256 hex string." };
|
|
1398
|
+
}
|
|
1399
|
+
const now = Date.now();
|
|
1400
|
+
if (terms.openUntilMs <= now) {
|
|
1401
|
+
return { valid: false, code: "INVALID_INPUT", error: "openUntil must be in the future." };
|
|
1402
|
+
}
|
|
1403
|
+
if (terms.openUntilMs > now + MAX_OPEN_WINDOW_MS) {
|
|
1404
|
+
return { valid: false, code: "INVALID_INPUT", error: "Openings can stay claimable at most 30 days." };
|
|
1405
|
+
}
|
|
1406
|
+
if (terms.slaMs <= 0) {
|
|
1407
|
+
return { valid: false, code: "INVALID_INPUT", error: "Delivery window must be positive." };
|
|
1408
|
+
}
|
|
1409
|
+
if (terms.rejectSplitBps !== OPEN_REJECT_SPLIT_BPS) {
|
|
1410
|
+
return {
|
|
1411
|
+
valid: false,
|
|
1412
|
+
code: "INVALID_INPUT",
|
|
1413
|
+
error: "Open postings lock reject at 100% buyer / 0% seller (rejectSplitBps must be 10000, contract-enforced since v5) \u2014 reject is economically a decline, so junk delivery has no edge."
|
|
1414
|
+
};
|
|
1415
|
+
}
|
|
1416
|
+
const policy = terms.claimPolicy ?? OPENING_CLAIM_POLICY_ANY_ACTIVE;
|
|
1417
|
+
if (!OPENING_CLAIM_POLICIES.includes(policy)) {
|
|
1418
|
+
return {
|
|
1419
|
+
valid: false,
|
|
1420
|
+
code: "INVALID_INPUT",
|
|
1421
|
+
error: "claimPolicy must be 0 (Anyone), 1 (Proven) or 2 (Proven \xB7 4\u2605+) \u2014 anything else aborts on-chain."
|
|
1422
|
+
};
|
|
1423
|
+
}
|
|
1424
|
+
const minLevel = terms.minSellerLevel ?? 0;
|
|
1425
|
+
if (!Number.isInteger(minLevel) || minLevel < 0 || minLevel > 4) {
|
|
1426
|
+
return {
|
|
1427
|
+
valid: false,
|
|
1428
|
+
code: "INVALID_INPUT",
|
|
1429
|
+
error: "minSellerLevel must be 0 (no floor) or 1\u20134 (Level 1\u20134) \u2014 anything else aborts on-chain (S.1192)."
|
|
1430
|
+
};
|
|
1431
|
+
}
|
|
1432
|
+
return { valid: true };
|
|
1433
|
+
}
|
|
1365
1434
|
|
|
1366
1435
|
// src/wallet/job.ts
|
|
1367
1436
|
var MAINNET_A2A_ESCROW_PACKAGE_ID = "0x358a819c1c016e2cc84ef5fbea81cba90c31f7f8a62bf45cb5e5276acf198bdd";
|
|
@@ -1372,7 +1441,7 @@ var A2A_ESCROW_FEE_CONFIG_VERSION = Number(
|
|
|
1372
1441
|
);
|
|
1373
1442
|
var CLOCK_ID2 = "0x6";
|
|
1374
1443
|
var MODULE = "escrow";
|
|
1375
|
-
function
|
|
1444
|
+
function feeConfigArg2(tx) {
|
|
1376
1445
|
return tx.sharedObjectRef({
|
|
1377
1446
|
objectId: A2A_ESCROW_FEE_CONFIG_ID,
|
|
1378
1447
|
initialSharedVersion: A2A_ESCROW_FEE_CONFIG_VERSION,
|
|
@@ -1473,7 +1542,7 @@ async function buildCreateJobTx({
|
|
|
1473
1542
|
tx.pure.u64(terms.deliverByMs),
|
|
1474
1543
|
tx.pure.u64(terms.reviewWindowMs),
|
|
1475
1544
|
tx.pure.u64(terms.rejectSplitBps),
|
|
1476
|
-
|
|
1545
|
+
feeConfigArg2(tx),
|
|
1477
1546
|
tx.object(CLOCK_ID2)
|
|
1478
1547
|
]
|
|
1479
1548
|
});
|
|
@@ -1481,6 +1550,29 @@ async function buildCreateJobTx({
|
|
|
1481
1550
|
}
|
|
1482
1551
|
function buildRejectJobTx(jobId, v2) {
|
|
1483
1552
|
const tx = new Transaction();
|
|
1553
|
+
if (v2.batchId) {
|
|
1554
|
+
tx.moveCall({
|
|
1555
|
+
target: `${A2A_ESCROW_LATEST_PACKAGE_ID}::batch::${v2.buyerScoreId ? "batch_reject_agent_buyer" : "batch_reject"}`,
|
|
1556
|
+
typeArguments: [USDC_TYPE],
|
|
1557
|
+
arguments: v2.buyerScoreId ? [
|
|
1558
|
+
tx.object(v2.batchId),
|
|
1559
|
+
tx.object(jobId),
|
|
1560
|
+
tx.object(v2.sellerScoreId),
|
|
1561
|
+
tx.object(v2.buyerScoreId),
|
|
1562
|
+
tx.object(v2.registryId),
|
|
1563
|
+
feeConfigArg2(tx),
|
|
1564
|
+
tx.object(CLOCK_ID2)
|
|
1565
|
+
] : [
|
|
1566
|
+
tx.object(v2.batchId),
|
|
1567
|
+
tx.object(jobId),
|
|
1568
|
+
tx.object(v2.sellerScoreId),
|
|
1569
|
+
tx.object(v2.registryId),
|
|
1570
|
+
feeConfigArg2(tx),
|
|
1571
|
+
tx.object(CLOCK_ID2)
|
|
1572
|
+
]
|
|
1573
|
+
});
|
|
1574
|
+
return tx;
|
|
1575
|
+
}
|
|
1484
1576
|
tx.moveCall({
|
|
1485
1577
|
target: `${A2A_ESCROW_LATEST_PACKAGE_ID}::reputation::${v2.buyerScoreId ? "reject_v2_agent_buyer" : "reject_v2"}`,
|
|
1486
1578
|
typeArguments: [USDC_TYPE],
|
|
@@ -1489,13 +1581,13 @@ function buildRejectJobTx(jobId, v2) {
|
|
|
1489
1581
|
tx.object(v2.sellerScoreId),
|
|
1490
1582
|
tx.object(v2.buyerScoreId),
|
|
1491
1583
|
tx.object(v2.registryId),
|
|
1492
|
-
|
|
1584
|
+
feeConfigArg2(tx),
|
|
1493
1585
|
tx.object(CLOCK_ID2)
|
|
1494
1586
|
] : [
|
|
1495
1587
|
tx.object(jobId),
|
|
1496
1588
|
tx.object(v2.sellerScoreId),
|
|
1497
1589
|
tx.object(v2.registryId),
|
|
1498
|
-
|
|
1590
|
+
feeConfigArg2(tx),
|
|
1499
1591
|
tx.object(CLOCK_ID2)
|
|
1500
1592
|
]
|
|
1501
1593
|
});
|
|
@@ -1503,13 +1595,27 @@ function buildRejectJobTx(jobId, v2) {
|
|
|
1503
1595
|
}
|
|
1504
1596
|
function buildRefundJobTx(jobId, v2) {
|
|
1505
1597
|
const tx = new Transaction();
|
|
1598
|
+
if (v2.batchId) {
|
|
1599
|
+
tx.moveCall({
|
|
1600
|
+
target: `${A2A_ESCROW_LATEST_PACKAGE_ID}::batch::batch_refund`,
|
|
1601
|
+
typeArguments: [USDC_TYPE],
|
|
1602
|
+
arguments: [
|
|
1603
|
+
tx.object(v2.batchId),
|
|
1604
|
+
tx.object(jobId),
|
|
1605
|
+
tx.object(v2.sellerScoreId),
|
|
1606
|
+
feeConfigArg2(tx),
|
|
1607
|
+
tx.object(CLOCK_ID2)
|
|
1608
|
+
]
|
|
1609
|
+
});
|
|
1610
|
+
return tx;
|
|
1611
|
+
}
|
|
1506
1612
|
tx.moveCall({
|
|
1507
1613
|
target: `${A2A_ESCROW_LATEST_PACKAGE_ID}::reputation::refund_v2`,
|
|
1508
1614
|
typeArguments: [USDC_TYPE],
|
|
1509
1615
|
arguments: [
|
|
1510
1616
|
tx.object(jobId),
|
|
1511
1617
|
tx.object(v2.sellerScoreId),
|
|
1512
|
-
|
|
1618
|
+
feeConfigArg2(tx),
|
|
1513
1619
|
tx.object(CLOCK_ID2)
|
|
1514
1620
|
]
|
|
1515
1621
|
});
|
|
@@ -1523,7 +1629,7 @@ function buildDeliverJobTx(jobId, deliveryHash) {
|
|
|
1523
1629
|
arguments: [
|
|
1524
1630
|
tx.object(jobId),
|
|
1525
1631
|
tx.pure.vector("u8", hexToBytes(deliveryHash)),
|
|
1526
|
-
|
|
1632
|
+
feeConfigArg2(tx),
|
|
1527
1633
|
tx.object(CLOCK_ID2)
|
|
1528
1634
|
]
|
|
1529
1635
|
});
|
|
@@ -1531,13 +1637,27 @@ function buildDeliverJobTx(jobId, deliveryHash) {
|
|
|
1531
1637
|
}
|
|
1532
1638
|
function buildReleaseJobTx(jobId, v2) {
|
|
1533
1639
|
const tx = new Transaction();
|
|
1640
|
+
if (v2.batchId) {
|
|
1641
|
+
tx.moveCall({
|
|
1642
|
+
target: `${A2A_ESCROW_LATEST_PACKAGE_ID}::batch::batch_release`,
|
|
1643
|
+
typeArguments: [USDC_TYPE],
|
|
1644
|
+
arguments: [
|
|
1645
|
+
tx.object(v2.batchId),
|
|
1646
|
+
tx.object(jobId),
|
|
1647
|
+
tx.object(v2.sellerScoreId),
|
|
1648
|
+
feeConfigArg2(tx),
|
|
1649
|
+
tx.object(CLOCK_ID2)
|
|
1650
|
+
]
|
|
1651
|
+
});
|
|
1652
|
+
return tx;
|
|
1653
|
+
}
|
|
1534
1654
|
tx.moveCall({
|
|
1535
1655
|
target: `${A2A_ESCROW_LATEST_PACKAGE_ID}::reputation::release_v2`,
|
|
1536
1656
|
typeArguments: [USDC_TYPE],
|
|
1537
1657
|
arguments: [
|
|
1538
1658
|
tx.object(jobId),
|
|
1539
1659
|
tx.object(v2.sellerScoreId),
|
|
1540
|
-
|
|
1660
|
+
feeConfigArg2(tx),
|
|
1541
1661
|
tx.object(CLOCK_ID2)
|
|
1542
1662
|
]
|
|
1543
1663
|
});
|
|
@@ -1580,6 +1700,26 @@ async function getJob(client, jobId) {
|
|
|
1580
1700
|
createdAtMs: Number(json.created_at_ms)
|
|
1581
1701
|
};
|
|
1582
1702
|
}
|
|
1703
|
+
var BATCH_ORIGIN_KEY_TYPE_SUFFIX = "::escrow::BatchOriginKey";
|
|
1704
|
+
async function getJobBatchOrigin(client, jobId) {
|
|
1705
|
+
let cursor = null;
|
|
1706
|
+
do {
|
|
1707
|
+
const page = await client.core.listDynamicFields({
|
|
1708
|
+
parentId: jobId,
|
|
1709
|
+
cursor: cursor ?? void 0
|
|
1710
|
+
});
|
|
1711
|
+
for (const field of page.dynamicFields) {
|
|
1712
|
+
if (!field.name.type.endsWith(BATCH_ORIGIN_KEY_TYPE_SUFFIX)) continue;
|
|
1713
|
+
const resp = await client.core.getDynamicField({
|
|
1714
|
+
parentId: jobId,
|
|
1715
|
+
name: field.name
|
|
1716
|
+
});
|
|
1717
|
+
return bcs.Address.parse(resp.dynamicField.value.bcs);
|
|
1718
|
+
}
|
|
1719
|
+
cursor = page.hasNextPage ? page.cursor : null;
|
|
1720
|
+
} while (cursor);
|
|
1721
|
+
return null;
|
|
1722
|
+
}
|
|
1583
1723
|
function jobActionsFor(job, caller, nowMs = Date.now()) {
|
|
1584
1724
|
const me = validateAddress(caller);
|
|
1585
1725
|
const isBuyer = me === job.buyer;
|
|
@@ -1769,6 +1909,213 @@ function preflightClaimOpening(score, opening) {
|
|
|
1769
1909
|
return { valid: true };
|
|
1770
1910
|
}
|
|
1771
1911
|
|
|
1912
|
+
// src/wallet/batch.ts
|
|
1913
|
+
init_errors();
|
|
1914
|
+
init_token_registry();
|
|
1915
|
+
init_coinSelection();
|
|
1916
|
+
var MODULE3 = "batch";
|
|
1917
|
+
var CLOCK_ID3 = "0x6";
|
|
1918
|
+
var MAX_BATCH_SLOTS_DEFAULT = 250;
|
|
1919
|
+
var BATCH_OPENING_TYPE_MARKER = "::batch::BatchOpening<";
|
|
1920
|
+
var BATCH_ABORT_CODES = {
|
|
1921
|
+
/** At your wave cap RIGHT NOW — min(buyer ceiling, level cap) active
|
|
1922
|
+
* holds. Settle one to reclaim; never "lifetime". */
|
|
1923
|
+
EMaxClaimsReached: 12,
|
|
1924
|
+
/** Pre-S.1202 wave — lifetime rows never free, so new claims refuse.
|
|
1925
|
+
* The wave's cancel / expired-refund still work. */
|
|
1926
|
+
ELegacyBatch: 22,
|
|
1927
|
+
/** The Job passed to a batch settle door has no BatchOriginKey. */
|
|
1928
|
+
ENotBatchJob: 23,
|
|
1929
|
+
/** The attached wave is not this Job's origin batch. */
|
|
1930
|
+
EWrongBatch: 24,
|
|
1931
|
+
EWrongSellerScore: 25,
|
|
1932
|
+
EWrongBuyerScore: 26,
|
|
1933
|
+
/** Registered Agent-ID buyer must reject via the agent-buyer variant. */
|
|
1934
|
+
EBuyerIsAgent: 27,
|
|
1935
|
+
EBuyerNotAgent: 28
|
|
1936
|
+
};
|
|
1937
|
+
var REPUTATION_ABORT_CODES = {
|
|
1938
|
+
/** A bare v2 door (release_v2 / reject_v2 variants / refund_v2) on a
|
|
1939
|
+
* batch-origin Job — the client must attach the batch and settle via
|
|
1940
|
+
* the batch doors. */
|
|
1941
|
+
EUseBatchSettle: 9
|
|
1942
|
+
};
|
|
1943
|
+
var ESCROW_ABORT_CODES = {
|
|
1944
|
+
/** Stale package flow (FeeConfig VERSION moved) — update @t2000/*. */
|
|
1945
|
+
EWrongVersion: 13,
|
|
1946
|
+
/** Second wave-hold free on one Job (unreachable via the doors). */
|
|
1947
|
+
EBatchHoldReleased: 23
|
|
1948
|
+
};
|
|
1949
|
+
function preflightCreateBatchOpening(terms) {
|
|
1950
|
+
const single = preflightCreateOpening(terms);
|
|
1951
|
+
if (!single.valid) return single;
|
|
1952
|
+
if (!Number.isInteger(terms.slots) || terms.slots < 1 || terms.slots > MAX_BATCH_SLOTS_DEFAULT) {
|
|
1953
|
+
return {
|
|
1954
|
+
valid: false,
|
|
1955
|
+
code: "INVALID_INPUT",
|
|
1956
|
+
error: `slots must be an integer 1\u2013${MAX_BATCH_SLOTS_DEFAULT} (the live max is AdminCap-tunable on-chain).`
|
|
1957
|
+
};
|
|
1958
|
+
}
|
|
1959
|
+
const maxClaims = terms.maxClaimsPerAgent ?? 1;
|
|
1960
|
+
if (!Number.isInteger(maxClaims) || maxClaims < 1 || maxClaims > terms.slots) {
|
|
1961
|
+
return {
|
|
1962
|
+
valid: false,
|
|
1963
|
+
code: "INVALID_INPUT",
|
|
1964
|
+
error: "maxClaimsPerAgent must be an integer \u22651 and \u2264 slots."
|
|
1965
|
+
};
|
|
1966
|
+
}
|
|
1967
|
+
return { valid: true };
|
|
1968
|
+
}
|
|
1969
|
+
async function buildCreateBatchOpeningTx({
|
|
1970
|
+
client,
|
|
1971
|
+
buyer,
|
|
1972
|
+
terms
|
|
1973
|
+
}) {
|
|
1974
|
+
const pf = preflightCreateBatchOpening(terms);
|
|
1975
|
+
if (!pf.valid) throw new T2000Error(pf.code ?? "INVALID_INPUT", pf.error ?? "Invalid batch.");
|
|
1976
|
+
const perSlotRaw = BigInt(Math.floor(terms.amountUsdc * 10 ** USDC_DECIMALS));
|
|
1977
|
+
const totalRaw = perSlotRaw * BigInt(terms.slots);
|
|
1978
|
+
const tx = new Transaction();
|
|
1979
|
+
const { coin } = await selectAndSplitCoin(
|
|
1980
|
+
tx,
|
|
1981
|
+
client,
|
|
1982
|
+
validateAddress(buyer),
|
|
1983
|
+
USDC_TYPE,
|
|
1984
|
+
totalRaw,
|
|
1985
|
+
{ allowSwapAll: false }
|
|
1986
|
+
);
|
|
1987
|
+
tx.moveCall({
|
|
1988
|
+
target: `${A2A_ESCROW_OPENING_PACKAGE_ID}::${MODULE3}::create_batch_open`,
|
|
1989
|
+
typeArguments: [USDC_TYPE],
|
|
1990
|
+
arguments: [
|
|
1991
|
+
coin,
|
|
1992
|
+
tx.pure.u64(terms.slots),
|
|
1993
|
+
tx.pure.vector("u8", hexToBytes2(terms.specHash)),
|
|
1994
|
+
tx.pure.u64(terms.openUntilMs),
|
|
1995
|
+
tx.pure.u64(terms.slaMs),
|
|
1996
|
+
tx.pure.u64(terms.reviewWindowMs),
|
|
1997
|
+
tx.pure.u64(terms.rejectSplitBps),
|
|
1998
|
+
tx.pure.u8(terms.claimPolicy ?? OPENING_CLAIM_POLICY_ANY_ACTIVE),
|
|
1999
|
+
tx.pure.u8(terms.minSellerLevel ?? 0),
|
|
2000
|
+
tx.pure.u8(terms.maxClaimsPerAgent ?? 1),
|
|
2001
|
+
feeConfigArg(tx),
|
|
2002
|
+
tx.object(CLOCK_ID3)
|
|
2003
|
+
]
|
|
2004
|
+
});
|
|
2005
|
+
return tx;
|
|
2006
|
+
}
|
|
2007
|
+
function buildBatchClaimTx({
|
|
2008
|
+
batchId,
|
|
2009
|
+
registryId,
|
|
2010
|
+
scoreId
|
|
2011
|
+
}) {
|
|
2012
|
+
if (!scoreId) {
|
|
2013
|
+
throw new T2000Error(
|
|
2014
|
+
"INVALID_INPUT",
|
|
2015
|
+
"Claiming needs the claimer's own AgentScore id (derive with deriveAgentScoreId; create it first with buildCreateEmptyScoreTx when missing)."
|
|
2016
|
+
);
|
|
2017
|
+
}
|
|
2018
|
+
const tx = new Transaction();
|
|
2019
|
+
tx.moveCall({
|
|
2020
|
+
target: `${A2A_ESCROW_OPENING_PACKAGE_ID}::${MODULE3}::batch_claim`,
|
|
2021
|
+
typeArguments: [USDC_TYPE],
|
|
2022
|
+
arguments: [
|
|
2023
|
+
tx.object(batchId),
|
|
2024
|
+
tx.object(registryId),
|
|
2025
|
+
tx.object(scoreId),
|
|
2026
|
+
feeConfigArg(tx),
|
|
2027
|
+
tx.object(CLOCK_ID3)
|
|
2028
|
+
]
|
|
2029
|
+
});
|
|
2030
|
+
return tx;
|
|
2031
|
+
}
|
|
2032
|
+
function batchCall(batchId, fn) {
|
|
2033
|
+
const tx = new Transaction();
|
|
2034
|
+
tx.moveCall({
|
|
2035
|
+
target: `${A2A_ESCROW_OPENING_PACKAGE_ID}::${MODULE3}::${fn}`,
|
|
2036
|
+
typeArguments: [USDC_TYPE],
|
|
2037
|
+
arguments: [tx.object(batchId), feeConfigArg(tx), tx.object(CLOCK_ID3)]
|
|
2038
|
+
});
|
|
2039
|
+
return tx;
|
|
2040
|
+
}
|
|
2041
|
+
function buildCancelBatchOpeningTx(batchId) {
|
|
2042
|
+
return batchCall(batchId, "cancel_batch_open");
|
|
2043
|
+
}
|
|
2044
|
+
function buildRefundBatchExpiredTx(batchId) {
|
|
2045
|
+
return batchCall(batchId, "refund_batch_expired");
|
|
2046
|
+
}
|
|
2047
|
+
function bytesToHex2(bytes) {
|
|
2048
|
+
return `0x${Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("")}`;
|
|
2049
|
+
}
|
|
2050
|
+
function hexToBytes2(hex) {
|
|
2051
|
+
const clean = hex.replace(/^0x/, "");
|
|
2052
|
+
const bytes = [];
|
|
2053
|
+
for (let i = 0; i < clean.length; i += 2) {
|
|
2054
|
+
bytes.push(Number.parseInt(clean.slice(i, i + 2), 16));
|
|
2055
|
+
}
|
|
2056
|
+
return bytes;
|
|
2057
|
+
}
|
|
2058
|
+
async function getBatchOpening(client, batchId) {
|
|
2059
|
+
const resp = await client.core.getObject({ objectId: batchId, include: { json: true } }).catch(() => null);
|
|
2060
|
+
const objType = resp?.object?.type ?? "";
|
|
2061
|
+
const json = resp?.object?.json;
|
|
2062
|
+
if (!json || !objType.includes(BATCH_OPENING_TYPE_MARKER)) {
|
|
2063
|
+
return null;
|
|
2064
|
+
}
|
|
2065
|
+
const table = json.claims_by_agent;
|
|
2066
|
+
return {
|
|
2067
|
+
id: batchId,
|
|
2068
|
+
buyer: String(json.buyer),
|
|
2069
|
+
amountUsdc: Number(json.amount) / 10 ** USDC_DECIMALS,
|
|
2070
|
+
slotsTotal: Number(json.slots_total),
|
|
2071
|
+
slotsRemaining: Number(json.slots_remaining),
|
|
2072
|
+
feeBps: Number(json.fee_bps ?? 0),
|
|
2073
|
+
specHash: bytesToHex2(json.spec_hash ?? []),
|
|
2074
|
+
openUntilMs: Number(json.open_until_ms),
|
|
2075
|
+
slaMs: Number(json.sla_ms),
|
|
2076
|
+
reviewWindowMs: Number(json.review_window_ms),
|
|
2077
|
+
rejectSplitBps: Number(json.reject_split_bps),
|
|
2078
|
+
claimPolicy: Number(json.claim_policy ?? 0),
|
|
2079
|
+
minSellerLevel: Number(json.min_seller_level ?? 0),
|
|
2080
|
+
maxClaimsPerAgent: Number(json.max_claims_per_agent ?? 1),
|
|
2081
|
+
claimsTableId: table?.id ? String(table.id) : null,
|
|
2082
|
+
createdAtMs: Number(json.created_at_ms ?? 0)
|
|
2083
|
+
};
|
|
2084
|
+
}
|
|
2085
|
+
async function getBatchClaimsByAgent(client, batch, agent) {
|
|
2086
|
+
if (!batch.claimsTableId) return 0;
|
|
2087
|
+
try {
|
|
2088
|
+
const fieldId = deriveDynamicFieldID(
|
|
2089
|
+
batch.claimsTableId,
|
|
2090
|
+
"address",
|
|
2091
|
+
bcs.Address.serialize(validateAddress(agent)).toBytes()
|
|
2092
|
+
);
|
|
2093
|
+
const resp = await client.core.getObject({
|
|
2094
|
+
objectId: fieldId,
|
|
2095
|
+
include: { json: true }
|
|
2096
|
+
});
|
|
2097
|
+
const json = resp?.object?.json;
|
|
2098
|
+
return Number(json?.value ?? 0);
|
|
2099
|
+
} catch {
|
|
2100
|
+
return 0;
|
|
2101
|
+
}
|
|
2102
|
+
}
|
|
2103
|
+
function preflightBatchClaim(score, batch, myClaims) {
|
|
2104
|
+
if (batch.slotsRemaining <= 0) {
|
|
2105
|
+
return {
|
|
2106
|
+
valid: false,
|
|
2107
|
+
error: "No slots left on this batch \u2014 every slot is claimed. Find open waves on the board."
|
|
2108
|
+
};
|
|
2109
|
+
}
|
|
2110
|
+
if (myClaims >= batch.maxClaimsPerAgent) {
|
|
2111
|
+
return {
|
|
2112
|
+
valid: false,
|
|
2113
|
+
error: `This wave allows ${batch.maxClaimsPerAgent} slot${batch.maxClaimsPerAgent === 1 ? "" : "s"} per agent and this wallet already holds ${myClaims}. Deliver what you claimed; other waves on the board are open.`
|
|
2114
|
+
};
|
|
2115
|
+
}
|
|
2116
|
+
return preflightClaimOpening(score, batch);
|
|
2117
|
+
}
|
|
2118
|
+
|
|
1772
2119
|
// src/commerce.ts
|
|
1773
2120
|
var DEFAULT_COMMERCE_API_BASE = "https://api.t2000.ai/v1";
|
|
1774
2121
|
async function commerceFetchJson(url, init) {
|
|
@@ -1859,4 +2206,4 @@ async function getJobSpec(base, hash) {
|
|
|
1859
2206
|
// src/browser.ts
|
|
1860
2207
|
init_token_registry();
|
|
1861
2208
|
|
|
1862
|
-
export { A2A_ESCROW_FEE_CONFIG_ID, A2A_ESCROW_PACKAGE_ID, CLOCK_ID, COIN_REGISTRY, DEFAULT_ACTIVITY_REPORT_URL, DEFAULT_COMMERCE_API_BASE, DEFAULT_NETWORK, ETH_TYPE, GAS_RESERVE_MIN, IKA_TYPE, JOB_STATES, KNOWN_TARGETS, KeypairSigner, LABEL_PATTERNS, LEVEL4_MAX_NO_DELIVERY, LEVEL4_MIN_REVIEWS, LOFI_TYPE, MANIFEST_TYPE, MAX_DELIVER_HORIZON_MS, MAX_JOB_USDC, MAX_REVIEW_WINDOW_MS, MIN_JOB_USDC, MIST_PER_SUI, NAVX_TYPE, NO_DELIVERY_REGRESSION_FLOOR, OPENING_CLAIM_POLICIES, OPENING_CLAIM_POLICY_ANY_ACTIVE, OPENING_CLAIM_POLICY_PROVEN, OPENING_CLAIM_POLICY_PROVEN_4STAR, OVERLAY_FEE_RATE, PREFLIGHT_MAX_AMOUNT, PREFLIGHT_OK, PROVEN_MIN_AVG_STARS_X10, PROVEN_MIN_REVIEWS, REVIEW_MAX_STARS, REVIEW_MIN_STARS, SELLER_LEVEL_ACTIVE_CAPS, STABLE_ASSETS, SUI_DECIMALS, SUI_TYPE, SUPPORTED_ASSETS, T2000Error, T2000_OVERLAY_FEE_WALLET, TOKEN_MAP, USDC_DECIMALS, USDC_TYPE, USDE_TYPE, USDSUI_TYPE, USDT_TYPE, WAL_TYPE, WBTC_TYPE, ZkLoginSigner, activeCapForLevel, buildCreateJobTx, buildDeliverJobTx, buildRefundJobTx, buildRejectJobTx, buildReleaseJobTx, buildSendTx, buildSwapTx, checkPositiveAmount, checkSuiAddress, claimPolicyLabel, claimPolicyRequirement, classifyAction, classifyLabel, classifySendAsset, classifyTransaction, deriveAgentScoreId, effectiveSellerLevel, executeTx, extractAllUserLegs, extractTransferDetails, extractTxCommands, extractTxSender, fallbackLabel, fetchService, findSwapRoute, formatAssetAmount, formatSui, formatUsd, fromBase642 as fromBase64, getAgentScore, getDecimals, getDecimalsForCoinType, getJob, getJobSpec, invalidSendAssetMessage, jobActionsFor, listServices, mapMoveAbortCode, mapWalletError, meetsClaimPolicy, meetsMinSellerLevel, mistToSui, parseSuiRpcTx, payWithX402, preflightClaimOpening, preflightCreateJob, preflightFail, preflightPay, preflightSend, preflightSwap, putJobSpec, rawToStable, rawToUsdc, refineLendingLabel, reportX402Activity, resolveSymbol, resolveTokenType, sellerLevel, sellerLevelLabel, stableToRaw, suiToMist, toBase64, truncateAddress, usdcToRaw, validateAddress, verifyJobForSeller };
|
|
2209
|
+
export { A2A_ESCROW_FEE_CONFIG_ID, A2A_ESCROW_PACKAGE_ID, BATCH_ABORT_CODES, BATCH_OPENING_TYPE_MARKER, BATCH_ORIGIN_KEY_TYPE_SUFFIX, CLOCK_ID, COIN_REGISTRY, DEFAULT_ACTIVITY_REPORT_URL, DEFAULT_COMMERCE_API_BASE, DEFAULT_NETWORK, ESCROW_ABORT_CODES, ETH_TYPE, GAS_RESERVE_MIN, IKA_TYPE, JOB_STATES, KNOWN_TARGETS, KeypairSigner, LABEL_PATTERNS, LEVEL4_MAX_NO_DELIVERY, LEVEL4_MIN_REVIEWS, LOFI_TYPE, MANIFEST_TYPE, MAX_BATCH_SLOTS_DEFAULT, MAX_DELIVER_HORIZON_MS, MAX_JOB_USDC, MAX_REVIEW_WINDOW_MS, MIN_JOB_USDC, MIST_PER_SUI, NAVX_TYPE, NO_DELIVERY_REGRESSION_FLOOR, OPENING_CLAIM_POLICIES, OPENING_CLAIM_POLICY_ANY_ACTIVE, OPENING_CLAIM_POLICY_PROVEN, OPENING_CLAIM_POLICY_PROVEN_4STAR, OVERLAY_FEE_RATE, PREFLIGHT_MAX_AMOUNT, PREFLIGHT_OK, PROVEN_MIN_AVG_STARS_X10, PROVEN_MIN_REVIEWS, REPUTATION_ABORT_CODES, REVIEW_MAX_STARS, REVIEW_MIN_STARS, SELLER_LEVEL_ACTIVE_CAPS, STABLE_ASSETS, SUI_DECIMALS, SUI_TYPE, SUPPORTED_ASSETS, T2000Error, T2000_OVERLAY_FEE_WALLET, TOKEN_MAP, USDC_DECIMALS, USDC_TYPE, USDE_TYPE, USDSUI_TYPE, USDT_TYPE, WAL_TYPE, WBTC_TYPE, ZkLoginSigner, activeCapForLevel, buildBatchClaimTx, buildCancelBatchOpeningTx, buildCreateBatchOpeningTx, buildCreateJobTx, buildDeliverJobTx, buildRefundBatchExpiredTx, buildRefundJobTx, buildRejectJobTx, buildReleaseJobTx, buildSendTx, buildSwapTx, checkPositiveAmount, checkSuiAddress, claimPolicyLabel, claimPolicyRequirement, classifyAction, classifyLabel, classifySendAsset, classifyTransaction, deriveAgentScoreId, effectiveSellerLevel, executeTx, extractAllUserLegs, extractTransferDetails, extractTxCommands, extractTxSender, fallbackLabel, fetchService, findSwapRoute, formatAssetAmount, formatSui, formatUsd, fromBase642 as fromBase64, getAgentScore, getBatchClaimsByAgent, getBatchOpening, getDecimals, getDecimalsForCoinType, getJob, getJobBatchOrigin, getJobSpec, invalidSendAssetMessage, jobActionsFor, listServices, mapMoveAbortCode, mapWalletError, meetsClaimPolicy, meetsMinSellerLevel, mistToSui, parseSuiRpcTx, payWithX402, preflightBatchClaim, preflightClaimOpening, preflightCreateBatchOpening, preflightCreateJob, preflightFail, preflightPay, preflightSend, preflightSwap, putJobSpec, rawToStable, rawToUsdc, refineLendingLabel, reportX402Activity, resolveSymbol, resolveTokenType, sellerLevel, sellerLevelLabel, stableToRaw, suiToMist, toBase64, truncateAddress, usdcToRaw, validateAddress, verifyJobForSeller };
|