@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thru/passkey-manager",
3
- "version": "0.2.1",
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.1"
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
- 'taNiWOgcxRz2DYI1Vbp6AOMdiEbC9nYwXd02dQJ4jnUUpF';
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';