@t2000/sdk 10.14.1 → 10.15.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/index.js CHANGED
@@ -3409,6 +3409,143 @@ async function verifyJobForSeller({
3409
3409
  return { ok: problems.length === 0, job, problems };
3410
3410
  }
3411
3411
 
3412
+ // src/wallet/opening.ts
3413
+ init_errors();
3414
+ init_token_registry();
3415
+ init_coinSelection();
3416
+ var A2A_ESCROW_OPENING_PACKAGE_ID = process.env.A2A_ESCROW_OPENING_PACKAGE_ID ?? "0x860288d789dc617f6474a0a6801d6011e53bf30d5fb801cdad47b9bc6adb098b";
3417
+ var CLOCK_ID3 = "0x6";
3418
+ var MODULE2 = "opening";
3419
+ var SHA256_HEX_RE = /^(0x)?[0-9a-fA-F]{64}$/;
3420
+ var OPENING_CLAIM_POLICY_ANY_ACTIVE = 0;
3421
+ var MAX_OPEN_WINDOW_MS = 2592e6;
3422
+ function feeConfigArg2(tx) {
3423
+ return tx.sharedObjectRef({
3424
+ objectId: A2A_ESCROW_FEE_CONFIG_ID,
3425
+ initialSharedVersion: A2A_ESCROW_FEE_CONFIG_VERSION,
3426
+ mutable: false
3427
+ });
3428
+ }
3429
+ function hexToBytes3(hex) {
3430
+ const clean = hex.replace(/^0x/, "");
3431
+ const bytes = [];
3432
+ for (let i = 0; i < clean.length; i += 2) {
3433
+ bytes.push(Number.parseInt(clean.slice(i, i + 2), 16));
3434
+ }
3435
+ return bytes;
3436
+ }
3437
+ function preflightCreateOpening(terms) {
3438
+ if (!Number.isFinite(terms.amountUsdc) || terms.amountUsdc <= 0) {
3439
+ return { valid: false, code: "INVALID_AMOUNT", error: "Budget must be positive." };
3440
+ }
3441
+ if (terms.amountUsdc > MAX_JOB_USDC) {
3442
+ return {
3443
+ valid: false,
3444
+ code: "INVALID_AMOUNT",
3445
+ error: `Open jobs cap at ${MAX_JOB_USDC} USDC (v1).`
3446
+ };
3447
+ }
3448
+ if (!SHA256_HEX_RE.test(terms.specHash)) {
3449
+ return { valid: false, code: "INVALID_INPUT", error: "specHash must be a sha256 hex string." };
3450
+ }
3451
+ const now = Date.now();
3452
+ if (terms.openUntilMs <= now) {
3453
+ return { valid: false, code: "INVALID_INPUT", error: "openUntil must be in the future." };
3454
+ }
3455
+ if (terms.openUntilMs > now + MAX_OPEN_WINDOW_MS) {
3456
+ return { valid: false, code: "INVALID_INPUT", error: "Openings can stay claimable at most 30 days." };
3457
+ }
3458
+ if (terms.slaMs <= 0) {
3459
+ return { valid: false, code: "INVALID_INPUT", error: "Delivery window must be positive." };
3460
+ }
3461
+ return { valid: true };
3462
+ }
3463
+ async function buildCreateOpeningTx({
3464
+ client,
3465
+ buyer,
3466
+ terms
3467
+ }) {
3468
+ const pf = preflightCreateOpening(terms);
3469
+ if (!pf.valid) throw new T2000Error(pf.code ?? "INVALID_INPUT", pf.error ?? "Invalid opening.");
3470
+ const rawAmount = BigInt(Math.floor(terms.amountUsdc * 10 ** USDC_DECIMALS));
3471
+ const tx = new Transaction();
3472
+ const { coin } = await selectAndSplitCoin(tx, client, validateAddress(buyer), USDC_TYPE, rawAmount, {
3473
+ allowSwapAll: false
3474
+ });
3475
+ tx.moveCall({
3476
+ target: `${A2A_ESCROW_OPENING_PACKAGE_ID}::${MODULE2}::create_open`,
3477
+ typeArguments: [USDC_TYPE],
3478
+ arguments: [
3479
+ coin,
3480
+ tx.pure.vector("u8", hexToBytes3(terms.specHash)),
3481
+ tx.pure.u64(terms.openUntilMs),
3482
+ tx.pure.u64(terms.slaMs),
3483
+ tx.pure.u64(terms.reviewWindowMs),
3484
+ tx.pure.u64(terms.rejectSplitBps),
3485
+ tx.pure.u8(OPENING_CLAIM_POLICY_ANY_ACTIVE),
3486
+ feeConfigArg2(tx),
3487
+ tx.object(CLOCK_ID3)
3488
+ ]
3489
+ });
3490
+ return tx;
3491
+ }
3492
+ function buildClaimOpeningTx({
3493
+ openingId,
3494
+ registryId
3495
+ }) {
3496
+ const tx = new Transaction();
3497
+ tx.moveCall({
3498
+ target: `${A2A_ESCROW_OPENING_PACKAGE_ID}::${MODULE2}::claim`,
3499
+ typeArguments: [USDC_TYPE],
3500
+ arguments: [
3501
+ tx.object(openingId),
3502
+ tx.object(registryId),
3503
+ feeConfigArg2(tx),
3504
+ tx.object(CLOCK_ID3)
3505
+ ]
3506
+ });
3507
+ return tx;
3508
+ }
3509
+ function openingCall(openingId, fn) {
3510
+ const tx = new Transaction();
3511
+ tx.moveCall({
3512
+ target: `${A2A_ESCROW_OPENING_PACKAGE_ID}::${MODULE2}::${fn}`,
3513
+ typeArguments: [USDC_TYPE],
3514
+ arguments: [tx.object(openingId), feeConfigArg2(tx), tx.object(CLOCK_ID3)]
3515
+ });
3516
+ return tx;
3517
+ }
3518
+ function buildCancelOpeningTx(openingId) {
3519
+ return openingCall(openingId, "cancel_open");
3520
+ }
3521
+ function buildRefundUnclaimedTx(openingId) {
3522
+ return openingCall(openingId, "refund_unclaimed");
3523
+ }
3524
+ function bytesToHex3(bytes) {
3525
+ return `0x${Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("")}`;
3526
+ }
3527
+ async function getOpening(client, openingId) {
3528
+ const resp = await client.core.getObject({ objectId: openingId, include: { json: true } }).catch(() => null);
3529
+ const objType = resp?.object?.type ?? "";
3530
+ const json = resp?.object?.json;
3531
+ if (!json || !objType.includes(`::${MODULE2}::Opening<`)) {
3532
+ return null;
3533
+ }
3534
+ return {
3535
+ id: openingId,
3536
+ buyer: String(json.buyer),
3537
+ amountUsdc: Number(json.amount) / 10 ** USDC_DECIMALS,
3538
+ feeBps: Number(json.fee_bps ?? 0),
3539
+ specHash: bytesToHex3(json.spec_hash ?? []),
3540
+ openUntilMs: Number(json.open_until_ms),
3541
+ slaMs: Number(json.sla_ms),
3542
+ reviewWindowMs: Number(json.review_window_ms),
3543
+ rejectSplitBps: Number(json.reject_split_bps),
3544
+ claimPolicy: Number(json.claim_policy ?? 0),
3545
+ createdAtMs: Number(json.created_at_ms ?? 0)
3546
+ };
3547
+ }
3548
+
3412
3549
  // src/commerce.ts
3413
3550
  var DEFAULT_COMMERCE_API_BASE = "https://api.t2000.ai/v1";
3414
3551
  async function commerceFetchJson(url, init) {
@@ -3559,7 +3696,6 @@ async function listOpenJobs(base, filter = {}) {
3559
3696
  if (filter.status) params.set("status", filter.status);
3560
3697
  if (filter.query) params.set("q", filter.query);
3561
3698
  if (filter.buyer) params.set("buyer", filter.buyer);
3562
- if (filter.seller) params.set("seller", filter.seller);
3563
3699
  if (filter.limit) params.set("limit", String(filter.limit));
3564
3700
  const qs = params.size > 0 ? `?${params.toString()}` : "";
3565
3701
  const json = await fetchJson(`${base}/open-jobs${qs}`);
@@ -3571,74 +3707,45 @@ async function getOpenJob(base, id) {
3571
3707
  );
3572
3708
  return json.openJob;
3573
3709
  }
3574
- async function signedChallenge(base, signer, action, id) {
3575
- const address = signer.getAddress();
3576
- const challenge = await fetchJson(`${base}/agent/challenge`, {
3577
- method: "POST",
3578
- body: { address }
3579
- });
3580
- const nonce = challenge.nonce;
3581
- if (!nonce) {
3582
- throw new Error("Failed to get a challenge nonce.");
3583
- }
3584
- const message = new TextEncoder().encode(
3585
- id ? `t2000-open-${action}:${nonce}:${id}` : `t2000-open-${action}:${nonce}`
3586
- );
3587
- const { signature } = await signer.signPersonalMessage(message);
3588
- return { address, nonce, signature };
3589
- }
3590
- async function createOpenJob(base, signer, input) {
3591
- const auth = await signedChallenge(base, signer, "create");
3592
- const json = await fetchJson(`${base}/open-jobs`, {
3593
- method: "POST",
3594
- body: { ...auth, ...input }
3595
- });
3596
- return json.openJob;
3597
- }
3598
- async function claimOpenJob(base, signer, id) {
3599
- const auth = await signedChallenge(base, signer, "claim", id);
3600
- const json = await fetchJson(
3601
- `${base}/open-jobs/${encodeURIComponent(id)}/claim`,
3602
- { method: "POST", body: auth }
3603
- );
3604
- return json.openJob ?? null;
3605
- }
3606
- async function unclaimOpenJob(base, signer, id) {
3607
- const auth = await signedChallenge(base, signer, "unclaim", id);
3608
- await fetchJson(`${base}/open-jobs/${encodeURIComponent(id)}/unclaim`, {
3609
- method: "POST",
3610
- body: auth
3611
- });
3612
- }
3613
- async function cancelOpenJob(base, signer, id) {
3614
- const auth = await signedChallenge(base, signer, "cancel", id);
3615
- await fetchJson(`${base}/open-jobs/${encodeURIComponent(id)}/cancel`, {
3616
- method: "POST",
3617
- body: auth
3618
- });
3619
- }
3620
- async function fundOpenJob(base, signer, id) {
3710
+ async function sponsoredOpeningVerb(base, signer, action, params) {
3621
3711
  const address = signer.getAddress();
3622
- const encoded = encodeURIComponent(id.trim());
3623
- const prep = await fetchJson(`${base}/open-jobs/${encoded}/fund-prepare`, {
3712
+ const prep = await fetchJson(`${base}/job/prepare`, {
3624
3713
  method: "POST",
3625
- body: { address }
3714
+ body: { address, action, params }
3626
3715
  });
3627
3716
  const nonce = prep.nonce;
3628
3717
  const txBytes = prep.txBytes;
3629
3718
  if (!(nonce && txBytes)) {
3630
- throw new Error("Failed to prepare the funding transaction.");
3719
+ throw new Error("Failed to prepare the transaction.");
3631
3720
  }
3632
3721
  const { signature } = await signer.signTransaction(fromBase64(txBytes));
3633
- const json = await fetchJson(`${base}/open-jobs/${encoded}/fund-submit`, {
3722
+ const json = await fetchJson(`${base}/job/submit`, {
3634
3723
  method: "POST",
3635
3724
  body: { nonce, address, signature }
3636
3725
  });
3637
3726
  const digest = json.digest;
3638
3727
  if (!digest) {
3639
- throw new Error("The funding transaction did not go through.");
3728
+ throw new Error("The transaction did not go through.");
3640
3729
  }
3641
- return { digest, jobId: json.jobId ?? null };
3730
+ return digest;
3731
+ }
3732
+ function postOpenJob(base, signer, input) {
3733
+ return sponsoredOpeningVerb(base, signer, "open-create", input);
3734
+ }
3735
+ function claimOpenJob(base, signer, openingId) {
3736
+ return sponsoredOpeningVerb(base, signer, "open-claim", {
3737
+ openingId: openingId.trim()
3738
+ });
3739
+ }
3740
+ function cancelOpenJob(base, signer, openingId) {
3741
+ return sponsoredOpeningVerb(base, signer, "open-cancel", {
3742
+ openingId: openingId.trim()
3743
+ });
3744
+ }
3745
+ function refundOpenJob(base, signer, openingId) {
3746
+ return sponsoredOpeningVerb(base, signer, "open-refund", {
3747
+ openingId: openingId.trim()
3748
+ });
3642
3749
  }
3643
3750
 
3644
3751
  // src/index.ts
@@ -4445,6 +4552,6 @@ async function buildDirectPoolSwapTx(args) {
4445
4552
  return tx;
4446
4553
  }
4447
4554
 
4448
- export { A2A_ESCROW_FEE_CONFIG_ID, A2A_ESCROW_PACKAGE_ID, AGENT_CAPITAL_PACKAGE_ID, AGENT_CAPITAL_PUBLISHED_AT, AGENT_ID_PARENT, AGENT_ID_PARENT_NAME, AGENT_ID_PARENT_NFT_ID, AGENT_POOL_TICK_SPACING, AGENT_TOKEN_DECIMALS, AGENT_TOKEN_LP_ALLOCATION, AGENT_TOKEN_TOTAL_SUPPLY, AGENT_TOKEN_TREASURY_ALLOCATION, AUDRIC_PARENT, AUDRIC_PARENT_NAME, AUDRIC_PARENT_NFT_ID, CAPITAL_REGISTRY_ID, CAPITAL_REGISTRY_VERSION, CETUS_CLMM_PACKAGE_ID, CETUS_GLOBAL_CONFIG_ID, CETUS_INTEGRATE_PUBLISHED_AT, CETUS_POOLS_ID, CETUS_POSITION_TYPE, CETUS_USDC_SUI_POOL, CLOCK_ID, COIN_REGISTRY, DEFAULT_API_BASE, DEFAULT_COMMERCE_API_BASE, DEFAULT_GRPC_URL, DEFAULT_NETWORK, ETH_TYPE, GASLESS_MIN_STABLE_AMOUNT, GASLESS_STABLE_TYPES, GAS_RESERVE_MIN, IKA_TYPE, InvalidAddressError, JOB_STATES, KNOWN_TARGETS, KeypairSigner, LABEL_PATTERNS, LOFI_TYPE, LimitEnforcer, LimitExceededError, MANIFEST_TYPE, MAX_DELIVER_HORIZON_MS, MAX_JOB_USDC, MAX_REVIEW_WINDOW_MS, MIN_LP_USDC, MIST_PER_SUI, NAVX_TYPE, OPERATION_ASSETS, OVERLAY_FEE_RATE, PREFLIGHT_MAX_AMOUNT, PREFLIGHT_OK, SENDABLE_ASSETS, SPONSORED_PYTH_DEPENDENT_PROVIDERS, STABLE_ASSETS, SUINS_NAME_REGEX, SUI_ADDRESS_REGEX, SUI_ADDRESS_STRICT_REGEX, SUI_DECIMALS, SUI_TYPE, SUPPORTED_ASSETS, SYMBOL_BLOCKLIST, SuinsNotRegisteredError, SuinsRpcError, T2000, T2000Error, T2000_OVERLAY_FEE_WALLET, TOKEN_MAP, USDC_DECIMALS, USDC_TYPE, USDE_TYPE, USDSUI_TYPE, USDT_TYPE, WAL_TYPE, WBTC_TYPE, WRITE_APPENDER_REGISTRY, ZkLoginSigner, addSendToTx, addSwapToTx, approxUsdValue, assertAllowedAsset, assertBuyerRequirements, assertLimitConfig, buildAddLeafTx, buildAgentCoinModule, buildCreateJobTx, buildDeliverJobTx, buildDirectPoolSwapTx, buildPublishAgentCoinTx, buildRefundJobTx, buildRejectJobTx, buildReleaseJobTx, buildRevokeLeafTx, buildSendTx, buildSwapTx, buildTokenizeTx, cancelOpenJob, chatCompletion, chatCompletionStream, checkPositiveAmount, checkSuiAddress, claimOpenJob, classifyAction, classifyLabel, classifyTransaction, clearLimits, composeTx, createOpenJob, dailySpentToday, deriveAllowedAddressesFromPtb, deserializeCetusRoute, displayHandle, executeTx, exportPrivateKey, extractAllUserLegs, extractTransferDetails, extractTxCommands, extractTxSender, fallbackLabel, fetchAllCoins, fetchService, findSwapRoute, formatAssetAmount, formatSui, formatUsd, fullHandle, fundOpenJob, generateKeypair, getAddress, getCoinMeta, getDecimals, getDecimalsForCoinType, getJob, getJobSpec, getLimits, getOpenJob, getSponsoredSwapProviders, getSuiClient, getSuiGrpcClient, getSwapQuote, hasLimits, isAllowedAsset, isCetusRouteFresh, isInRegistry, jobActionsFor, keypairFromPrivateKey, listModels, listOpenJobs, listServices, loadKey, looksLikeSuiNs, mapMoveAbortCode, mapWalletError, mistToSui, normalizeAddressInput, normalizeAsset, normalizeCoinType, parseMppSuiChallenge, parseSuiRpcTx, payWithMpp, preflightCreateJob, preflightFail, preflightPay, preflightSend, preflightSwap, putJobSpec, queryBalance, queryHistory, queryTransaction, rawToStable, rawToUsdc, readLimitsFile, recordDailySpend, refineLendingLabel, resolveAddressToSuinsViaRpc, resolveSuinsViaRpc, resolveSymbol, resolveTokenType, saveBech32, saveKey, selectAndSplitCoin, selectSuiCoin, serializeCetusRoute, setLimits, simulateTransaction, stableToRaw, suiToMist, throwIfSimulationFailed, truncateAddress, unclaimOpenJob, usdcToRaw, validateAddress, validateAgentCoinParams, validateLabel, verifyCetusRouteCoinMatch, verifyJobForSeller, verifyReceipt, walletExists, writeLimitsFile };
4555
+ export { A2A_ESCROW_FEE_CONFIG_ID, A2A_ESCROW_OPENING_PACKAGE_ID, A2A_ESCROW_PACKAGE_ID, AGENT_CAPITAL_PACKAGE_ID, AGENT_CAPITAL_PUBLISHED_AT, AGENT_ID_PARENT, AGENT_ID_PARENT_NAME, AGENT_ID_PARENT_NFT_ID, AGENT_POOL_TICK_SPACING, AGENT_TOKEN_DECIMALS, AGENT_TOKEN_LP_ALLOCATION, AGENT_TOKEN_TOTAL_SUPPLY, AGENT_TOKEN_TREASURY_ALLOCATION, AUDRIC_PARENT, AUDRIC_PARENT_NAME, AUDRIC_PARENT_NFT_ID, CAPITAL_REGISTRY_ID, CAPITAL_REGISTRY_VERSION, CETUS_CLMM_PACKAGE_ID, CETUS_GLOBAL_CONFIG_ID, CETUS_INTEGRATE_PUBLISHED_AT, CETUS_POOLS_ID, CETUS_POSITION_TYPE, CETUS_USDC_SUI_POOL, CLOCK_ID, COIN_REGISTRY, DEFAULT_API_BASE, DEFAULT_COMMERCE_API_BASE, DEFAULT_GRPC_URL, DEFAULT_NETWORK, ETH_TYPE, GASLESS_MIN_STABLE_AMOUNT, GASLESS_STABLE_TYPES, GAS_RESERVE_MIN, IKA_TYPE, InvalidAddressError, JOB_STATES, KNOWN_TARGETS, KeypairSigner, LABEL_PATTERNS, LOFI_TYPE, LimitEnforcer, LimitExceededError, MANIFEST_TYPE, MAX_DELIVER_HORIZON_MS, MAX_JOB_USDC, MAX_OPEN_WINDOW_MS, MAX_REVIEW_WINDOW_MS, MIN_LP_USDC, MIST_PER_SUI, NAVX_TYPE, OPENING_CLAIM_POLICY_ANY_ACTIVE, OPERATION_ASSETS, OVERLAY_FEE_RATE, PREFLIGHT_MAX_AMOUNT, PREFLIGHT_OK, SENDABLE_ASSETS, SPONSORED_PYTH_DEPENDENT_PROVIDERS, STABLE_ASSETS, SUINS_NAME_REGEX, SUI_ADDRESS_REGEX, SUI_ADDRESS_STRICT_REGEX, SUI_DECIMALS, SUI_TYPE, SUPPORTED_ASSETS, SYMBOL_BLOCKLIST, SuinsNotRegisteredError, SuinsRpcError, T2000, T2000Error, T2000_OVERLAY_FEE_WALLET, TOKEN_MAP, USDC_DECIMALS, USDC_TYPE, USDE_TYPE, USDSUI_TYPE, USDT_TYPE, WAL_TYPE, WBTC_TYPE, WRITE_APPENDER_REGISTRY, ZkLoginSigner, addSendToTx, addSwapToTx, approxUsdValue, assertAllowedAsset, assertBuyerRequirements, assertLimitConfig, buildAddLeafTx, buildAgentCoinModule, buildCancelOpeningTx, buildClaimOpeningTx, buildCreateJobTx, buildCreateOpeningTx, buildDeliverJobTx, buildDirectPoolSwapTx, buildPublishAgentCoinTx, buildRefundJobTx, buildRefundUnclaimedTx, buildRejectJobTx, buildReleaseJobTx, buildRevokeLeafTx, buildSendTx, buildSwapTx, buildTokenizeTx, cancelOpenJob, chatCompletion, chatCompletionStream, checkPositiveAmount, checkSuiAddress, claimOpenJob, classifyAction, classifyLabel, classifyTransaction, clearLimits, composeTx, dailySpentToday, deriveAllowedAddressesFromPtb, deserializeCetusRoute, displayHandle, executeTx, exportPrivateKey, extractAllUserLegs, extractTransferDetails, extractTxCommands, extractTxSender, fallbackLabel, fetchAllCoins, fetchService, findSwapRoute, formatAssetAmount, formatSui, formatUsd, fullHandle, generateKeypair, getAddress, getCoinMeta, getDecimals, getDecimalsForCoinType, getJob, getJobSpec, getLimits, getOpenJob, getOpening, getSponsoredSwapProviders, getSuiClient, getSuiGrpcClient, getSwapQuote, hasLimits, isAllowedAsset, isCetusRouteFresh, isInRegistry, jobActionsFor, keypairFromPrivateKey, listModels, listOpenJobs, listServices, loadKey, looksLikeSuiNs, mapMoveAbortCode, mapWalletError, mistToSui, normalizeAddressInput, normalizeAsset, normalizeCoinType, parseMppSuiChallenge, parseSuiRpcTx, payWithMpp, postOpenJob, preflightCreateJob, preflightCreateOpening, preflightFail, preflightPay, preflightSend, preflightSwap, putJobSpec, queryBalance, queryHistory, queryTransaction, rawToStable, rawToUsdc, readLimitsFile, recordDailySpend, refineLendingLabel, refundOpenJob, resolveAddressToSuinsViaRpc, resolveSuinsViaRpc, resolveSymbol, resolveTokenType, saveBech32, saveKey, selectAndSplitCoin, selectSuiCoin, serializeCetusRoute, setLimits, simulateTransaction, stableToRaw, suiToMist, throwIfSimulationFailed, truncateAddress, usdcToRaw, validateAddress, validateAgentCoinParams, validateLabel, verifyCetusRouteCoinMatch, verifyJobForSeller, verifyReceipt, walletExists, writeLimitsFile };
4449
4556
  //# sourceMappingURL=index.js.map
4450
4557
  //# sourceMappingURL=index.js.map