@thru/passkey-manager 0.2.1 → 0.2.3
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.cjs +499 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -2
- package/dist/index.d.ts +24 -2
- package/dist/index.js +495 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/abi/thru/program/passkey_manager/types.ts +586 -1
- package/src/constants.ts +2 -1
- package/src/index.ts +4 -1
- package/src/instructions/register-credential.ts +33 -0
- package/src/seeds.ts +33 -0
- package/src/types.ts +7 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thru/passkey-manager",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@thru/helpers": "0.2.
|
|
16
|
+
"@thru/helpers": "0.2.3"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"tsup": "^8.5.0",
|
|
@@ -2836,6 +2836,297 @@ export class AddAuthorityArgsBuilder {
|
|
|
2836
2836
|
}
|
|
2837
2837
|
}
|
|
2838
2838
|
|
|
2839
|
+
/* ----- TYPE DEFINITION FOR CredentialLookup ----- */
|
|
2840
|
+
|
|
2841
|
+
const __tn_ir_CredentialLookup = {
|
|
2842
|
+
typeName: "CredentialLookup",
|
|
2843
|
+
root: { op: "const", value: 32n }
|
|
2844
|
+
} as const;
|
|
2845
|
+
|
|
2846
|
+
export class CredentialLookup {
|
|
2847
|
+
private view: DataView;
|
|
2848
|
+
|
|
2849
|
+
private constructor(private buffer: Uint8Array) {
|
|
2850
|
+
this.view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
2851
|
+
}
|
|
2852
|
+
|
|
2853
|
+
static __tnCreateView(buffer: Uint8Array, opts?: { fieldContext?: Record<string, number | bigint> }): CredentialLookup {
|
|
2854
|
+
if (!buffer || buffer.length === undefined) throw new Error("CredentialLookup.__tnCreateView requires a Uint8Array");
|
|
2855
|
+
return new CredentialLookup(new Uint8Array(buffer));
|
|
2856
|
+
}
|
|
2857
|
+
|
|
2858
|
+
static builder(): CredentialLookupBuilder {
|
|
2859
|
+
return new CredentialLookupBuilder();
|
|
2860
|
+
}
|
|
2861
|
+
|
|
2862
|
+
static fromBuilder(builder: CredentialLookupBuilder): CredentialLookup | null {
|
|
2863
|
+
const buffer = builder.build();
|
|
2864
|
+
return CredentialLookup.from_array(buffer);
|
|
2865
|
+
}
|
|
2866
|
+
|
|
2867
|
+
get_wallet(): Pubkey {
|
|
2868
|
+
const offset = 0;
|
|
2869
|
+
const slice = this.buffer.subarray(offset, offset + 32);
|
|
2870
|
+
return Pubkey.from_array(slice)!;
|
|
2871
|
+
}
|
|
2872
|
+
|
|
2873
|
+
set_wallet(value: Pubkey): void {
|
|
2874
|
+
/* Copy bytes from source struct to this field */
|
|
2875
|
+
const sourceBytes = (value as any).buffer as Uint8Array;
|
|
2876
|
+
const offset = 0;
|
|
2877
|
+
this.buffer.set(sourceBytes, offset);
|
|
2878
|
+
}
|
|
2879
|
+
|
|
2880
|
+
get wallet(): Pubkey {
|
|
2881
|
+
return this.get_wallet();
|
|
2882
|
+
}
|
|
2883
|
+
|
|
2884
|
+
set wallet(value: Pubkey) {
|
|
2885
|
+
this.set_wallet(value);
|
|
2886
|
+
}
|
|
2887
|
+
|
|
2888
|
+
private static __tnFootprintInternal(__tnParams: Record<string, bigint>): bigint {
|
|
2889
|
+
return __tnEvalFootprint(__tn_ir_CredentialLookup.root, { params: __tnParams });
|
|
2890
|
+
}
|
|
2891
|
+
|
|
2892
|
+
private static __tnValidateInternal(buffer: Uint8Array, __tnParams: Record<string, bigint>): { ok: boolean; code?: string; consumed?: bigint } {
|
|
2893
|
+
return __tnValidateIrTree(__tn_ir_CredentialLookup, buffer, __tnParams);
|
|
2894
|
+
}
|
|
2895
|
+
|
|
2896
|
+
static __tnInvokeFootprint(__tnParams: Record<string, bigint>): bigint {
|
|
2897
|
+
return this.__tnFootprintInternal(__tnParams);
|
|
2898
|
+
}
|
|
2899
|
+
|
|
2900
|
+
static __tnInvokeValidate(buffer: Uint8Array, __tnParams: Record<string, bigint>): __TnValidateResult {
|
|
2901
|
+
return this.__tnValidateInternal(buffer, __tnParams);
|
|
2902
|
+
}
|
|
2903
|
+
|
|
2904
|
+
static footprintIr(): bigint {
|
|
2905
|
+
return this.__tnFootprintInternal(Object.create(null));
|
|
2906
|
+
}
|
|
2907
|
+
|
|
2908
|
+
static footprint(): number {
|
|
2909
|
+
const irResult = this.footprintIr();
|
|
2910
|
+
const maxSafe = __tnToBigInt(Number.MAX_SAFE_INTEGER);
|
|
2911
|
+
if (__tnBigIntGreaterThan(irResult, maxSafe)) {
|
|
2912
|
+
throw new Error('footprint exceeds Number.MAX_SAFE_INTEGER for CredentialLookup');
|
|
2913
|
+
}
|
|
2914
|
+
return __tnBigIntToNumber(irResult, 'CredentialLookup::footprint');
|
|
2915
|
+
}
|
|
2916
|
+
|
|
2917
|
+
static validate(buffer: Uint8Array, _opts?: { params?: never }): { ok: boolean; code?: string; consumed?: number } {
|
|
2918
|
+
if (buffer.length < 32) return { ok: false, code: "tn.buffer_too_small", consumed: 32 };
|
|
2919
|
+
return { ok: true, consumed: 32 };
|
|
2920
|
+
}
|
|
2921
|
+
|
|
2922
|
+
static from_array(buffer: Uint8Array): CredentialLookup | null {
|
|
2923
|
+
if (!buffer || buffer.length === undefined) {
|
|
2924
|
+
return null;
|
|
2925
|
+
}
|
|
2926
|
+
const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
2927
|
+
const validation = this.validate(buffer);
|
|
2928
|
+
if (!validation.ok) {
|
|
2929
|
+
return null;
|
|
2930
|
+
}
|
|
2931
|
+
return new CredentialLookup(buffer);
|
|
2932
|
+
}
|
|
2933
|
+
|
|
2934
|
+
}
|
|
2935
|
+
|
|
2936
|
+
__tnRegisterFootprint("CredentialLookup", (params) => CredentialLookup.__tnInvokeFootprint(params));
|
|
2937
|
+
__tnRegisterValidate("CredentialLookup", (buffer, params) => CredentialLookup.__tnInvokeValidate(buffer, params));
|
|
2938
|
+
|
|
2939
|
+
export class CredentialLookupBuilder {
|
|
2940
|
+
private buffer: Uint8Array;
|
|
2941
|
+
private view: DataView;
|
|
2942
|
+
|
|
2943
|
+
constructor() {
|
|
2944
|
+
this.buffer = new Uint8Array(32);
|
|
2945
|
+
this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);
|
|
2946
|
+
}
|
|
2947
|
+
|
|
2948
|
+
set_wallet(value: Uint8Array): this {
|
|
2949
|
+
if (value.length !== 32) throw new Error("wallet expects 32 bytes");
|
|
2950
|
+
this.buffer.set(value, 0);
|
|
2951
|
+
return this;
|
|
2952
|
+
}
|
|
2953
|
+
|
|
2954
|
+
build(): Uint8Array {
|
|
2955
|
+
return this.buffer.slice();
|
|
2956
|
+
}
|
|
2957
|
+
|
|
2958
|
+
buildInto(target: Uint8Array, offset = 0): Uint8Array {
|
|
2959
|
+
if (target.length - offset < this.buffer.length) throw new Error("target buffer too small");
|
|
2960
|
+
target.set(this.buffer, offset);
|
|
2961
|
+
return target;
|
|
2962
|
+
}
|
|
2963
|
+
|
|
2964
|
+
finish(): CredentialLookup {
|
|
2965
|
+
const view = CredentialLookup.from_array(this.buffer.slice());
|
|
2966
|
+
if (!view) throw new Error("failed to build CredentialLookup");
|
|
2967
|
+
return view;
|
|
2968
|
+
}
|
|
2969
|
+
}
|
|
2970
|
+
|
|
2971
|
+
/* ----- TYPE DEFINITION FOR CredentialRegisteredEventData ----- */
|
|
2972
|
+
|
|
2973
|
+
const __tn_ir_CredentialRegisteredEventData = {
|
|
2974
|
+
typeName: "CredentialRegisteredEventData",
|
|
2975
|
+
root: { op: "const", value: 64n }
|
|
2976
|
+
} as const;
|
|
2977
|
+
|
|
2978
|
+
export class CredentialRegisteredEventData {
|
|
2979
|
+
private view: DataView;
|
|
2980
|
+
|
|
2981
|
+
private constructor(private buffer: Uint8Array) {
|
|
2982
|
+
this.view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
2983
|
+
}
|
|
2984
|
+
|
|
2985
|
+
static __tnCreateView(buffer: Uint8Array, opts?: { fieldContext?: Record<string, number | bigint> }): CredentialRegisteredEventData {
|
|
2986
|
+
if (!buffer || buffer.length === undefined) throw new Error("CredentialRegisteredEventData.__tnCreateView requires a Uint8Array");
|
|
2987
|
+
return new CredentialRegisteredEventData(new Uint8Array(buffer));
|
|
2988
|
+
}
|
|
2989
|
+
|
|
2990
|
+
static builder(): CredentialRegisteredEventDataBuilder {
|
|
2991
|
+
return new CredentialRegisteredEventDataBuilder();
|
|
2992
|
+
}
|
|
2993
|
+
|
|
2994
|
+
static fromBuilder(builder: CredentialRegisteredEventDataBuilder): CredentialRegisteredEventData | null {
|
|
2995
|
+
const buffer = builder.build();
|
|
2996
|
+
return CredentialRegisteredEventData.from_array(buffer);
|
|
2997
|
+
}
|
|
2998
|
+
|
|
2999
|
+
get_wallet(): Pubkey {
|
|
3000
|
+
const offset = 0;
|
|
3001
|
+
const slice = this.buffer.subarray(offset, offset + 32);
|
|
3002
|
+
return Pubkey.from_array(slice)!;
|
|
3003
|
+
}
|
|
3004
|
+
|
|
3005
|
+
set_wallet(value: Pubkey): void {
|
|
3006
|
+
/* Copy bytes from source struct to this field */
|
|
3007
|
+
const sourceBytes = (value as any).buffer as Uint8Array;
|
|
3008
|
+
const offset = 0;
|
|
3009
|
+
this.buffer.set(sourceBytes, offset);
|
|
3010
|
+
}
|
|
3011
|
+
|
|
3012
|
+
get wallet(): Pubkey {
|
|
3013
|
+
return this.get_wallet();
|
|
3014
|
+
}
|
|
3015
|
+
|
|
3016
|
+
set wallet(value: Pubkey) {
|
|
3017
|
+
this.set_wallet(value);
|
|
3018
|
+
}
|
|
3019
|
+
|
|
3020
|
+
get_lookup(): Pubkey {
|
|
3021
|
+
const offset = 32;
|
|
3022
|
+
const slice = this.buffer.subarray(offset, offset + 32);
|
|
3023
|
+
return Pubkey.from_array(slice)!;
|
|
3024
|
+
}
|
|
3025
|
+
|
|
3026
|
+
set_lookup(value: Pubkey): void {
|
|
3027
|
+
/* Copy bytes from source struct to this field */
|
|
3028
|
+
const sourceBytes = (value as any).buffer as Uint8Array;
|
|
3029
|
+
const offset = 32;
|
|
3030
|
+
this.buffer.set(sourceBytes, offset);
|
|
3031
|
+
}
|
|
3032
|
+
|
|
3033
|
+
get lookup(): Pubkey {
|
|
3034
|
+
return this.get_lookup();
|
|
3035
|
+
}
|
|
3036
|
+
|
|
3037
|
+
set lookup(value: Pubkey) {
|
|
3038
|
+
this.set_lookup(value);
|
|
3039
|
+
}
|
|
3040
|
+
|
|
3041
|
+
private static __tnFootprintInternal(__tnParams: Record<string, bigint>): bigint {
|
|
3042
|
+
return __tnEvalFootprint(__tn_ir_CredentialRegisteredEventData.root, { params: __tnParams });
|
|
3043
|
+
}
|
|
3044
|
+
|
|
3045
|
+
private static __tnValidateInternal(buffer: Uint8Array, __tnParams: Record<string, bigint>): { ok: boolean; code?: string; consumed?: bigint } {
|
|
3046
|
+
return __tnValidateIrTree(__tn_ir_CredentialRegisteredEventData, buffer, __tnParams);
|
|
3047
|
+
}
|
|
3048
|
+
|
|
3049
|
+
static __tnInvokeFootprint(__tnParams: Record<string, bigint>): bigint {
|
|
3050
|
+
return this.__tnFootprintInternal(__tnParams);
|
|
3051
|
+
}
|
|
3052
|
+
|
|
3053
|
+
static __tnInvokeValidate(buffer: Uint8Array, __tnParams: Record<string, bigint>): __TnValidateResult {
|
|
3054
|
+
return this.__tnValidateInternal(buffer, __tnParams);
|
|
3055
|
+
}
|
|
3056
|
+
|
|
3057
|
+
static footprintIr(): bigint {
|
|
3058
|
+
return this.__tnFootprintInternal(Object.create(null));
|
|
3059
|
+
}
|
|
3060
|
+
|
|
3061
|
+
static footprint(): number {
|
|
3062
|
+
const irResult = this.footprintIr();
|
|
3063
|
+
const maxSafe = __tnToBigInt(Number.MAX_SAFE_INTEGER);
|
|
3064
|
+
if (__tnBigIntGreaterThan(irResult, maxSafe)) {
|
|
3065
|
+
throw new Error('footprint exceeds Number.MAX_SAFE_INTEGER for CredentialRegisteredEventData');
|
|
3066
|
+
}
|
|
3067
|
+
return __tnBigIntToNumber(irResult, 'CredentialRegisteredEventData::footprint');
|
|
3068
|
+
}
|
|
3069
|
+
|
|
3070
|
+
static validate(buffer: Uint8Array, _opts?: { params?: never }): { ok: boolean; code?: string; consumed?: number } {
|
|
3071
|
+
if (buffer.length < 64) return { ok: false, code: "tn.buffer_too_small", consumed: 64 };
|
|
3072
|
+
return { ok: true, consumed: 64 };
|
|
3073
|
+
}
|
|
3074
|
+
|
|
3075
|
+
static from_array(buffer: Uint8Array): CredentialRegisteredEventData | null {
|
|
3076
|
+
if (!buffer || buffer.length === undefined) {
|
|
3077
|
+
return null;
|
|
3078
|
+
}
|
|
3079
|
+
const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
3080
|
+
const validation = this.validate(buffer);
|
|
3081
|
+
if (!validation.ok) {
|
|
3082
|
+
return null;
|
|
3083
|
+
}
|
|
3084
|
+
return new CredentialRegisteredEventData(buffer);
|
|
3085
|
+
}
|
|
3086
|
+
|
|
3087
|
+
}
|
|
3088
|
+
|
|
3089
|
+
__tnRegisterFootprint("CredentialRegisteredEventData", (params) => CredentialRegisteredEventData.__tnInvokeFootprint(params));
|
|
3090
|
+
__tnRegisterValidate("CredentialRegisteredEventData", (buffer, params) => CredentialRegisteredEventData.__tnInvokeValidate(buffer, params));
|
|
3091
|
+
|
|
3092
|
+
export class CredentialRegisteredEventDataBuilder {
|
|
3093
|
+
private buffer: Uint8Array;
|
|
3094
|
+
private view: DataView;
|
|
3095
|
+
|
|
3096
|
+
constructor() {
|
|
3097
|
+
this.buffer = new Uint8Array(64);
|
|
3098
|
+
this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);
|
|
3099
|
+
}
|
|
3100
|
+
|
|
3101
|
+
set_wallet(value: Uint8Array): this {
|
|
3102
|
+
if (value.length !== 32) throw new Error("wallet expects 32 bytes");
|
|
3103
|
+
this.buffer.set(value, 0);
|
|
3104
|
+
return this;
|
|
3105
|
+
}
|
|
3106
|
+
|
|
3107
|
+
set_lookup(value: Uint8Array): this {
|
|
3108
|
+
if (value.length !== 32) throw new Error("lookup expects 32 bytes");
|
|
3109
|
+
this.buffer.set(value, 32);
|
|
3110
|
+
return this;
|
|
3111
|
+
}
|
|
3112
|
+
|
|
3113
|
+
build(): Uint8Array {
|
|
3114
|
+
return this.buffer.slice();
|
|
3115
|
+
}
|
|
3116
|
+
|
|
3117
|
+
buildInto(target: Uint8Array, offset = 0): Uint8Array {
|
|
3118
|
+
if (target.length - offset < this.buffer.length) throw new Error("target buffer too small");
|
|
3119
|
+
target.set(this.buffer, offset);
|
|
3120
|
+
return target;
|
|
3121
|
+
}
|
|
3122
|
+
|
|
3123
|
+
finish(): CredentialRegisteredEventData {
|
|
3124
|
+
const view = CredentialRegisteredEventData.from_array(this.buffer.slice());
|
|
3125
|
+
if (!view) throw new Error("failed to build CredentialRegisteredEventData");
|
|
3126
|
+
return view;
|
|
3127
|
+
}
|
|
3128
|
+
}
|
|
3129
|
+
|
|
2839
3130
|
/* ----- TYPE DEFINITION FOR InvokeArgs ----- */
|
|
2840
3131
|
|
|
2841
3132
|
const __tn_ir_InvokeArgs = {
|
|
@@ -3242,7 +3533,7 @@ export class InvokeArgsBuilder {
|
|
|
3242
3533
|
|
|
3243
3534
|
const __tn_ir_PasskeyEvent = {
|
|
3244
3535
|
typeName: "PasskeyEvent",
|
|
3245
|
-
root: { op: "align", alignment: 1, node: { op: "add", left: { op: "align", alignment: 1, node: { op: "const", value: 1n } }, right: { op: "align", alignment: 1, node: { op: "switch", tag: "PasskeyEvent::payload.event_type", cases: [{ value: 0, node: { op: "align", alignment: 1, node: { op: "const", value: 97n } } }, { value: 1, node: { op: "align", alignment: 1, node: { op: "const", value: 40n } } }, { value: 2, node: { op: "align", alignment: 1, node: { op: "const", value: 72n } } }] } } } }
|
|
3536
|
+
root: { op: "align", alignment: 1, node: { op: "add", left: { op: "align", alignment: 1, node: { op: "const", value: 1n } }, right: { op: "align", alignment: 1, node: { op: "switch", tag: "PasskeyEvent::payload.event_type", cases: [{ value: 0, node: { op: "align", alignment: 1, node: { op: "const", value: 97n } } }, { value: 1, node: { op: "align", alignment: 1, node: { op: "const", value: 40n } } }, { value: 2, node: { op: "align", alignment: 1, node: { op: "const", value: 72n } } }, { value: 3, node: { op: "align", alignment: 1, node: { op: "const", value: 64n } } }] } } } }
|
|
3246
3537
|
} as const;
|
|
3247
3538
|
|
|
3248
3539
|
export class PasskeyEvent_payload_Inner {
|
|
@@ -3280,6 +3571,11 @@ export class PasskeyEvent_payload_Inner {
|
|
|
3280
3571
|
return WalletTransferEventData.__tnCreateView(new Uint8Array(this.buffer), { fieldContext: this.__tnFieldContext ?? undefined });
|
|
3281
3572
|
}
|
|
3282
3573
|
|
|
3574
|
+
asCredentialRegistered(): CredentialRegisteredEventData | null {
|
|
3575
|
+
if (!this.descriptor || this.descriptor.tag !== 3) return null;
|
|
3576
|
+
return CredentialRegisteredEventData.__tnCreateView(new Uint8Array(this.buffer), { fieldContext: this.__tnFieldContext ?? undefined });
|
|
3577
|
+
}
|
|
3578
|
+
|
|
3283
3579
|
}
|
|
3284
3580
|
|
|
3285
3581
|
export class PasskeyEvent {
|
|
@@ -3349,6 +3645,13 @@ export class PasskeyEvent {
|
|
|
3349
3645
|
payloadType: "PasskeyEvent::payload::wallet_transfer",
|
|
3350
3646
|
createPayloadBuilder: () => __tnMaybeCallBuilder(WalletTransferEventData),
|
|
3351
3647
|
},
|
|
3648
|
+
{
|
|
3649
|
+
name: "credential_registered",
|
|
3650
|
+
tag: 3,
|
|
3651
|
+
payloadSize: 64,
|
|
3652
|
+
payloadType: "PasskeyEvent::payload::credential_registered",
|
|
3653
|
+
createPayloadBuilder: () => __tnMaybeCallBuilder(CredentialRegisteredEventData),
|
|
3654
|
+
},
|
|
3352
3655
|
] as const);
|
|
3353
3656
|
|
|
3354
3657
|
private static __tnExtractParams(view: DataView, buffer: Uint8Array): { params: PasskeyEvent.Params; derived: Record<string, bigint> | null } | null {
|
|
@@ -3911,6 +4214,275 @@ export class CreateArgsBuilder {
|
|
|
3911
4214
|
}
|
|
3912
4215
|
}
|
|
3913
4216
|
|
|
4217
|
+
/* ----- TYPE DEFINITION FOR RegisterCredentialArgs ----- */
|
|
4218
|
+
|
|
4219
|
+
const __tn_ir_RegisterCredentialArgs = {
|
|
4220
|
+
typeName: "RegisterCredentialArgs",
|
|
4221
|
+
root: { op: "align", alignment: 1, node: { op: "add", left: { op: "add", left: { op: "add", left: { op: "align", alignment: 2, node: { op: "const", value: 2n } }, right: { op: "align", alignment: 2, node: { op: "const", value: 2n } } }, right: { op: "align", alignment: 1, node: { op: "const", value: 32n } } }, right: { op: "align", alignment: 1, node: { op: "call", typeName: "StateProof", args: [{ name: "proof_body.hdr.type_slot", source: "proof_body.hdr.type_slot" }, { name: "proof_body.payload_size", source: "proof_body.payload_size" }] } } } }
|
|
4222
|
+
} as const;
|
|
4223
|
+
|
|
4224
|
+
export class RegisterCredentialArgs {
|
|
4225
|
+
private view: DataView;
|
|
4226
|
+
|
|
4227
|
+
private constructor(private buffer: Uint8Array) {
|
|
4228
|
+
this.view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
4229
|
+
}
|
|
4230
|
+
|
|
4231
|
+
static __tnCreateView(buffer: Uint8Array, opts?: { fieldContext?: Record<string, number | bigint> }): RegisterCredentialArgs {
|
|
4232
|
+
if (!buffer || buffer.length === undefined) throw new Error("RegisterCredentialArgs.__tnCreateView requires a Uint8Array");
|
|
4233
|
+
return new RegisterCredentialArgs(new Uint8Array(buffer));
|
|
4234
|
+
}
|
|
4235
|
+
|
|
4236
|
+
static builder(): RegisterCredentialArgsBuilder {
|
|
4237
|
+
return new RegisterCredentialArgsBuilder();
|
|
4238
|
+
}
|
|
4239
|
+
|
|
4240
|
+
static fromBuilder(builder: RegisterCredentialArgsBuilder): RegisterCredentialArgs | null {
|
|
4241
|
+
const buffer = builder.build();
|
|
4242
|
+
return RegisterCredentialArgs.from_array(buffer);
|
|
4243
|
+
}
|
|
4244
|
+
|
|
4245
|
+
get_wallet_account_idx(): number {
|
|
4246
|
+
const offset = 0;
|
|
4247
|
+
return this.view.getUint16(offset, true); /* little-endian */
|
|
4248
|
+
}
|
|
4249
|
+
|
|
4250
|
+
set_wallet_account_idx(value: number): void {
|
|
4251
|
+
const offset = 0;
|
|
4252
|
+
this.view.setUint16(offset, value, true); /* little-endian */
|
|
4253
|
+
}
|
|
4254
|
+
|
|
4255
|
+
get wallet_account_idx(): number {
|
|
4256
|
+
return this.get_wallet_account_idx();
|
|
4257
|
+
}
|
|
4258
|
+
|
|
4259
|
+
set wallet_account_idx(value: number) {
|
|
4260
|
+
this.set_wallet_account_idx(value);
|
|
4261
|
+
}
|
|
4262
|
+
|
|
4263
|
+
get_lookup_account_idx(): number {
|
|
4264
|
+
const offset = 2;
|
|
4265
|
+
return this.view.getUint16(offset, true); /* little-endian */
|
|
4266
|
+
}
|
|
4267
|
+
|
|
4268
|
+
set_lookup_account_idx(value: number): void {
|
|
4269
|
+
const offset = 2;
|
|
4270
|
+
this.view.setUint16(offset, value, true); /* little-endian */
|
|
4271
|
+
}
|
|
4272
|
+
|
|
4273
|
+
get lookup_account_idx(): number {
|
|
4274
|
+
return this.get_lookup_account_idx();
|
|
4275
|
+
}
|
|
4276
|
+
|
|
4277
|
+
set lookup_account_idx(value: number) {
|
|
4278
|
+
this.set_lookup_account_idx(value);
|
|
4279
|
+
}
|
|
4280
|
+
|
|
4281
|
+
get_seed(): Seed32 {
|
|
4282
|
+
const offset = 4;
|
|
4283
|
+
const slice = this.buffer.subarray(offset, offset + 32);
|
|
4284
|
+
return Seed32.from_array(slice)!;
|
|
4285
|
+
}
|
|
4286
|
+
|
|
4287
|
+
set_seed(value: Seed32): void {
|
|
4288
|
+
/* Copy bytes from source struct to this field */
|
|
4289
|
+
const sourceBytes = (value as any).buffer as Uint8Array;
|
|
4290
|
+
const offset = 4;
|
|
4291
|
+
this.buffer.set(sourceBytes, offset);
|
|
4292
|
+
}
|
|
4293
|
+
|
|
4294
|
+
get seed(): Seed32 {
|
|
4295
|
+
return this.get_seed();
|
|
4296
|
+
}
|
|
4297
|
+
|
|
4298
|
+
set seed(value: Seed32) {
|
|
4299
|
+
this.set_seed(value);
|
|
4300
|
+
}
|
|
4301
|
+
|
|
4302
|
+
get_state_proof(): StateProof {
|
|
4303
|
+
const offset = 36;
|
|
4304
|
+
const tail = this.buffer.subarray(offset);
|
|
4305
|
+
const validation = StateProof.validate(tail);
|
|
4306
|
+
if (!validation.ok || validation.consumed === undefined) {
|
|
4307
|
+
throw new Error("RegisterCredentialArgs: failed to read field 'state_proof' (invalid nested payload)");
|
|
4308
|
+
}
|
|
4309
|
+
const length = validation.consumed;
|
|
4310
|
+
const slice = tail.subarray(0, length);
|
|
4311
|
+
const opts = validation.params ? { params: validation.params } : undefined;
|
|
4312
|
+
return StateProof.from_array(slice, opts)!;
|
|
4313
|
+
}
|
|
4314
|
+
|
|
4315
|
+
set_state_proof(value: StateProof): void {
|
|
4316
|
+
/* Copy bytes from source struct to this field */
|
|
4317
|
+
const sourceBytes = (value as any).buffer as Uint8Array;
|
|
4318
|
+
const offset = 36;
|
|
4319
|
+
this.buffer.set(sourceBytes, offset);
|
|
4320
|
+
}
|
|
4321
|
+
|
|
4322
|
+
get state_proof(): StateProof {
|
|
4323
|
+
return this.get_state_proof();
|
|
4324
|
+
}
|
|
4325
|
+
|
|
4326
|
+
set state_proof(value: StateProof) {
|
|
4327
|
+
this.set_state_proof(value);
|
|
4328
|
+
}
|
|
4329
|
+
|
|
4330
|
+
private static __tnFootprintInternal(__tnParams: Record<string, bigint>): bigint {
|
|
4331
|
+
return __tnEvalFootprint(__tn_ir_RegisterCredentialArgs.root, { params: __tnParams });
|
|
4332
|
+
}
|
|
4333
|
+
|
|
4334
|
+
private static __tnValidateInternal(buffer: Uint8Array, __tnParams: Record<string, bigint>): { ok: boolean; code?: string; consumed?: bigint } {
|
|
4335
|
+
return __tnValidateIrTree(__tn_ir_RegisterCredentialArgs, buffer, __tnParams);
|
|
4336
|
+
}
|
|
4337
|
+
|
|
4338
|
+
static __tnInvokeFootprint(__tnParams: Record<string, bigint>): bigint {
|
|
4339
|
+
return this.__tnFootprintInternal(__tnParams);
|
|
4340
|
+
}
|
|
4341
|
+
|
|
4342
|
+
static __tnInvokeValidate(buffer: Uint8Array, __tnParams: Record<string, bigint>): __TnValidateResult {
|
|
4343
|
+
return this.__tnValidateInternal(buffer, __tnParams);
|
|
4344
|
+
}
|
|
4345
|
+
|
|
4346
|
+
static footprintIr(): bigint {
|
|
4347
|
+
return this.__tnFootprintInternal(Object.create(null));
|
|
4348
|
+
}
|
|
4349
|
+
|
|
4350
|
+
static footprint(): number {
|
|
4351
|
+
const irResult = this.footprintIr();
|
|
4352
|
+
const maxSafe = __tnToBigInt(Number.MAX_SAFE_INTEGER);
|
|
4353
|
+
if (__tnBigIntGreaterThan(irResult, maxSafe)) {
|
|
4354
|
+
throw new Error('footprint exceeds Number.MAX_SAFE_INTEGER for RegisterCredentialArgs');
|
|
4355
|
+
}
|
|
4356
|
+
return __tnBigIntToNumber(irResult, 'RegisterCredentialArgs::footprint');
|
|
4357
|
+
}
|
|
4358
|
+
|
|
4359
|
+
static validate(_buffer: Uint8Array, _opts?: { params?: never }): { ok: boolean; code?: string; consumed?: number } {
|
|
4360
|
+
__tnLogWarn("RegisterCredentialArgs::validate falling back to basic length check");
|
|
4361
|
+
return { ok: true, consumed: _buffer.length };
|
|
4362
|
+
}
|
|
4363
|
+
|
|
4364
|
+
static from_array(buffer: Uint8Array): RegisterCredentialArgs | null {
|
|
4365
|
+
if (!buffer || buffer.length === undefined) {
|
|
4366
|
+
return null;
|
|
4367
|
+
}
|
|
4368
|
+
const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
4369
|
+
const validation = this.validate(buffer);
|
|
4370
|
+
if (!validation.ok) {
|
|
4371
|
+
return null;
|
|
4372
|
+
}
|
|
4373
|
+
return new RegisterCredentialArgs(buffer);
|
|
4374
|
+
}
|
|
4375
|
+
|
|
4376
|
+
}
|
|
4377
|
+
|
|
4378
|
+
__tnRegisterFootprint("RegisterCredentialArgs", (params) => RegisterCredentialArgs.__tnInvokeFootprint(params));
|
|
4379
|
+
__tnRegisterValidate("RegisterCredentialArgs", (buffer, params) => RegisterCredentialArgs.__tnInvokeValidate(buffer, params));
|
|
4380
|
+
|
|
4381
|
+
export class RegisterCredentialArgsBuilder {
|
|
4382
|
+
private buffer: Uint8Array;
|
|
4383
|
+
private view: DataView;
|
|
4384
|
+
private __tnTail_state_proof: Uint8Array | null = null;
|
|
4385
|
+
|
|
4386
|
+
constructor() {
|
|
4387
|
+
this.buffer = new Uint8Array(36);
|
|
4388
|
+
this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);
|
|
4389
|
+
}
|
|
4390
|
+
|
|
4391
|
+
private __tnInvalidate(): void {
|
|
4392
|
+
/* Placeholder for future cache invalidation. */
|
|
4393
|
+
}
|
|
4394
|
+
|
|
4395
|
+
set_wallet_account_idx(value: number): this {
|
|
4396
|
+
this.view.setUint16(0, value, true);
|
|
4397
|
+
this.__tnInvalidate();
|
|
4398
|
+
return this;
|
|
4399
|
+
}
|
|
4400
|
+
|
|
4401
|
+
set_lookup_account_idx(value: number): this {
|
|
4402
|
+
this.view.setUint16(2, value, true);
|
|
4403
|
+
this.__tnInvalidate();
|
|
4404
|
+
return this;
|
|
4405
|
+
}
|
|
4406
|
+
|
|
4407
|
+
set_seed(value: Uint8Array): this {
|
|
4408
|
+
if (value.length !== 32) throw new Error("seed expects 32 bytes");
|
|
4409
|
+
this.buffer.set(value, 4);
|
|
4410
|
+
this.__tnInvalidate();
|
|
4411
|
+
return this;
|
|
4412
|
+
}
|
|
4413
|
+
|
|
4414
|
+
set_state_proof(value: StateProof | __TnStructFieldInput): this {
|
|
4415
|
+
const bytes = __tnResolveStructFieldInput(value as __TnStructFieldInput, "RegisterCredentialArgsBuilder::state_proof");
|
|
4416
|
+
this.__tnTail_state_proof = bytes;
|
|
4417
|
+
this.__tnInvalidate();
|
|
4418
|
+
return this;
|
|
4419
|
+
}
|
|
4420
|
+
|
|
4421
|
+
build(): Uint8Array {
|
|
4422
|
+
const fragments = this.__tnCollectTailFragments();
|
|
4423
|
+
const size = this.__tnComputeSize(fragments);
|
|
4424
|
+
const buffer = new Uint8Array(size);
|
|
4425
|
+
this.__tnWriteInto(buffer, fragments);
|
|
4426
|
+
this.__tnValidateOrThrow(buffer);
|
|
4427
|
+
return buffer;
|
|
4428
|
+
}
|
|
4429
|
+
|
|
4430
|
+
buildInto(target: Uint8Array, offset = 0): Uint8Array {
|
|
4431
|
+
const fragments = this.__tnCollectTailFragments();
|
|
4432
|
+
const size = this.__tnComputeSize(fragments);
|
|
4433
|
+
if (target.length - offset < size) throw new Error("RegisterCredentialArgsBuilder: target buffer too small");
|
|
4434
|
+
const slice = target.subarray(offset, offset + size);
|
|
4435
|
+
this.__tnWriteInto(slice, fragments);
|
|
4436
|
+
this.__tnValidateOrThrow(slice);
|
|
4437
|
+
return target;
|
|
4438
|
+
}
|
|
4439
|
+
|
|
4440
|
+
finish(): RegisterCredentialArgs {
|
|
4441
|
+
const buffer = this.build();
|
|
4442
|
+
const view = RegisterCredentialArgs.from_array(buffer);
|
|
4443
|
+
if (!view) throw new Error("RegisterCredentialArgsBuilder: failed to finalize view");
|
|
4444
|
+
return view;
|
|
4445
|
+
}
|
|
4446
|
+
|
|
4447
|
+
finishView(): RegisterCredentialArgs {
|
|
4448
|
+
return this.finish();
|
|
4449
|
+
}
|
|
4450
|
+
|
|
4451
|
+
private __tnCollectTailFragments(): Uint8Array[] {
|
|
4452
|
+
return [
|
|
4453
|
+
(() => {
|
|
4454
|
+
const bytes = this.__tnTail_state_proof;
|
|
4455
|
+
if (!bytes) throw new Error("RegisterCredentialArgsBuilder: field 'state_proof' must be set before build()");
|
|
4456
|
+
return bytes;
|
|
4457
|
+
})(),
|
|
4458
|
+
];
|
|
4459
|
+
}
|
|
4460
|
+
|
|
4461
|
+
private __tnComputeSize(fragments: readonly Uint8Array[]): number {
|
|
4462
|
+
let total = this.buffer.length;
|
|
4463
|
+
for (const fragment of fragments) {
|
|
4464
|
+
total += fragment.length;
|
|
4465
|
+
}
|
|
4466
|
+
return total;
|
|
4467
|
+
}
|
|
4468
|
+
|
|
4469
|
+
private __tnWriteInto(target: Uint8Array, fragments: readonly Uint8Array[]): void {
|
|
4470
|
+
target.set(this.buffer, 0);
|
|
4471
|
+
let cursor = this.buffer.length;
|
|
4472
|
+
for (const fragment of fragments) {
|
|
4473
|
+
target.set(fragment, cursor);
|
|
4474
|
+
cursor += fragment.length;
|
|
4475
|
+
}
|
|
4476
|
+
}
|
|
4477
|
+
|
|
4478
|
+
private __tnValidateOrThrow(buffer: Uint8Array): void {
|
|
4479
|
+
const result = RegisterCredentialArgs.validate(buffer);
|
|
4480
|
+
if (!result.ok) {
|
|
4481
|
+
throw new Error(`RegisterCredentialArgsBuilder: builder produced invalid buffer (code=${result.code ?? "unknown"})`);
|
|
4482
|
+
}
|
|
4483
|
+
}
|
|
4484
|
+
}
|
|
4485
|
+
|
|
3914
4486
|
/* ----- TYPE DEFINITION FOR PasskeyInstruction ----- */
|
|
3915
4487
|
|
|
3916
4488
|
const __tn_ir_PasskeyInstruction = {
|
|
@@ -3968,6 +4540,11 @@ export class PasskeyInstruction_payload_Inner {
|
|
|
3968
4540
|
return RemoveAuthorityArgs.__tnCreateView(new Uint8Array(this.buffer), { fieldContext: this.__tnFieldContext ?? undefined });
|
|
3969
4541
|
}
|
|
3970
4542
|
|
|
4543
|
+
asRegisterCredential(): RegisterCredentialArgs | null {
|
|
4544
|
+
if (!this.descriptor || this.descriptor.tag !== 6) return null;
|
|
4545
|
+
return RegisterCredentialArgs.__tnCreateView(new Uint8Array(this.buffer), { fieldContext: this.__tnFieldContext ?? undefined });
|
|
4546
|
+
}
|
|
4547
|
+
|
|
3971
4548
|
}
|
|
3972
4549
|
|
|
3973
4550
|
export class PasskeyInstruction {
|
|
@@ -4058,6 +4635,13 @@ export class PasskeyInstruction {
|
|
|
4058
4635
|
payloadType: "PasskeyInstruction::payload::remove_authority",
|
|
4059
4636
|
createPayloadBuilder: () => __tnMaybeCallBuilder(RemoveAuthorityArgs),
|
|
4060
4637
|
},
|
|
4638
|
+
{
|
|
4639
|
+
name: "register_credential",
|
|
4640
|
+
tag: 6,
|
|
4641
|
+
payloadSize: null,
|
|
4642
|
+
payloadType: "PasskeyInstruction::payload::register_credential",
|
|
4643
|
+
createPayloadBuilder: () => __tnMaybeCallBuilder(RegisterCredentialArgs),
|
|
4644
|
+
},
|
|
4061
4645
|
] as const);
|
|
4062
4646
|
|
|
4063
4647
|
static __tnComputeSequentialLayout(view: DataView, buffer: Uint8Array): { params: Record<string, bigint> | null; offsets: Record<string, number> | null; derived: Record<string, bigint> | null } | null {
|
|
@@ -4079,6 +4663,7 @@ export class PasskeyInstruction {
|
|
|
4079
4663
|
case 3: break;
|
|
4080
4664
|
case 4: break;
|
|
4081
4665
|
case 5: break;
|
|
4666
|
+
case 6: break;
|
|
4082
4667
|
default: return null;
|
|
4083
4668
|
}
|
|
4084
4669
|
if (__tnCursorMutable > __tnLength) return null;
|
package/src/constants.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export const PASSKEY_MANAGER_PROGRAM_ADDRESS =
|
|
2
|
-
'
|
|
2
|
+
'taUDdQyFxvM5i0HFRkEK3W45kWLyblAHSnMg4zplgUnz6Z';
|
|
3
3
|
|
|
4
4
|
// Instruction discriminants
|
|
5
5
|
export const INSTRUCTION_CREATE = 0x00;
|
|
@@ -8,6 +8,7 @@ export const INSTRUCTION_TRANSFER = 0x02;
|
|
|
8
8
|
export const INSTRUCTION_INVOKE = 0x03;
|
|
9
9
|
export const INSTRUCTION_ADD_AUTHORITY = 0x04;
|
|
10
10
|
export const INSTRUCTION_REMOVE_AUTHORITY = 0x05;
|
|
11
|
+
export const INSTRUCTION_REGISTER_CREDENTIAL = 0x06;
|
|
11
12
|
|
|
12
13
|
// Authority tags
|
|
13
14
|
export const AUTHORITY_TAG_PASSKEY = 1;
|
package/src/index.ts
CHANGED
|
@@ -7,6 +7,7 @@ export {
|
|
|
7
7
|
INSTRUCTION_INVOKE,
|
|
8
8
|
INSTRUCTION_ADD_AUTHORITY,
|
|
9
9
|
INSTRUCTION_REMOVE_AUTHORITY,
|
|
10
|
+
INSTRUCTION_REGISTER_CREDENTIAL,
|
|
10
11
|
AUTHORITY_TAG_PASSKEY,
|
|
11
12
|
AUTHORITY_TAG_PUBKEY,
|
|
12
13
|
} from './constants';
|
|
@@ -17,6 +18,7 @@ export type {
|
|
|
17
18
|
CreateInstructionParams,
|
|
18
19
|
TransferInstructionParams,
|
|
19
20
|
ValidateInstructionParams,
|
|
21
|
+
RegisterCredentialInstructionParams,
|
|
20
22
|
AccountContext,
|
|
21
23
|
WalletSigner,
|
|
22
24
|
TransactionExecutionSummary,
|
|
@@ -33,13 +35,14 @@ export { encodeTransferInstruction } from './instructions/transfer';
|
|
|
33
35
|
export { encodeInvokeInstruction } from './instructions/invoke';
|
|
34
36
|
export { encodeAddAuthorityInstruction } from './instructions/add-authority';
|
|
35
37
|
export { encodeRemoveAuthorityInstruction } from './instructions/remove-authority';
|
|
38
|
+
export { encodeRegisterCredentialInstruction } from './instructions/register-credential';
|
|
36
39
|
export { concatenateInstructions } from './instructions/shared';
|
|
37
40
|
|
|
38
41
|
// Challenge
|
|
39
42
|
export { createValidateChallenge } from './challenge';
|
|
40
43
|
|
|
41
44
|
// Seeds & derivation
|
|
42
|
-
export { createWalletSeed, deriveWalletAddress } from './seeds';
|
|
45
|
+
export { createWalletSeed, deriveWalletAddress, createCredentialLookupSeed, deriveCredentialLookupAddress } from './seeds';
|
|
43
46
|
|
|
44
47
|
// Account context building
|
|
45
48
|
export { buildAccountContext, buildPasskeyReadWriteAccounts, FEE_PAYER_ADDRESS } from './context';
|