@seams/wallet-server 0.22.0 → 0.24.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.
Files changed (84) hide show
  1. package/THIRD_PARTY_NOTICES.md +186 -6
  2. package/artifact-manifest.json +23 -13
  3. package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
  4. package/cloudflare-router-ab/build/deriver-b/build-stamp.json +1 -1
  5. package/cloudflare-router-ab/build/router/build-stamp.json +1 -1
  6. package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -1
  7. package/cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json +1 -1
  8. package/dist/esm/authorization/voiceIdDeviceProof.js +32 -0
  9. package/dist/esm/core/ThresholdService/validation.js +17 -1
  10. package/dist/esm/core/d1WalletAuthMethodStore.js +42 -1
  11. package/dist/esm/core/deviceLinking/linkedDeviceManagement.js +5 -0
  12. package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +11 -2
  13. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +23 -6
  14. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +5 -5
  15. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationAttemptStore.js +1 -1
  16. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyEnvelopeStore.js +6 -0
  17. package/dist/esm/router/cloudflare/d1/wallet/d1VoiceIdActivation.js +139 -0
  18. package/dist/esm/router/cloudflare/d1/wallet/d1VoiceIdSessions.js +138 -0
  19. package/dist/esm/router/cloudflare/d1/wallet/d1VoiceIdWalletSessionChallenges.js +88 -0
  20. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +12 -4
  21. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +14 -0
  22. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnRecords.js +1 -0
  23. package/dist/esm/router/cloudflare.js +576 -10
  24. package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +5 -0
  25. package/dist/esm/router/domains/passkeyCustody/walletRecoveryFinalization.js +1 -0
  26. package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmissionCore.js +1 -0
  27. package/dist/esm/router/domains/signingOperations/walletExecutionAdmission.js +1 -0
  28. package/dist/esm/router/domains/voiceId/voiceIdActivation.js +12 -0
  29. package/dist/esm/router/domains/voiceId/voiceIdSessions.js +0 -0
  30. package/dist/esm/router/framework/routeDefinitions.js +13 -0
  31. package/dist/esm/router/transport/fetch/createFetchRouter.js +5 -0
  32. package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +12 -1
  33. package/dist/esm/router/transport/fetch/routes/walletExecutionLanePreflight.js +1 -0
  34. package/dist/esm/router/transport/fetch/routes/walletVoiceIdActivation.js +139 -0
  35. package/dist/esm/router/transport/fetch/routes/walletVoiceIdNear.js +36 -0
  36. package/dist/esm/router/transport/fetch/routes/walletVoiceIdSessions.js +127 -0
  37. package/dist/esm/shared-ts/src/authorization/voiceIdDeviceAssertion.js +110 -0
  38. package/dist/esm/shared-ts/src/device-linking/authorityActivation.js +1 -0
  39. package/dist/esm/shared-ts/src/device-linking/committedSignerPackages.js +1 -1
  40. package/dist/esm/shared-ts/src/passkey-custody/custodyEnvelope.js +30 -3
  41. package/dist/esm/shared-ts/src/passkey-custody/custodySecretBinding.js +1 -1
  42. package/dist/esm/shared-ts/src/signing-lanes/recordParsers.js +15 -1
  43. package/dist/esm/shared-ts/src/threshold/sessionPolicy.js +2 -1
  44. package/dist/esm/shared-ts/src/utils/registrationIntent.js +1 -3
  45. package/dist/esm/shared-ts/src/utils/walletAuthAuthority.js +46 -2
  46. package/dist/esm/shared-ts/src/utils/walletAuthMethodRecord.js +116 -7
  47. package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryCommittedProjection.js +1 -0
  48. package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
  49. package/dist/types/shared-ts/src/authorization/voiceIdDeviceAssertion.d.ts +32 -0
  50. package/dist/types/shared-ts/src/device-linking/committedSignerPackages.d.ts +3 -1
  51. package/dist/types/shared-ts/src/device-linking/contracts.d.ts +8 -0
  52. package/dist/types/shared-ts/src/passkey-custody/custodyEnvelope.d.ts +29 -0
  53. package/dist/types/shared-ts/src/passkey-custody/custodySecretBinding.d.ts +1 -0
  54. package/dist/types/shared-ts/src/signing-lanes/execution.d.ts +2 -2
  55. package/dist/types/shared-ts/src/signing-lanes/recordParsers.d.ts +2 -1
  56. package/dist/types/shared-ts/src/signing-lanes/records.d.ts +10 -2
  57. package/dist/types/shared-ts/src/signing-lanes/rotation.d.ts +2 -2
  58. package/dist/types/shared-ts/src/threshold/sessionPolicy.d.ts +9 -0
  59. package/dist/types/shared-ts/src/utils/addWalletAuthMethod.d.ts +3 -3
  60. package/dist/types/shared-ts/src/utils/domainIds.d.ts +4 -5
  61. package/dist/types/shared-ts/src/utils/registrationIntent.d.ts +0 -1
  62. package/dist/types/shared-ts/src/utils/signerDomain.d.ts +3 -0
  63. package/dist/types/shared-ts/src/utils/walletAuthAuthority.d.ts +32 -2
  64. package/dist/types/shared-ts/src/utils/walletAuthMethodRecord.d.ts +15 -1
  65. package/dist/types/shared-ts/src/utils/walletCapabilityBindings.d.ts +20 -0
  66. package/dist/types/wallet-server/src/authorization/voiceIdDeviceProof.d.ts +29 -0
  67. package/dist/types/wallet-server/src/core/d1WalletAuthMethodStore.d.ts +13 -2
  68. package/dist/types/wallet-server/src/core/registrationContracts.d.ts +8 -0
  69. package/dist/types/wallet-server/src/core/signingLanes/WalletExecutionLaneProjection.d.ts +4 -0
  70. package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyEnvelopeStore.d.ts +4 -0
  71. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1VoiceIdActivation.d.ts +14 -0
  72. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1VoiceIdSessions.d.ts +19 -0
  73. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1VoiceIdWalletSessionChallenges.d.ts +26 -0
  74. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +1 -0
  75. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwner.d.ts +25 -0
  76. package/dist/types/wallet-server/src/router/domains/voiceId/voiceIdActivation.d.ts +29 -0
  77. package/dist/types/wallet-server/src/router/domains/voiceId/voiceIdSessions.d.ts +35 -0
  78. package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +3 -0
  79. package/dist/types/wallet-server/src/router/transport/fetch/routes/walletVoiceIdActivation.d.ts +12 -0
  80. package/dist/types/wallet-server/src/router/transport/fetch/routes/walletVoiceIdNear.d.ts +14 -0
  81. package/dist/types/wallet-server/src/router/transport/fetch/routes/walletVoiceIdSessions.d.ts +19 -0
  82. package/migrations/d1-signer/0083_voiceid_wallet_session_challenges.sql +29 -0
  83. package/migrations/d1-signer/0084_voiceid_wallet_auth_methods.sql +373 -0
  84. package/package.json +1 -1
