@ardrive/turbo-sdk 1.42.0-alpha.7 → 1.42.0-alpha.9
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/lib/cjs/cli/commands/arns.js +37 -9
- package/lib/cjs/cli/options.js +7 -6
- package/lib/cjs/common/arnsActions.js +102 -0
- package/lib/cjs/common/payment.js +215 -80
- package/lib/cjs/common/turbo.js +60 -15
- package/lib/cjs/types.js +20 -1
- package/lib/esm/cli/commands/arns.js +37 -9
- package/lib/esm/cli/options.js +7 -6
- package/lib/esm/common/arnsActions.js +93 -0
- package/lib/esm/common/payment.js +215 -80
- package/lib/esm/common/turbo.js +60 -15
- package/lib/esm/types.js +19 -0
- package/lib/types/cli/commands/arns.d.ts +16 -27
- package/lib/types/cli/commands/arns.d.ts.map +1 -1
- package/lib/types/cli/options.d.ts +14 -11
- package/lib/types/cli/options.d.ts.map +1 -1
- package/lib/types/cli/types.d.ts +8 -4
- package/lib/types/cli/types.d.ts.map +1 -1
- package/lib/types/common/arnsActions.d.ts +43 -0
- package/lib/types/common/arnsActions.d.ts.map +1 -0
- package/lib/types/common/payment.d.ts +153 -33
- package/lib/types/common/payment.d.ts.map +1 -1
- package/lib/types/common/turbo.d.ts +91 -36
- package/lib/types/common/turbo.d.ts.map +1 -1
- package/lib/types/types.d.ts +202 -28
- package/lib/types/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -18,6 +18,7 @@ import { arNSPurchaseIntents, fiatCurrencyTypes, isCurrency, } from '../types.js
|
|
|
18
18
|
import { isAnyValidUserAddress } from '../utils/common.js';
|
|
19
19
|
import { FailedRequestError, FiatPaymentsDisabledError, InsufficientCreditsError, ProvidedInputError, } from '../utils/errors.js';
|
|
20
20
|
import { uuidV4 } from '../utils/uuid.js';
|
|
21
|
+
import { arNSOwnerProofHeaders, buildArNSCustodyMessage, } from './arnsActions.js';
|
|
21
22
|
import { defaultRetryConfig } from './http.js';
|
|
22
23
|
import { TurboHTTPService } from './http.js';
|
|
23
24
|
import { Logger } from './logger.js';
|
|
@@ -59,6 +60,22 @@ export class TurboUnauthenticatedPaymentService {
|
|
|
59
60
|
// and coerce a missing field (e.g. a 404 body) to `null`.
|
|
60
61
|
return { bytesRemaining: status?.bytesRemaining ?? null };
|
|
61
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* Returns the ArNS names a wallet owns or controls -- both custodial names
|
|
65
|
+
* bought via Turbo's ArNS-with-credits feature (Turbo may spawn and hold
|
|
66
|
+
* the ANT on the caller's behalf, depending on the buy) and self-custody
|
|
67
|
+
* names, in one list. See `TurboArNSName` for field semantics, including
|
|
68
|
+
* the `custodial` flag distinguishing the two.
|
|
69
|
+
*
|
|
70
|
+
* To read a name's current records or lease/expiration state, use
|
|
71
|
+
* `@ar.io/sdk` directly against the returned `antId` -- it talks to the
|
|
72
|
+
* chain directly and needs no round-trip through this SDK/backend.
|
|
73
|
+
*/
|
|
74
|
+
getArNSNames(address) {
|
|
75
|
+
return this.httpService.get({
|
|
76
|
+
endpoint: `/arns/my-names/${encodeURIComponent(address)}`,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
62
79
|
getFiatRates() {
|
|
63
80
|
return this.httpService.get({
|
|
64
81
|
endpoint: '/rates',
|
|
@@ -107,9 +124,18 @@ export class TurboUnauthenticatedPaymentService {
|
|
|
107
124
|
// `async` so a validation failure surfaces as a rejected promise (consistent
|
|
108
125
|
// with `purchaseArNSName`) rather than a synchronous throw.
|
|
109
126
|
this.validateArNSPurchaseParams(params);
|
|
110
|
-
|
|
127
|
+
const price = await this.httpService.get({
|
|
111
128
|
endpoint: `/arns/price/${params.intent.toLowerCase()}/${params.name}${this.buildArNSPurchaseQuery(params)}`,
|
|
112
129
|
});
|
|
130
|
+
// Normalize the figure to charge into ONE field. `winc` is the name only
|
|
131
|
+
// and excludes the ANT spawn surcharge — for a Buy-Name that surcharge can
|
|
132
|
+
// exceed the name's own price, so a caller reading `winc` silently
|
|
133
|
+
// under-quotes every purchase. Surfacing `wincTotal` makes the correct
|
|
134
|
+
// field the obvious one.
|
|
135
|
+
return {
|
|
136
|
+
...price,
|
|
137
|
+
wincTotal: price.wincTotalWithAntSpawn ?? price.winc,
|
|
138
|
+
};
|
|
113
139
|
}
|
|
114
140
|
/**
|
|
115
141
|
* Fail fast (client-side) on malformed ArNS requests so JS callers that bypass
|
|
@@ -490,112 +516,221 @@ export class TurboAuthenticatedPaymentService extends TurboUnauthenticatedPaymen
|
|
|
490
516
|
* balance. The bundler performs the on-chain ARIO purchase and debits credits;
|
|
491
517
|
* a `402` (FailedRequestError.status === 402) indicates insufficient credits.
|
|
492
518
|
*/
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
519
|
+
// ===== ArNS actions — the sponsored surface =====
|
|
520
|
+
//
|
|
521
|
+
// Every ArNS operation is an ACTION, and an action has exactly one of two
|
|
522
|
+
// shapes, chosen by the SERVER rather than the caller: either Turbo already
|
|
523
|
+
// holds the authority (`completed`), or the ANT owner must sign a transaction
|
|
524
|
+
// Turbo has already fee-payer-signed (`awaiting-signature`).
|
|
525
|
+
//
|
|
526
|
+
// The shape is not stable per action, which is why callers must branch on
|
|
527
|
+
// `status` and never on which action they asked for: `set-record` completes
|
|
528
|
+
// alone while Turbo is a controller, and degrades to `awaiting-signature`
|
|
529
|
+
// the moment the customer revokes Turbo.
|
|
530
|
+
//
|
|
531
|
+
// This replaced `/arns/purchase/{intent}/{name}`, `/arns/transfer/{antId}`
|
|
532
|
+
// and `/arns/manage/*`, which were deleted along with Turbo-custodial ANTs.
|
|
533
|
+
// Turbo now takes custody of nothing: every ANT is minted straight to the
|
|
534
|
+
// customer.
|
|
535
|
+
/**
|
|
536
|
+
* Create an action. Returns `completed` or `awaiting-signature`.
|
|
537
|
+
*
|
|
538
|
+
* Credits are debited HERE, not at `/sign`. Capture the returned `nonce`
|
|
539
|
+
* before prompting for a signature: it is the idempotency key, and polling
|
|
540
|
+
* it is how you resume. Never re-create an action to "retry" — that debits
|
|
541
|
+
* a second time. An abandoned action is refunded automatically.
|
|
542
|
+
*/
|
|
543
|
+
async createArNSAction(action, params = {}, ownerProof) {
|
|
497
544
|
const nonce = uuidV4();
|
|
498
|
-
const headers =
|
|
499
|
-
|
|
545
|
+
const headers = {
|
|
546
|
+
...(await this.signer.generateSignedRequestHeaders(nonce)),
|
|
547
|
+
'content-type': 'application/json',
|
|
548
|
+
};
|
|
549
|
+
// Record actions carry a SECOND signature, from the ANT owner's Solana key
|
|
550
|
+
// over a different message. It travels in its own `x-owner-*` headers
|
|
551
|
+
// because two signatures cannot share one header set.
|
|
552
|
+
if (ownerProof !== undefined) {
|
|
553
|
+
Object.assign(headers, await arNSOwnerProofHeaders(ownerProof.owner, ownerProof.message, uuidV4()));
|
|
554
|
+
}
|
|
500
555
|
try {
|
|
501
|
-
|
|
502
|
-
endpoint: `/arns/
|
|
556
|
+
return await this.httpService.post({
|
|
557
|
+
endpoint: `/arns/actions/${action}`,
|
|
503
558
|
headers,
|
|
504
|
-
|
|
505
|
-
//
|
|
506
|
-
|
|
507
|
-
// Non-idempotent signed write: the nonce is single-use, so a retried
|
|
508
|
-
// (but already-landed) purchase would 4xx as "already exists". Poll
|
|
509
|
-
// status by nonce instead of retrying.
|
|
559
|
+
data: Buffer.from(JSON.stringify(params)),
|
|
560
|
+
// Non-idempotent signed write that has already debited. A blind retry
|
|
561
|
+
// risks paying twice for one name; poll the nonce instead.
|
|
510
562
|
retry: false,
|
|
511
563
|
});
|
|
512
564
|
}
|
|
513
565
|
catch (error) {
|
|
514
|
-
// Surface a credit shortfall as a typed, catchable error so callers can
|
|
515
|
-
// prompt a top-up. The `nonce` is the idempotency key: after topping up,
|
|
516
|
-
// retry the same purchase (a fresh nonce is fine — the service dedupes by
|
|
517
|
-
// the on-chain effect, and a captured nonce lets you poll status).
|
|
518
566
|
if (error instanceof FailedRequestError && error.status === 402) {
|
|
519
567
|
throw new InsufficientCreditsError(error.message);
|
|
520
568
|
}
|
|
521
569
|
throw error;
|
|
522
570
|
}
|
|
523
|
-
// Normalize both nonce fields to the one we signed so callers can poll with
|
|
524
|
-
// either `response.nonce` or `response.purchaseReceipt.nonce`.
|
|
525
|
-
return {
|
|
526
|
-
...response,
|
|
527
|
-
nonce,
|
|
528
|
-
purchaseReceipt: { ...response.purchaseReceipt, nonce },
|
|
529
|
-
};
|
|
530
571
|
}
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
572
|
+
/**
|
|
573
|
+
* Submit the owner-signed transaction for an `awaiting-signature` action.
|
|
574
|
+
*
|
|
575
|
+
* `signedTransaction` is the FULL serialized transaction, base64 — not just
|
|
576
|
+
* the signature. Replaying a completed action returns `alreadyCompleted:
|
|
577
|
+
* true` rather than buying twice, so this is safe to call again if a
|
|
578
|
+
* response is lost.
|
|
579
|
+
*/
|
|
580
|
+
async signArNSAction(nonce, signedTransaction) {
|
|
581
|
+
return this.httpService.post({
|
|
582
|
+
endpoint: `/arns/actions/${nonce}/sign`,
|
|
583
|
+
headers: {
|
|
584
|
+
...(await this.signer.generateSignedRequestHeaders(uuidV4())),
|
|
585
|
+
'content-type': 'application/json',
|
|
586
|
+
},
|
|
587
|
+
data: Buffer.from(JSON.stringify({ transaction: signedTransaction })),
|
|
588
|
+
retry: false,
|
|
535
589
|
});
|
|
536
590
|
}
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
591
|
+
/**
|
|
592
|
+
* Status of an action by nonce. Open — no signature required — so it works
|
|
593
|
+
* from a status page or callback handler that never holds the payer's key.
|
|
594
|
+
*
|
|
595
|
+
* Terminal success carries `messageId`; terminal failure carries
|
|
596
|
+
* `failedDate`.
|
|
597
|
+
*/
|
|
598
|
+
async getArNSActionStatus(nonce) {
|
|
599
|
+
return this.httpService.get({
|
|
600
|
+
endpoint: `/arns/actions/${nonce}`,
|
|
544
601
|
});
|
|
545
602
|
}
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
603
|
+
/**
|
|
604
|
+
* Run an action to a terminal state, signing if the server asks for it.
|
|
605
|
+
*
|
|
606
|
+
* This is the two-shape branch, once, in one place — so callers cannot
|
|
607
|
+
* hardcode which actions need a signature and break when a customer
|
|
608
|
+
* exercises ownership.
|
|
609
|
+
*/
|
|
610
|
+
async completeArNSAction(action, params, owner, opts = {}, ownerProofMessage) {
|
|
611
|
+
const created = await this.createArNSAction(action, params, owner !== undefined && ownerProofMessage !== undefined
|
|
612
|
+
? { owner, message: ownerProofMessage }
|
|
613
|
+
: undefined);
|
|
614
|
+
// Fires before any wallet prompt: the action is already debited, so the
|
|
615
|
+
// caller needs the nonce persisted even if the user walks away here.
|
|
616
|
+
await opts.onNonce?.(created.nonce);
|
|
617
|
+
if (created.status === 'completed')
|
|
618
|
+
return created;
|
|
619
|
+
if (owner === undefined) {
|
|
620
|
+
throw new Error(`ArNS action "${action}" requires the ANT owner's signature, but no owner signer was provided. ` +
|
|
621
|
+
`Pass \`owner\`, or drive createArNSAction/signArNSAction yourself. ` +
|
|
622
|
+
`Nonce ${created.nonce} is already debited — poll it rather than re-creating.`);
|
|
623
|
+
}
|
|
624
|
+
const signed = await owner.signTransaction(created.transaction);
|
|
625
|
+
return this.signArNSAction(created.nonce, signed);
|
|
557
626
|
}
|
|
558
627
|
/**
|
|
559
|
-
*
|
|
560
|
-
*
|
|
628
|
+
* Buy a name. The ANT is minted straight to `owner` — Turbo never holds it.
|
|
629
|
+
*
|
|
630
|
+
* This is the ONLY action that always needs the owner's signature:
|
|
631
|
+
* `ario_ant::initialize` is the one instruction in the whole lifecycle that
|
|
632
|
+
* requires the ANT owner's key. The customer signs once, here, and never
|
|
633
|
+
* again unless they change controllers or transfer the name.
|
|
634
|
+
*
|
|
635
|
+
* The owner needs a Solana key to sign with, NOT a funded one — Turbo pays
|
|
636
|
+
* every lamport of fee and rent.
|
|
561
637
|
*/
|
|
562
|
-
async
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
638
|
+
async buyArNSName({ name, owner, type = 'lease', years, paidBy, onNonce, }) {
|
|
639
|
+
return this.completeArNSAction('buy-name', {
|
|
640
|
+
name,
|
|
641
|
+
ownerAddress: await owner.getAddress(),
|
|
642
|
+
type,
|
|
643
|
+
...(years !== undefined ? { years } : {}),
|
|
644
|
+
...(paidBy !== undefined ? { paidBy } : {}),
|
|
645
|
+
}, owner, { onNonce });
|
|
646
|
+
}
|
|
647
|
+
/** Extend a lease. Permissionless on chain — no owner signature needed. */
|
|
648
|
+
async extendArNSLease({ name, years, paidBy, onNonce, }) {
|
|
649
|
+
return this.completeArNSAction('extend-lease', { name, years, ...(paidBy !== undefined ? { paidBy } : {}) }, undefined, { onNonce });
|
|
650
|
+
}
|
|
651
|
+
/** Upgrade a lease to a permanent name. No owner signature needed. */
|
|
652
|
+
async upgradeArNSName({ name, paidBy, onNonce, }) {
|
|
653
|
+
return this.completeArNSAction('upgrade-name', { name, ...(paidBy !== undefined ? { paidBy } : {}) }, undefined, { onNonce });
|
|
654
|
+
}
|
|
655
|
+
/** Raise the undername limit. No owner signature needed. */
|
|
656
|
+
async increaseArNSUndernameLimit({ name, increaseQty, paidBy, onNonce, }) {
|
|
657
|
+
return this.completeArNSAction('increase-undername-limit', { name, increaseQty, ...(paidBy !== undefined ? { paidBy } : {}) }, undefined, { onNonce });
|
|
571
658
|
}
|
|
572
|
-
/**
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
659
|
+
/**
|
|
660
|
+
* Point a name (or undername) at an Arweave transaction.
|
|
661
|
+
*
|
|
662
|
+
* Free — Turbo sponsors the Solana fee. Completes in one call while Turbo is
|
|
663
|
+
* a controller of the ANT, and returns `awaiting-signature` once the customer
|
|
664
|
+
* has revoked Turbo, at which point `owner` signs it themselves. Both paths
|
|
665
|
+
* are handled here.
|
|
666
|
+
*
|
|
667
|
+
* The owner proof is required EITHER WAY: Turbo is directing its own
|
|
668
|
+
* controller authority over an asset someone else owns, so nothing on chain
|
|
669
|
+
* records the owner's consent and we demand it. It is a MESSAGE signature,
|
|
670
|
+
* not a transaction — cheap and offline, but still a wallet prompt.
|
|
671
|
+
*/
|
|
672
|
+
async setArNSRecord({ antId, owner, transactionId, undername = '@', ttlSeconds = 3600, onNonce, }) {
|
|
673
|
+
return this.completeArNSAction('set-record', {
|
|
674
|
+
antId,
|
|
675
|
+
ownerAddress: await owner.getAddress(),
|
|
676
|
+
transactionId,
|
|
677
|
+
undername,
|
|
678
|
+
ttlSeconds,
|
|
679
|
+
}, owner, { onNonce }, buildArNSCustodyMessage('set-record', [
|
|
576
680
|
antId,
|
|
577
681
|
undername,
|
|
578
682
|
transactionId,
|
|
579
683
|
String(ttlSeconds),
|
|
580
684
|
]));
|
|
581
|
-
const query = `?undername=${encodeURIComponent(undername)}&transactionId=${transactionId}&ttlSeconds=${ttlSeconds}`;
|
|
582
|
-
return this.httpService.post({
|
|
583
|
-
endpoint: `/arns/manage/${antId}/set-record${query}`,
|
|
584
|
-
headers,
|
|
585
|
-
data: Buffer.from([]),
|
|
586
|
-
retry: false, // single-use action-bound nonce; don't re-POST on 5xx
|
|
587
|
-
});
|
|
588
685
|
}
|
|
589
|
-
/** Remove a
|
|
590
|
-
async removeArNSRecord({ antId, undername, }) {
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
686
|
+
/** Remove a record (an undername). Free; same two-shape rules as setArNSRecord. */
|
|
687
|
+
async removeArNSRecord({ antId, owner, undername, onNonce, }) {
|
|
688
|
+
return this.completeArNSAction('remove-record', { antId, ownerAddress: await owner.getAddress(), undername }, owner, { onNonce }, buildArNSCustodyMessage('remove-record', [antId, undername]));
|
|
689
|
+
}
|
|
690
|
+
/**
|
|
691
|
+
* Grant controller rights on the ANT. Omit `target` for Turbo itself, which
|
|
692
|
+
* is what makes `setArNSRecord` a single call.
|
|
693
|
+
*
|
|
694
|
+
* Owner-signed: changing an ANT's access control is an owner-only
|
|
695
|
+
* instruction. Free to the customer — Turbo funds the ACL page growth.
|
|
696
|
+
*/
|
|
697
|
+
async addArNSController({ antId, owner, target, onNonce, }) {
|
|
698
|
+
return this.completeArNSAction('add-controller', {
|
|
699
|
+
antId,
|
|
700
|
+
ownerAddress: await owner.getAddress(),
|
|
701
|
+
...(target !== undefined ? { target } : {}),
|
|
702
|
+
}, owner, { onNonce });
|
|
703
|
+
}
|
|
704
|
+
/**
|
|
705
|
+
* Revoke controller rights — the escape hatch that keeps "Turbo is not a
|
|
706
|
+
* custodian" honest.
|
|
707
|
+
*
|
|
708
|
+
* Always available, always free, and needs nothing from Turbo but the fee.
|
|
709
|
+
* After revoking, `setArNSRecord` keeps working: it simply starts returning
|
|
710
|
+
* `awaiting-signature` so the owner signs their own record writes.
|
|
711
|
+
*/
|
|
712
|
+
async removeArNSController({ antId, owner, target, onNonce, }) {
|
|
713
|
+
return this.completeArNSAction('remove-controller', {
|
|
714
|
+
antId,
|
|
715
|
+
ownerAddress: await owner.getAddress(),
|
|
716
|
+
...(target !== undefined ? { target } : {}),
|
|
717
|
+
}, owner, { onNonce });
|
|
718
|
+
}
|
|
719
|
+
/**
|
|
720
|
+
* Hand the ANT to a new owner. Irreversible: after this lands, `owner` no
|
|
721
|
+
* longer controls the name. Owner-signed, and sponsored like the rest.
|
|
722
|
+
*/
|
|
723
|
+
async transferArNSAnt({ antId, owner, target, onNonce, }) {
|
|
724
|
+
return this.completeArNSAction('transfer', { antId, ownerAddress: await owner.getAddress(), target }, owner, { onNonce });
|
|
725
|
+
}
|
|
726
|
+
/**
|
|
727
|
+
* Defaults to the signer's own address when `userAddress` is omitted
|
|
728
|
+
* (`null`/`undefined`). Passing `''` does NOT trigger this default --
|
|
729
|
+
* mirrors `getBalance`'s existing behavior above.
|
|
730
|
+
*/
|
|
731
|
+
async getArNSNames(userAddress) {
|
|
732
|
+
userAddress ??= await this.signer.getNativeAddress();
|
|
733
|
+
return super.getArNSNames(userAddress);
|
|
599
734
|
}
|
|
600
735
|
async getCreditShareApprovals({ userAddress, }) {
|
|
601
736
|
userAddress ??= await this.signer.getNativeAddress();
|
package/lib/esm/common/turbo.js
CHANGED
|
@@ -66,6 +66,19 @@ export class TurboUnauthenticatedClient {
|
|
|
66
66
|
getArNSPurchaseStatus(p) {
|
|
67
67
|
return this.paymentService.getArNSPurchaseStatus(p);
|
|
68
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Returns the ArNS names a wallet owns or controls via Turbo's custodial
|
|
71
|
+
* ArNS-with-credits feature. `custodial: true` on a returned name means
|
|
72
|
+
* Turbo still holds/manages its ANT (transfer/manage routes apply);
|
|
73
|
+
* `custodial: false` means self-custody (or an already-completed exit) and
|
|
74
|
+
* is informational only.
|
|
75
|
+
*
|
|
76
|
+
* To read a name's current records or lease/expiration state, use
|
|
77
|
+
* `@ar.io/sdk` directly against the returned `antId`.
|
|
78
|
+
*/
|
|
79
|
+
getArNSNames(address) {
|
|
80
|
+
return this.paymentService.getArNSNames(address);
|
|
81
|
+
}
|
|
69
82
|
/**
|
|
70
83
|
* Quote a fiat (Stripe) ArNS purchase — buy a name with a credit card in one
|
|
71
84
|
* step, no Turbo Credits top-up in between. Complete the returned
|
|
@@ -197,16 +210,22 @@ export class TurboAuthenticatedClient extends TurboUnauthenticatedClient {
|
|
|
197
210
|
getPaymentHistory(params) {
|
|
198
211
|
return this.paymentService.getPaymentHistory(params);
|
|
199
212
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
213
|
+
// ===== ArNS actions (sponsored) =====
|
|
214
|
+
//
|
|
215
|
+
// Thin delegations. The two-shape branch and the owner-proof construction
|
|
216
|
+
// live in the payment service; see its comments for why callers must branch
|
|
217
|
+
// on `status` rather than on which action they asked for.
|
|
218
|
+
/** Create an action. Debits credits HERE — capture the nonce before signing. */
|
|
219
|
+
createArNSAction(action, params, ownerProof) {
|
|
220
|
+
return this.paymentService.createArNSAction(action, params, ownerProof);
|
|
206
221
|
}
|
|
207
|
-
/**
|
|
208
|
-
|
|
209
|
-
return this.paymentService.
|
|
222
|
+
/** Submit the owner-signed transaction (FULL serialized tx, base64). */
|
|
223
|
+
signArNSAction(nonce, signedTransaction) {
|
|
224
|
+
return this.paymentService.signArNSAction(nonce, signedTransaction);
|
|
225
|
+
}
|
|
226
|
+
/** Status by nonce — open, needs no signature. Use it to resume. */
|
|
227
|
+
getArNSActionStatus(nonce) {
|
|
228
|
+
return this.paymentService.getArNSActionStatus(nonce);
|
|
210
229
|
}
|
|
211
230
|
/**
|
|
212
231
|
* Quote a fiat (Stripe) ArNS purchase for this signer's wallet — a credit-card
|
|
@@ -220,27 +239,53 @@ export class TurboAuthenticatedClient extends TurboUnauthenticatedClient {
|
|
|
220
239
|
getArNSFiatPurchaseQuote(params) {
|
|
221
240
|
return this.paymentService.getArNSFiatPurchaseQuote(params);
|
|
222
241
|
}
|
|
223
|
-
/**
|
|
242
|
+
/**
|
|
243
|
+
* Buy a name. The ANT is minted straight to `owner`; Turbo never holds it.
|
|
244
|
+
* The only action that always needs the owner's signature — once, ever.
|
|
245
|
+
*/
|
|
246
|
+
buyArNSName(params) {
|
|
247
|
+
return this.paymentService.buyArNSName(params);
|
|
248
|
+
}
|
|
249
|
+
/** Extend a lease. No owner signature needed. */
|
|
224
250
|
extendArNSLease(params) {
|
|
225
251
|
return this.paymentService.extendArNSLease(params);
|
|
226
252
|
}
|
|
227
|
-
/**
|
|
253
|
+
/** Raise the undername limit. No owner signature needed. */
|
|
228
254
|
increaseArNSUndernameLimit(params) {
|
|
229
255
|
return this.paymentService.increaseArNSUndernameLimit(params);
|
|
230
256
|
}
|
|
231
|
-
/**
|
|
257
|
+
/** Upgrade a lease to a permanent name. No owner signature needed. */
|
|
232
258
|
upgradeArNSName(params) {
|
|
233
259
|
return this.paymentService.upgradeArNSName(params);
|
|
234
260
|
}
|
|
235
|
-
|
|
236
|
-
return this.paymentService.transferArNSAnt(params);
|
|
237
|
-
}
|
|
261
|
+
/** Point a name (or undername) at data. Free; handles both shapes. */
|
|
238
262
|
setArNSRecord(params) {
|
|
239
263
|
return this.paymentService.setArNSRecord(params);
|
|
240
264
|
}
|
|
265
|
+
/** Remove a record. Free; handles both shapes. */
|
|
241
266
|
removeArNSRecord(params) {
|
|
242
267
|
return this.paymentService.removeArNSRecord(params);
|
|
243
268
|
}
|
|
269
|
+
/** Grant controller rights — omit `target` for Turbo itself. Free. */
|
|
270
|
+
addArNSController(params) {
|
|
271
|
+
return this.paymentService.addArNSController(params);
|
|
272
|
+
}
|
|
273
|
+
/** Revoke controller rights. Always available, always free. */
|
|
274
|
+
removeArNSController(params) {
|
|
275
|
+
return this.paymentService.removeArNSController(params);
|
|
276
|
+
}
|
|
277
|
+
/** Hand the ANT to a new owner. Irreversible. Free. */
|
|
278
|
+
transferArNSAnt(params) {
|
|
279
|
+
return this.paymentService.transferArNSAnt(params);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Returns the ArNS names owned or controlled by the connected signer's
|
|
283
|
+
* wallet (or the given `userAddress`) via Turbo's custodial
|
|
284
|
+
* ArNS-with-credits feature.
|
|
285
|
+
*/
|
|
286
|
+
getArNSNames(userAddress) {
|
|
287
|
+
return this.paymentService.getArNSNames(userAddress);
|
|
288
|
+
}
|
|
244
289
|
/**
|
|
245
290
|
* Returns a list of all credit share approvals for the user.
|
|
246
291
|
*/
|
package/lib/esm/types.js
CHANGED
|
@@ -99,6 +99,25 @@ export const arNSPurchaseIntents = [
|
|
|
99
99
|
'Increase-Undername-Limit',
|
|
100
100
|
'Upgrade-Name',
|
|
101
101
|
];
|
|
102
|
+
// ===== ArNS actions (sponsored — the current bundler surface) =====
|
|
103
|
+
/**
|
|
104
|
+
* The nine sponsored ArNS actions.
|
|
105
|
+
*
|
|
106
|
+
* NOT included, because the bundler does not sponsor them: `primary-name`,
|
|
107
|
+
* `release-name`, `reassign`, and ANT metadata (name/description/keywords/logo).
|
|
108
|
+
* Those stay on the direct-signer path and cost the user SOL.
|
|
109
|
+
*/
|
|
110
|
+
export const arNSActions = [
|
|
111
|
+
'buy-name',
|
|
112
|
+
'extend-lease',
|
|
113
|
+
'upgrade-name',
|
|
114
|
+
'increase-undername-limit',
|
|
115
|
+
'set-record',
|
|
116
|
+
'remove-record',
|
|
117
|
+
'add-controller',
|
|
118
|
+
'remove-controller',
|
|
119
|
+
'transfer',
|
|
120
|
+
];
|
|
102
121
|
// ===== ArNS purchases paid with fiat (Stripe) — no Turbo Credits in between ====
|
|
103
122
|
/**
|
|
104
123
|
* Stripe integration mode for a fiat ArNS purchase quote.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ArNSFiatPurchaseQuoteParams, ArNSFiatPurchaseQuoteResponse, ArNSNameType, ArNSPriceParams, ArNSPriceResponse,
|
|
1
|
+
import { ArNSFiatPurchaseQuoteParams, ArNSFiatPurchaseQuoteResponse, ArNSNameType, ArNSPriceParams, ArNSPriceResponse, ArNSPurchaseStatusResponse } from '../../types.js';
|
|
2
|
+
import { ArNSActionCompleted, ArNSOwnerSigner } from '../../types.js';
|
|
2
3
|
import { ArNSFiatQuoteOptions, ArNSPriceOptions, ArNSPurchaseOptions, ArNSPurchaseStatusOptions, RemoveArNSRecordOptions, SetArNSRecordOptions, TransferArNSAntOptions } from '../types.js';
|
|
3
4
|
export type ArNSPriceClient = {
|
|
4
5
|
getArNSPriceForName(params: ArNSPriceParams): Promise<ArNSPriceResponse>;
|
|
@@ -11,56 +12,44 @@ export type ArNSStatusClient = {
|
|
|
11
12
|
export type ArNSPurchaseClient = {
|
|
12
13
|
buyArNSName(params: {
|
|
13
14
|
name: string;
|
|
14
|
-
|
|
15
|
+
owner: ArNSOwnerSigner;
|
|
16
|
+
type?: ArNSNameType;
|
|
15
17
|
years?: number;
|
|
16
|
-
processId?: string;
|
|
17
18
|
paidBy?: string[];
|
|
18
|
-
}): Promise<
|
|
19
|
+
}): Promise<ArNSActionCompleted>;
|
|
19
20
|
extendArNSLease(params: {
|
|
20
21
|
name: string;
|
|
21
22
|
years: number;
|
|
22
23
|
paidBy?: string[];
|
|
23
|
-
}): Promise<
|
|
24
|
+
}): Promise<ArNSActionCompleted>;
|
|
24
25
|
increaseArNSUndernameLimit(params: {
|
|
25
26
|
name: string;
|
|
26
27
|
increaseQty: number;
|
|
27
28
|
paidBy?: string[];
|
|
28
|
-
}): Promise<
|
|
29
|
+
}): Promise<ArNSActionCompleted>;
|
|
29
30
|
upgradeArNSName(params: {
|
|
30
31
|
name: string;
|
|
31
32
|
paidBy?: string[];
|
|
32
|
-
}): Promise<
|
|
33
|
+
}): Promise<ArNSActionCompleted>;
|
|
33
34
|
};
|
|
34
35
|
export type ArNSCustodyClient = {
|
|
35
36
|
transferArNSAnt(params: {
|
|
36
37
|
antId: string;
|
|
38
|
+
owner: ArNSOwnerSigner;
|
|
37
39
|
target: string;
|
|
38
|
-
}): Promise<
|
|
39
|
-
antId: string;
|
|
40
|
-
target: string;
|
|
41
|
-
name?: string;
|
|
42
|
-
messageId: string;
|
|
43
|
-
}>;
|
|
40
|
+
}): Promise<ArNSActionCompleted>;
|
|
44
41
|
setArNSRecord(params: {
|
|
45
42
|
antId: string;
|
|
46
|
-
|
|
43
|
+
owner: ArNSOwnerSigner;
|
|
47
44
|
transactionId: string;
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
undername: string;
|
|
52
|
-
transactionId: string;
|
|
53
|
-
ttlSeconds: number;
|
|
54
|
-
messageId: string;
|
|
55
|
-
}>;
|
|
45
|
+
undername?: string;
|
|
46
|
+
ttlSeconds?: number;
|
|
47
|
+
}): Promise<ArNSActionCompleted>;
|
|
56
48
|
removeArNSRecord(params: {
|
|
57
49
|
antId: string;
|
|
50
|
+
owner: ArNSOwnerSigner;
|
|
58
51
|
undername: string;
|
|
59
|
-
}): Promise<
|
|
60
|
-
antId: string;
|
|
61
|
-
undername: string;
|
|
62
|
-
messageId: string;
|
|
63
|
-
}>;
|
|
52
|
+
}): Promise<ArNSActionCompleted>;
|
|
64
53
|
};
|
|
65
54
|
export declare function requiredNameFromOptions(options: {
|
|
66
55
|
name?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arns.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/arns.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"arns.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/arns.ts"],"names":[],"mappings":"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"}
|