@@ -5,7 +5,7 @@ distributed Seams Wallet SDK, server runtime, Wasm, strict Workers, and CLI.
5
5
  Dependency license expressions come from their package metadata. Packaged
6
6
  license and notice wording is reproduced below with normalized whitespace.
7
7
 
8
- Inventory: 450 dependency records (41 npm, 409 Cargo).
8
+ Inventory: 469 dependency records (60 npm, 409 Cargo).
9
9
 
10
10
  ## Dependency inventory
11
11
 
@@ -439,25 +439,44 @@ Inventory: 450 dependency records (41 npm, 409 Cargo).
439
439
  | npm | @peculiar/asn1-x509-attr | 2.6.0 | MIT | PeculiarVentures, LLC |
440
440
  | npm | @peculiar/asn1-x509 | 2.6.0 | MIT | PeculiarVentures, LLC |
441
441
  | npm | @peculiar/x509 | 1.14.3 | MIT | Miroshin Stepan<microshine@mail.ru>; Peculiar Ventures LLC |
442
+ | npm | @protobufjs/aspromise | 1.1.2 | BSD-3-Clause | Daniel Wirtz <dcode+protobufjs@dcode.io> |
443
+ | npm | @protobufjs/base64 | 1.1.2 | BSD-3-Clause | Daniel Wirtz <dcode+protobufjs@dcode.io> |
444
+ | npm | @protobufjs/codegen | 2.0.5 | BSD-3-Clause | Daniel Wirtz <dcode+protobufjs@dcode.io> |
445
+ | npm | @protobufjs/eventemitter | 1.1.1 | BSD-3-Clause | Daniel Wirtz <dcode+protobufjs@dcode.io> |
446
+ | npm | @protobufjs/fetch | 1.1.1 | BSD-3-Clause | Daniel Wirtz <dcode+protobufjs@dcode.io> |
447
+ | npm | @protobufjs/float | 1.0.2 | BSD-3-Clause | Daniel Wirtz <dcode+protobufjs@dcode.io> |
448
+ | npm | @protobufjs/path | 1.1.2 | BSD-3-Clause | Daniel Wirtz <dcode+protobufjs@dcode.io> |
449
+ | npm | @protobufjs/pool | 1.1.0 | BSD-3-Clause | Daniel Wirtz <dcode+protobufjs@dcode.io> |
450
+ | npm | @protobufjs/utf8 | 1.1.2 | BSD-3-Clause | Daniel Wirtz <dcode+protobufjs@dcode.io> |
442
451
  | npm | @scure/base | 1.2.6 | MIT | Paul Miller (https://paulmillr.com) |
443
452
  | npm | @scure/bip32 | 1.7.0 | MIT | Paul Miller (https://paulmillr.com) |
444
453
  | npm | @scure/bip39 | 1.6.0 | MIT | Paul Miller (https://paulmillr.com) |
445
454
  | npm | @simplewebauthn/server | 13.2.2 | MIT | Matthew Miller <matthew@millerti.me> |
455
+ | npm | @types/node | 24.2.0 | MIT | Alberto Schiabel; Andrew Makarov; Anna Henningsen; Benjamin Toueg; David Junger; Dmitry Semigradsky; ExE Boss; Ilia Baryshnikov; Junxiao Shi; Linus Unnebäck; Marcin Kopacz; Matteo Collina; Microsoft TypeScript; Mohsen Azimi; Nikita Galkin; NodeJS Contributors; Piotr Błażejewicz; René; Sebastian Silbermann; Trivikram Kamat; Victor Perin; Wilco Bakker; Yagiz Nizipli; wafuwafu13 |
446
456
  | npm | abitype | 1.2.3 | MIT | awkweb.eth <t@wevm.dev>; jxom.eth <j@wevm.dev> |
447
457
  | npm | asn1js | 3.0.7 | BSD-3-Clause | Ryan Hurst rmh@unmitigatedrisk.com; Yury Strozhevsky yury@strozhevsky.com |
448
458
  | npm | base-x | 5.0.1 | MIT | Daniel Cousens |
459
+ | npm | borsh | 1.0.0 | Apache-2.0 | Near Inc |
449
460
  | npm | bs58 | 6.0.0 | MIT | |
450
461
  | npm | eventemitter3 | 5.0.1 | MIT | Arnout Kazemier |
462
+ | npm | flatbuffers | 25.9.23 | Apache-2.0 | The FlatBuffers project |
463
+ | npm | guid-typescript | 1.0.9 | ISC | nicolas |
451
464
  | npm | idb | 8.0.3 | ISC | Jake Archibald |
452
465
  | npm | isows | 1.0.7 | MIT | |
466
+ | npm | long | 5.3.2 | Apache-2.0 | Daniel Wirtz <dcode@dcode.io> |
467
+ | npm | onnxruntime-common | 1.30.0 | MIT | fs-eire |
468
+ | npm | onnxruntime-web | 1.30.0 | MIT | fs-eire |
453
469
  | npm | ox | 0.12.1 | MIT | |
470
+ | npm | platform | 1.3.6 | MIT | Benjamin Tan <demoneaux@gmail.com>; John-David Dalton <john.david.dalton@gmail.com>; Mathias Bynens <mathias@qiwi.be> |
454
471
  | npm | preact | 10.29.8 | MIT | |
472
+ | npm | protobufjs | 7.6.6 | BSD-3-Clause | Daniel Wirtz <dcode+protobufjs@dcode.io> |
455
473
  | npm | pvtsutils | 1.3.6 | MIT | Miroshin Stepan<microshine@mail.ru>; PeculiarVentures |
456
474
  | npm | pvutils | 1.1.5 | MIT | Miroshin Stepan microshine@mail.ru; Ryan Hurst rmh@unmitigatedrisk.com; Yury Strozhevsky yury@strozhevsky.com |
457
475
  | npm | reflect-metadata | 0.2.2 | Apache-2.0 | Ron Buckton ron.buckton@microsoft.com |
458
476
  | npm | tslib | 1.14.1 | 0BSD | Microsoft Corp. |
459
477
  | npm | tslib | 2.8.1 | 0BSD | Microsoft Corp. |
460
478
  | npm | tsyringe | 4.10.0 | MIT | Steven Hobson-Campbell |
479
+ | npm | undici-types | 7.10.0 | MIT | Daniele Belardi; Ethan Arrowood; Matteo Collina; Matthew Aitken; Robert Nagy; Szymon Marczak; Tomas Della Vedova |
461
480
  | npm | viem | 2.46.0 | MIT | |
462
481
  | npm | voice-glow | 0.2.1 | MIT | Jakub Antalik |
463
482
  | npm | ws | 8.18.3 | MIT | Einar Otto Stangvik <einaros@gmail.com> (http://2x.io) |
@@ -479,6 +498,9 @@ but do not include a top-level license or notice file in the distributed package
479
498
  - cargo:rustls-platform-verifier-android@0.1.1 — MIT OR Apache-2.0
480
499
  - cargo:ts-rs-macros@12.0.1 — MIT
481
500
  - cargo:ts-rs@12.0.1 — MIT
501
+ - npm:guid-typescript@1.0.9 — ISC
502
+ - npm:onnxruntime-common@1.30.0 — MIT
503
+ - npm:onnxruntime-web@1.30.0 — MIT
482
504
 
483
505
  ## Packaged license and notice texts
484
506
 
@@ -1863,6 +1885,50 @@ Applies to:
1863
1885
  THE SOFTWARE.
1864
1886
 
1865
1887
 
1888
+ ### 1033ec013241782e
1889
+
1890
+ Packaged as: LICENSE
1891
+
1892
+ Applies to:
1893
+
1894
+ - npm:@protobufjs/aspromise@1.1.2
1895
+ - npm:@protobufjs/base64@1.1.2
1896
+ - npm:@protobufjs/codegen@2.0.5
1897
+ - npm:@protobufjs/eventemitter@1.1.1
1898
+ - npm:@protobufjs/fetch@1.1.1
1899
+ - npm:@protobufjs/float@1.0.2
1900
+ - npm:@protobufjs/path@1.1.2
1901
+ - npm:@protobufjs/pool@1.1.0
1902
+ - npm:@protobufjs/utf8@1.1.2
1903
+
1904
+ Copyright (c) 2016, Daniel Wirtz All rights reserved.
1905
+
1906
+ Redistribution and use in source and binary forms, with or without
1907
+ modification, are permitted provided that the following conditions are
1908
+ met:
1909
+
1910
+ * Redistributions of source code must retain the above copyright
1911
+ notice, this list of conditions and the following disclaimer.
1912
+ * Redistributions in binary form must reproduce the above copyright
1913
+ notice, this list of conditions and the following disclaimer in the
1914
+ documentation and/or other materials provided with the distribution.
1915
+ * Neither the name of its author, nor the names of its contributors
1916
+ may be used to endorse or promote products derived from this software
1917
+ without specific prior written permission.
1918
+
1919
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1920
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1921
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1922
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1923
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1924
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1925
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1926
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1927
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1928
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1929
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1930
+
1931
+
1866
1932
  ### 123a331b5dbf04c3
1867
1933
 
1868
1934
  Packaged as: LICENSE-MIT
@@ -2767,7 +2833,7 @@ Applies to:
2767
2833
 
2768
2834
  ### 23f18e03dc49df91
2769
2835
 
2770
- Packaged as: LICENSE, LICENSE-MIT
2836
+ Packaged as: LICENSE, LICENSE-MIT, LICENSE-MIT.txt
2771
2837
 
2772
2838
  Applies to:
2773
2839
 
@@ -2837,6 +2903,7 @@ Applies to:
2837
2903
  - cargo:zmij@1.0.21
2838
2904
  - cargo:zmij@1.0.23
2839
2905
  - npm:@near-js/types@2.4.0
2906
+ - npm:borsh@1.0.0
2840
2907
 
2841
2908
  Permission is hereby granted, free of charge, to any
2842
2909
  person obtaining a copy of this software and associated
@@ -5054,6 +5121,86 @@ Applies to:
5054
5121
  DEALINGS IN THE SOFTWARE.
5055
5122
 
5056
5123
 
5124
+ ### 49d6a1c9a623784c
5125
+
5126
+ Packaged as: LICENSE
5127
+
5128
+ Applies to:
5129
+
5130
+ - npm:protobufjs@7.6.6
5131
+
5132
+ This license applies to all parts of protobuf.js except those files
5133
+ either explicitly including or referencing a different license or
5134
+ located in a directory containing a different LICENSE file.
5135
+
5136
+ ---
5137
+
5138
+ Copyright (c) 2016, Daniel Wirtz All rights reserved.
5139
+
5140
+ Redistribution and use in source and binary forms, with or without
5141
+ modification, are permitted provided that the following conditions are
5142
+ met:
5143
+
5144
+ * Redistributions of source code must retain the above copyright
5145
+ notice, this list of conditions and the following disclaimer.
5146
+ * Redistributions in binary form must reproduce the above copyright
5147
+ notice, this list of conditions and the following disclaimer in the
5148
+ documentation and/or other materials provided with the distribution.
5149
+ * Neither the name of its author, nor the names of its contributors
5150
+ may be used to endorse or promote products derived from this software
5151
+ without specific prior written permission.
5152
+
5153
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
5154
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5155
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
5156
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
5157
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
5158
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
5159
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
5160
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
5161
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
5162
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
5163
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
5164
+
5165
+ ---
5166
+
5167
+ Code generated by the command line utilities is owned by the owner
5168
+ of the input file used when generating it. This code is not
5169
+ standalone and requires a support library to be linked with it. This
5170
+ support library is itself covered by the above license.
5171
+
5172
+
5173
+ ### 4a161ebed4f1ef93
5174
+
5175
+ Packaged as: LICENSE
5176
+
5177
+ Applies to:
5178
+
5179
+ - npm:platform@1.3.6
5180
+
5181
+ Copyright 2014-2020 Benjamin Tan
5182
+ Copyright 2011-2013 John-David Dalton
5183
+
5184
+ Permission is hereby granted, free of charge, to any person obtaining
5185
+ a copy of this software and associated documentation files (the
5186
+ "Software"), to deal in the Software without restriction, including
5187
+ without limitation the rights to use, copy, modify, merge, publish,
5188
+ distribute, sublicense, and/or sell copies of the Software, and to
5189
+ permit persons to whom the Software is furnished to do so, subject to
5190
+ the following conditions:
5191
+
5192
+ The above copyright notice and this permission notice shall be
5193
+ included in all copies or substantial portions of the Software.
5194
+
5195
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
5196
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
5197
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
5198
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
5199
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
5200
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
5201
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
5202
+
5203
+
5057
5204
  ### 4a883ecc3bb1010f
5058
5205
 
5059
5206
  Packaged as: LICENSE-MIT
@@ -7353,6 +7500,7 @@ Applies to:
7353
7500
  - cargo:borsh@1.6.1
7354
7501
  - cargo:borsh@1.8.0
7355
7502
  - cargo:borsh@1.8.1
7503
+ - npm:borsh@1.0.0
7356
7504
 
7357
7505
  Apache License
7358
7506
  Version 2.0, January 2004
@@ -10097,6 +10245,37 @@ Applies to:
10097
10245
  END OF TERMS AND CONDITIONS
10098
10246
 
10099
10247
 
10248
+ ### a6db8096b2707bc0
10249
+
10250
+ Packaged as: LICENSE
10251
+
10252
+ Applies to:
10253
+
10254
+ - npm:undici-types@7.10.0
10255
+
10256
+ MIT License
10257
+
10258
+ Copyright (c) Matteo Collina and Undici contributors
10259
+
10260
+ Permission is hereby granted, free of charge, to any person obtaining a copy
10261
+ of this software and associated documentation files (the "Software"), to deal
10262
+ in the Software without restriction, including without limitation the rights
10263
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10264
+ copies of the Software, and to permit persons to whom the Software is
10265
+ furnished to do so, subject to the following conditions:
10266
+
10267
+ The above copyright notice and this permission notice shall be included in all
10268
+ copies or substantial portions of the Software.
10269
+
10270
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
10271
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
10272
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
10273
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
10274
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
10275
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
10276
+ SOFTWARE.
10277
+
10278
+
10100
10279
  ### a825bd853ab71619
10101
10280
 
10102
10281
  Packaged as: LICENSE-MIT
@@ -11915,7 +12094,7 @@ Applies to:
11915
12094
 
11916
12095
  ### c2cfccb812fe4821
11917
12096
 
11918
- Packaged as: license-mit
12097
+ Packaged as: LICENSE, license-mit
11919
12098
 
11920
12099
  Applies to:
11921
12100
 
@@ -11931,6 +12110,7 @@ Applies to:
11931
12110
  - cargo:windows_x86_64_gnu@0.52.6
11932
12111
  - cargo:windows_x86_64_gnullvm@0.52.6
11933
12112
  - cargo:windows_x86_64_msvc@0.52.6
12113
+ - npm:@types/node@24.2.0
11934
12114
 
11935
12115
  MIT License
11936
12116
 
@@ -12444,7 +12624,7 @@ Applies to:
12444
12624
 
12445
12625
  ### cfc7749b96f63bd3
12446
12626
 
12447
- Packaged as: LICENSE-APACHE, LICENSE-APACHE.md, LICENSE-APACHE.txt
12627
+ Packaged as: LICENSE, LICENSE-APACHE, LICENSE-APACHE.md, LICENSE-APACHE.txt
12448
12628
 
12449
12629
  Applies to:
12450
12630
 
@@ -12461,6 +12641,8 @@ Applies to:
12461
12641
  - cargo:zeroize@1.9.0
12462
12642
  - cargo:zeroize_derive@1.4.3
12463
12643
  - cargo:zeroize_derive@1.5.0
12644
+ - npm:flatbuffers@25.9.23
12645
+ - npm:long@5.3.2
12464
12646
 
12465
12647
 
12466
12648
  Apache License
@@ -13586,5 +13768,3 @@ Applies to:
13586
13768
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
13587
13769
  IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
13588
13770
  DEALINGS IN THE SOFTWARE.
13589
-
13590
-
@@ -3,17 +3,17 @@
3
3
  "walletSecurityPolicy": "scoped_seals_and_owner_proofs_v1",
4
4
  "package": {
5
5
  "name": "@seams/wallet-server",
6
- "version": "0.22.0"
6
+ "version": "0.24.0"
7
7
  },
8
8
  "workers": {
9
9
  "router": {
10
10
  "entry": "cloudflare-router-ab/build/router/worker/shim.mjs",
11
- "fingerprint": "74fd3407337c12574566cad2d68e834cc62384a0afbeedf74c94820e9151b827",
11
+ "fingerprint": "6ddb5e651770db6620ea6c32e819ec2d342ea633f5eec2a4e7edcf055322c60f",
12
12
  "files": [
13
13
  {
14
14
  "path": "cloudflare-router-ab/build/router/build-stamp.json",
15
15
  "bytes": 119,
16
- "sha256": "b32b3d7182ed9c00a4d9677c35604e2ece2607a01032d49956df19a89850660f"
16
+ "sha256": "4263de73def4a3454ccd32cae1edf398be77c0ab96676236bd15b5affb745512"
17
17
  },
18
18
  {
19
19
  "path": "cloudflare-router-ab/build/router/index.js",
@@ -39,12 +39,12 @@
39
39
  },
40
40
  "deriver-a": {
41
41
  "entry": "cloudflare-router-ab/build/deriver-a/worker/shim.mjs",
42
- "fingerprint": "cd913ea58e44a8f91ec9e8bee6bb06372943e9eb519abb366fbf36bdf5b710fe",
42
+ "fingerprint": "da7b4be7de2cb4744e9bf926d7cc3d5e9cb0a4da71a574ed03e2cc5a63324abd",
43
43
  "files": [
44
44
  {
45
45
  "path": "cloudflare-router-ab/build/deriver-a/build-stamp.json",
46
46
  "bytes": 122,
47
- "sha256": "747923ca2224aa97fd46d6051dc1085a2e8f4f7da54d3b7190d4b674e6dd3c0a"
47
+ "sha256": "a2098d1915517951bc2bb8739503587b8f62a5282a9b72e9c68fa1c389732e70"
48
48
  },
49
49
  {
50
50
  "path": "cloudflare-router-ab/build/deriver-a/index.js",
@@ -70,12 +70,12 @@
70
70
  },
71
71
  "deriver-b": {
72
72
  "entry": "cloudflare-router-ab/build/deriver-b/worker/shim.mjs",
73
- "fingerprint": "92af4092ea8fe179e5fb1f9f945c51df56d7eedef04e14d6b4d629b1234c5246",
73
+ "fingerprint": "b8c7b108d8246adb0280e0fd465c047d86a5f6328e840963a1dc461918ab5f33",
74
74
  "files": [
75
75
  {
76
76
  "path": "cloudflare-router-ab/build/deriver-b/build-stamp.json",
77
77
  "bytes": 122,
78
- "sha256": "bff31f4d458314d638759bc92209b8ceca4a8eb5529f2380fc99456a5c979ef9"
78
+ "sha256": "258f61a014c49c0cfce17b15e188b3ba9d22643da0c1ae1d28092fbea3cce9e1"
79
79
  },
80
80
  {
81
81
  "path": "cloudflare-router-ab/build/deriver-b/index.js",
@@ -101,12 +101,12 @@
101
101
  },
102
102
  "signing-worker": {
103
103
  "entry": "cloudflare-router-ab/build/signing-worker/worker/shim.mjs",
104
- "fingerprint": "193f7af99585cabd0d9dc5266bd0df3fc0868869d7f9a91662f163a73f05e735",
104
+ "fingerprint": "565d10337fbe6468a3ea52d1974283fd469850946930dfc5c4d22279f5b86efd",
105
105
  "files": [
106
106
  {
107
107
  "path": "cloudflare-router-ab/build/signing-worker/build-stamp.json",
108
108
  "bytes": 127,
109
- "sha256": "8e4ce1fe79a9cdd6c3679d20f288ea37afeaa7c5b3937df936c0abf424e2c145"
109
+ "sha256": "04a4a9ba73c933fbb3ea406e5445005154afc7c8754f3a1f8c92b0acdacdad73"
110
110
  },
111
111
  {
112
112
  "path": "cloudflare-router-ab/build/signing-worker/index.js",
@@ -132,12 +132,12 @@
132
132
  },
133
133
  "tenant-root-control-plane": {
134
134
  "entry": "cloudflare-router-ab/build/tenant-root-control-plane/worker/shim.mjs",
135
- "fingerprint": "bcbca7dead054e5637575fa5935f819cc1eb8d5b9ac21d80d22e646a8f5941ed",
135
+ "fingerprint": "8efa3977d3148161d1c5e65f71e10339df1b46ec784215e626bf880296427d6a",
136
136
  "files": [
137
137
  {
138
138
  "path": "cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json",
139
139
  "bytes": 139,
140
- "sha256": "a8b459e0a878d51fade909dbaa4d825b2195a17af0c2e931c75244eef93121e4"
140
+ "sha256": "5c5188771e96f492b1141971e898979ad545304b429b66e99cddf0f26e65f25a"
141
141
  },
142
142
  {
143
143
  "path": "cloudflare-router-ab/build/tenant-root-control-plane/index.js",
@@ -165,8 +165,8 @@
165
165
  "migrations": {
166
166
  "signer": {
167
167
  "directory": "migrations/d1-signer",
168
- "head": "0082_wallet_signature_completions.sql",
169
- "fingerprint": "a886c91affebf67bf90a993165d65f9d70a8c5b0a0d876c6ab6e914f68f1fcb4",
168
+ "head": "0084_voiceid_wallet_auth_methods.sql",
169
+ "fingerprint": "724414d2bc4d41dd761541a0dc465145957275303a1c49610f1fbdc1e60c0316",
170
170
  "files": [
171
171
  {
172
172
  "path": "migrations/d1-signer/0001_signer_d1_initial.sql",
@@ -577,6 +577,16 @@
577
577
  "path": "migrations/d1-signer/0082_wallet_signature_completions.sql",
578
578
  "bytes": 1781,
579
579
  "sha256": "0b9372c31b650eee2b2dcb23396de327654cdc1b14fc51b460010ae656e39fc0"
580
+ },
581
+ {
582
+ "path": "migrations/d1-signer/0083_voiceid_wallet_session_challenges.sql",
583
+ "bytes": 1515,
584
+ "sha256": "ab2094d360b086944d8cb79bae3086993bdc2784e8e4ba4151d34dd5932cc3ec"
585
+ },
586
+ {
587
+ "path": "migrations/d1-signer/0084_voiceid_wallet_auth_methods.sql",
588
+ "bytes": 17185,
589
+ "sha256": "01af96f95131fb6ce8e42301bfdc2bd99ead260c817833b6b03a501f836d34a9"
580
590
  }
581
591
  ]
582
592
  },
@@ -1 +1 @@
1
- {"profile":"release","wallet_objects":true,"features":"strict-worker-deriver-a-entrypoint","started_at_ms":1792904733881}
1
+ {"profile":"release","wallet_objects":true,"features":"strict-worker-deriver-a-entrypoint","started_at_ms":1793078068083}
@@ -1 +1 @@
1
- {"profile":"release","wallet_objects":true,"features":"strict-worker-deriver-b-entrypoint","started_at_ms":1792904884404}
1
+ {"profile":"release","wallet_objects":true,"features":"strict-worker-deriver-b-entrypoint","started_at_ms":1793078249784}
@@ -1 +1 @@
1
- {"profile":"release","wallet_objects":true,"features":"strict-worker-router-entrypoint","started_at_ms":1792905019915}
1
+ {"profile":"release","wallet_objects":true,"features":"strict-worker-router-entrypoint","started_at_ms":1793078412480}
@@ -1 +1 @@
1
- {"profile":"release","wallet_objects":true,"features":"strict-worker-signing-worker-entrypoint","started_at_ms":1792904505860}
1
+ {"profile":"release","wallet_objects":true,"features":"strict-worker-signing-worker-entrypoint","started_at_ms":1793077790894}
@@ -1 +1 @@
1
- {"profile":"release","wallet_objects":false,"features":"strict-worker-tenant-root-control-plane-entrypoint","started_at_ms":1792905174415}
1
+ {"profile":"release","wallet_objects":false,"features":"strict-worker-tenant-root-control-plane-entrypoint","started_at_ms":1793078605175}
@@ -0,0 +1,32 @@
1
+ import { base64UrlDecode } from "../shared-ts/src/utils/base64.js";
2
+ import { sha256DigestB64u } from "../shared-ts/src/utils/canonicalPrimitives.js";
3
+ import { parseVoiceIdDeviceAssertion, voiceIdWalletSessionChallengeBytes } from "../shared-ts/src/authorization/voiceIdDeviceAssertion.js";
4
+ //#region src/authorization/voiceIdDeviceProof.ts
5
+ var VerifiedVoiceIdWalletSessionProof = class {
6
+ proofBrand = true;
7
+ constructor(challenge, deviceKeyId) {
8
+ this.challenge = challenge;
9
+ this.deviceKeyId = deviceKeyId;
10
+ this.proofBrand;
11
+ }
12
+ };
13
+ function sameChallenge(left, right) {
14
+ return left.kind === right.kind && left.walletId === right.walletId && left.walletAuthMethodId === right.walletAuthMethodId && left.walletAuthorityId === right.walletAuthorityId && left.deviceKeyId === right.deviceKeyId && left.challengeId === right.challengeId && left.nonce === right.nonce && left.requestOrigin === right.requestOrigin && left.audience === right.audience && left.issuedAtMs === right.issuedAtMs && left.expiresAtMs === right.expiresAtMs;
15
+ }
16
+ /** Only this server boundary turns a signed device result into verified proof. */
17
+ async function verifyVoiceIdWalletSessionAssertion(input) {
18
+ const challenge = input.expectedChallenge;
19
+ if (!Number.isSafeInteger(input.nowMs) || input.nowMs < challenge.issuedAtMs - 5e3 || input.nowMs >= challenge.expiresAtMs || challenge.walletId !== input.registered.walletId || challenge.walletAuthMethodId !== input.registered.walletAuthMethodId || challenge.walletAuthorityId !== input.registered.walletAuthorityId || challenge.deviceKeyId !== input.registered.deviceKeyId) throw new Error("VoiceID Wallet Session challenge is unavailable");
20
+ const assertion = parseVoiceIdDeviceAssertion(input.assertion);
21
+ if (!sameChallenge(assertion.challenge, challenge)) throw new Error("VoiceID assertion names a different challenge");
22
+ const publicKeyBytes = base64UrlDecode(input.registered.publicKeyB64u);
23
+ if (await sha256DigestB64u(publicKeyBytes) !== input.registered.deviceKeyId) throw new Error("VoiceID device key identity is invalid");
24
+ const publicKey = await crypto.subtle.importKey("raw", publicKeyBytes, "Ed25519", false, ["verify"]);
25
+ if (!await crypto.subtle.verify("Ed25519", publicKey, base64UrlDecode(assertion.signatureB64u), voiceIdWalletSessionChallengeBytes(challenge))) throw new Error("VoiceID device signature is invalid");
26
+ if (!await input.consumeChallenge(challenge, input.nowMs)) throw new Error("VoiceID challenge was already consumed");
27
+ return new VerifiedVoiceIdWalletSessionProof(challenge, input.registered.deviceKeyId);
28
+ }
29
+ //#endregion
30
+ export { verifyVoiceIdWalletSessionAssertion };
31
+
32
+ //# sourceMappingURL=voiceIdDeviceProof.js.map
@@ -1,9 +1,11 @@
1
1
  import { parseWebAuthnRpId } from "../../shared-ts/src/utils/domainIds.js";
2
2
  import { normalizeOptionalString } from "../../shared-ts/src/utils/normalize.js";
3
3
  import { isPlainObject } from "../../shared-ts/src/utils/validation.js";
4
+ import { rejectUnknownFields } from "../../shared-ts/src/utils/exactRecord.js";
4
5
  import { base64UrlDecode } from "../../shared-ts/src/utils/base64.js";
6
+ import { parseDigestB64u } from "../../shared-ts/src/utils/canonicalPrimitives.js";
5
7
  import "../../shared-ts/src/utils/encoders.js";
6
- import { isEmailOtpWalletAuthAuthority, isPasskeyWalletAuthAuthority } from "../../shared-ts/src/utils/walletAuthAuthority.js";
8
+ import { isEmailOtpWalletAuthAuthority, isPasskeyWalletAuthAuthority, isVoiceIdWalletAuthAuthority } from "../../shared-ts/src/utils/walletAuthAuthority.js";
7
9
  //#region src/core/ThresholdService/validation.ts
8
10
  function decodeFixedB64u(value, expectedLength) {
9
11
  try {
@@ -41,6 +43,15 @@ function parseThresholdEd25519AuthorityScope(raw) {
41
43
  if (!isPlainObject(raw)) return null;
42
44
  const kind = normalizeOptionalString(raw.kind);
43
45
  switch (kind) {
46
+ case "voiceid": try {
47
+ rejectUnknownFields(raw, ["kind", "deviceKeyId"], "device authority scope");
48
+ return {
49
+ kind: "voiceid",
50
+ deviceKeyId: parseDigestB64u(raw.deviceKeyId)
51
+ };
52
+ } catch {
53
+ return null;
54
+ }
44
55
  case "passkey_rp": {
45
56
  const rpId = parseWebAuthnRpId(raw.rpId);
46
57
  if (!rpId.ok || normalizeOptionalString(raw.proofKind) || normalizeOptionalString(raw.email) || normalizeOptionalString(raw.provider) || normalizeOptionalString(raw.providerUserId) || normalizeOptionalString(raw.challengeId) || normalizeOptionalString(raw.googleEmailOtpRegistrationAttemptId) || normalizeOptionalString(raw.googleEmailOtpRegistrationOfferId) || normalizeOptionalString(raw.googleEmailOtpRegistrationCandidateId)) return null;
@@ -73,11 +84,16 @@ function thresholdEd25519AuthorityScopeFromWalletAuthAuthority(authority) {
73
84
  provider: authority.factor.provider,
74
85
  providerUserId: authority.factor.providerUserId
75
86
  };
87
+ if (isVoiceIdWalletAuthAuthority(authority)) return {
88
+ kind: "voiceid",
89
+ deviceKeyId: authority.factor.deviceKeyId
90
+ };
76
91
  throw new Error("[threshold-ed25519] unsupported wallet auth authority");
77
92
  }
78
93
  function thresholdEd25519AuthorityScopesMatch(left, right) {
79
94
  if (left.kind !== right.kind) return false;
80
95
  switch (left.kind) {
96
+ case "voiceid": return right.kind === "voiceid" && left.deviceKeyId === right.deviceKeyId;
81
97
  case "passkey_rp": return right.kind === "passkey_rp" && left.rpId === right.rpId;
82
98
  case "email_otp": return right.kind === "email_otp" && left.provider === right.provider && left.providerUserId === right.providerUserId;
83
99
  }
@@ -143,6 +143,8 @@ const WALLET_AUTH_METHOD_STORE_D1_SCHEMA_V2_SQL = Object.freeze([
143
143
  updated_at_ms INTEGER NOT NULL,
144
144
  activated_at_ms INTEGER,
145
145
  revoked_at_ms INTEGER,
146
+ provider TEXT,
147
+ provider_user_id TEXT,
146
148
  PRIMARY KEY (namespace, org_id, project_id, env_id, wallet_auth_method_id),
147
149
  FOREIGN KEY (
148
150
  namespace,
@@ -159,7 +161,7 @@ const WALLET_AUTH_METHOD_STORE_D1_SCHEMA_V2_SQL = Object.freeze([
159
161
  ),
160
162
  CHECK (length(wallet_id) > 0),
161
163
  CHECK (length(wallet_authority_id) > 0),
162
- CHECK (kind IN ('passkey', 'email_otp')),
164
+ CHECK (kind IN ('passkey', 'email_otp', 'voiceid')),
163
165
  CHECK (status IN ('pending_local_install', 'active', 'revoked')),
164
166
  CHECK (length(wallet_auth_method_id) > 0),
165
167
  CHECK (length(auth_identifier_key) > 0),
@@ -193,6 +195,18 @@ const WALLET_AUTH_METHOD_STORE_D1_SCHEMA_V2_SQL = Object.freeze([
193
195
  AND registration_authority_id IS NOT NULL
194
196
  AND length(registration_authority_id) > 0
195
197
  AND auth_identifier_key = email_hash_hex)
198
+ OR
199
+ (kind = 'voiceid'
200
+ AND rp_id = ''
201
+ AND credential_id_b64u IS NULL
202
+ AND credential_public_key_b64u IS NOT NULL
203
+ AND length(credential_public_key_b64u) = 43
204
+ AND email_hash_hex IS NULL
205
+ AND registration_authority_id IS NULL
206
+ AND provider IS NULL
207
+ AND provider_user_id IS NULL
208
+ AND length(auth_identifier_key) = 43
209
+ AND COALESCE(auth_identifier_key = json_extract(record_json, '$.deviceKeyId'), 0))
196
210
  ),
197
211
  CHECK (json_extract(record_json, '$.version') = 'wallet_auth_method_v2'),
198
212
  CHECK (json_extract(record_json, '$.walletAuthMethodId') = wallet_auth_method_id),
@@ -212,6 +226,10 @@ const WALLET_AUTH_METHOD_STORE_D1_SCHEMA_V2_SQL = Object.freeze([
212
226
  (kind = 'email_otp'
213
227
  AND json_extract(record_json, '$.emailHashHex') = email_hash_hex
214
228
  AND json_extract(record_json, '$.registrationAuthorityId') = registration_authority_id)
229
+ OR
230
+ (kind = 'voiceid'
231
+ AND COALESCE(json_extract(record_json, '$.deviceKeyId') = auth_identifier_key, 0)
232
+ AND COALESCE(json_extract(record_json, '$.devicePublicKeyB64u') = credential_public_key_b64u, 0))
215
233
  )
216
234
  )
217
235
  `,
@@ -226,6 +244,13 @@ const WALLET_AUTH_METHOD_STORE_D1_SCHEMA_V2_SQL = Object.freeze([
226
244
  wallet_authority_id,
227
245
  status
228
246
  )
247
+ `,
248
+ `
249
+ CREATE UNIQUE INDEX IF NOT EXISTS wallet_auth_methods_v2_voiceid_key_uidx
250
+ ON wallet_auth_methods (
251
+ namespace, org_id, project_id, env_id, auth_identifier_key
252
+ )
253
+ WHERE kind = 'voiceid'
229
254
  `,
230
255
  `
231
256
  CREATE UNIQUE INDEX IF NOT EXISTS wallet_auth_methods_v2_passkey_uidx
@@ -322,6 +347,16 @@ function bindWalletAuthMethodIdentityV2(record) {
322
347
  activatedAtMs: record.status === "pending_local_install" ? null : record.activatedAtMs,
323
348
  revokedAtMs: record.status === "revoked" ? record.revokedAtMs : null
324
349
  };
350
+ case "voiceid": return {
351
+ rpId: "",
352
+ authIdentifierKey: record.deviceKeyId,
353
+ credentialIdB64u: null,
354
+ credentialPublicKeyB64u: record.devicePublicKeyB64u,
355
+ emailHashHex: null,
356
+ registrationAuthorityId: null,
357
+ activatedAtMs: record.status === "pending_local_install" ? null : record.activatedAtMs,
358
+ revokedAtMs: record.status === "revoked" ? record.revokedAtMs : null
359
+ };
325
360
  }
326
361
  }
327
362
  function walletAuthMethodV2IdentityColumns(record) {
@@ -646,6 +681,12 @@ var D1WalletAuthMethodStore = class {
646
681
  await this.v2Schema.ensure();
647
682
  return normalizeWalletAuthMethodV2(await readD1WalletAuthMethodJsonById(this.table.database, this.table.scope, String(input.walletAuthMethodId)));
648
683
  }
684
+ /** Checks the method record. Session issuance must also check its parent authority. */
685
+ async getActiveVoiceIdV2(input) {
686
+ const record = await this.readByIdV2({ walletAuthMethodId: input.walletAuthMethodId });
687
+ if (!record || record.kind !== "voiceid" || record.status !== "active" || record.walletId !== input.walletId || record.walletAuthorityId !== input.walletAuthorityId) return null;
688
+ return record;
689
+ }
649
690
  async getPasskeyV2(input) {
650
691
  await this.v2Schema.ensure();
651
692
  const rpId = normalizeOptionalTrimmedString(input.rpId);
@@ -185,6 +185,11 @@ async function credentialMetadataV1(credentials, walletId, authMethod) {
185
185
  kind: "email_otp",
186
186
  walletAuthMethodId: authMethod.walletAuthMethodId
187
187
  };
188
+ if (authMethod.kind === "voiceid") return {
189
+ kind: "voiceid",
190
+ walletAuthMethodId: authMethod.walletAuthMethodId,
191
+ deviceKeyId: authMethod.deviceKeyId
192
+ };
188
193
  const device = await credentials.readPasskeyDeviceInfoV1({
189
194
  walletId,
190
195
  credentialIdB64u: authMethod.credentialIdB64u
@@ -6,12 +6,12 @@ import { parseEd25519PublicKeyB64u, parseKeyCreationSignerSlot, parseSecp256k1Co
6
6
  import { base58Encode } from "../../shared-ts/src/utils/base58.js";
7
7
  import { routerAbMpcMaterialActivationRefFromWire, sameRouterAbMpcMaterialActivationRef } from "../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
8
8
  import { deriveEvmFamilySigningKeySlotId } from "../../shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.js";
9
- import { walletAuthAuthorityRef } from "../../shared-ts/src/utils/walletAuthAuthority.js";
9
+ import { buildVoiceIdWalletAuthAuthority, walletAuthAuthorityRef } from "../../shared-ts/src/utils/walletAuthAuthority.js";
10
10
  import { sameRouterAbEcdsaDerivationPublicCapabilityV1, sameRouterAbEcdsaDerivationPublicIdentityV1, sameRouterAbEcdsaRegistrationActivationReceiptV1, sameRouterAbServerIdentityV1 } from "../../shared-ts/src/utils/routerAbEcdsaDerivation.js";
11
11
  import { parseNearEd25519SigningKeyId } from "../../shared-ts/src/utils/registrationIds.js";
12
12
  import { buildOwnerLaneParticipantContinuityV1, computeOwnerLaneParticipantBindingDigestV1, parseWalletSignerId } from "../../shared-ts/src/signing-lanes/ownerContinuity.js";
13
13
  import "../../shared-ts/src/signing-lanes/index.js";
14
- import { buildActiveSigningLaneLifecycle, buildActiveWalletKeyLifecycle, buildEd25519WalletKeyRecord, buildEvmFamilyWalletKeyRecord, buildOwnerEmailOtpSigningLaneRecord, buildOwnerPasskeySigningLaneRecord, parseWalletKeyVersion } from "../../shared-ts/src/signing-lanes/recordParsers.js";
14
+ import { buildActiveSigningLaneLifecycle, buildActiveWalletKeyLifecycle, buildEd25519WalletKeyRecord, buildEvmFamilyWalletKeyRecord, buildOwnerEmailOtpSigningLaneRecord, buildOwnerPasskeySigningLaneRecord, buildOwnerVoiceIdSigningLaneRecord, parseWalletKeyVersion } from "../../shared-ts/src/signing-lanes/recordParsers.js";
15
15
  //#region src/core/signingLanes/WalletExecutionLaneProjection.ts
16
16
  const SOURCE_IDENTITY_DOMAIN = "seams/wallet-execution-lane/source-identity/v1";
17
17
  const ED25519_RECEIPT_DOMAIN = "seams/wallet-execution-lane/ed25519-receipt/v1";
@@ -191,6 +191,7 @@ async function buildOwnerLane(input) {
191
191
  switch (input.authMethod.kind) {
192
192
  case "passkey": return buildOwnerPasskeySigningLaneRecord(base);
193
193
  case "email_otp": return buildOwnerEmailOtpSigningLaneRecord(base);
194
+ case "voiceid": return buildOwnerVoiceIdSigningLaneRecord(base);
194
195
  }
195
196
  }
196
197
  async function ownerContinuity(input) {
@@ -270,6 +271,14 @@ function walletAuthorityForAuthMethod(authMethod, authSource) {
270
271
  bindingId: authMethod.walletAuthMethodId
271
272
  };
272
273
  }
274
+ if (authMethod.kind === "voiceid") {
275
+ if (authSource.kind !== "voiceid" || authSource.deviceKeyId !== authMethod.deviceKeyId) return null;
276
+ return buildVoiceIdWalletAuthAuthority({
277
+ walletId: authMethod.walletId,
278
+ walletAuthMethodId: authMethod.walletAuthMethodId,
279
+ deviceKeyId: authMethod.deviceKeyId
280
+ });
281
+ }
273
282
  if (authSource.kind !== "oidc_provider") return null;
274
283
  const providerUserId = parseEmailOtpProviderUserId(authSource.providerSubject);
275
284
  if (!providerUserId.ok) return null;