@seams/wallet-server 0.23.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 +182 -5
  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: 451 dependency records (42 npm, 409 Cargo).
8
+ Inventory: 469 dependency records (60 npm, 409 Cargo).
9
9
 
10
10
  ## Dependency inventory
11
11
 
@@ -439,26 +439,44 @@ Inventory: 451 dependency records (42 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 |
449
459
  | npm | borsh | 1.0.0 | Apache-2.0 | Near Inc |
450
460
  | npm | bs58 | 6.0.0 | MIT | |
451
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 |
452
464
  | npm | idb | 8.0.3 | ISC | Jake Archibald |
453
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 |
454
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> |
455
471
  | npm | preact | 10.29.8 | MIT | |
472
+ | npm | protobufjs | 7.6.6 | BSD-3-Clause | Daniel Wirtz <dcode+protobufjs@dcode.io> |
456
473
  | npm | pvtsutils | 1.3.6 | MIT | Miroshin Stepan<microshine@mail.ru>; PeculiarVentures |
457
474
  | npm | pvutils | 1.1.5 | MIT | Miroshin Stepan microshine@mail.ru; Ryan Hurst rmh@unmitigatedrisk.com; Yury Strozhevsky yury@strozhevsky.com |
458
475
  | npm | reflect-metadata | 0.2.2 | Apache-2.0 | Ron Buckton ron.buckton@microsoft.com |
459
476
  | npm | tslib | 1.14.1 | 0BSD | Microsoft Corp. |
460
477
  | npm | tslib | 2.8.1 | 0BSD | Microsoft Corp. |
461
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 |
462
480
  | npm | viem | 2.46.0 | MIT | |
463
481
  | npm | voice-glow | 0.2.1 | MIT | Jakub Antalik |
464
482
  | npm | ws | 8.18.3 | MIT | Einar Otto Stangvik <einaros@gmail.com> (http://2x.io) |
@@ -480,6 +498,9 @@ but do not include a top-level license or notice file in the distributed package
480
498
  - cargo:rustls-platform-verifier-android@0.1.1 — MIT OR Apache-2.0
481
499
  - cargo:ts-rs-macros@12.0.1 — MIT
482
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
483
504
 
484
505
  ## Packaged license and notice texts
485
506
 
@@ -1864,6 +1885,50 @@ Applies to:
1864
1885
  THE SOFTWARE.
1865
1886
 
1866
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
+
1867
1932
  ### 123a331b5dbf04c3
1868
1933
 
1869
1934
  Packaged as: LICENSE-MIT
@@ -5056,6 +5121,86 @@ Applies to:
5056
5121
  DEALINGS IN THE SOFTWARE.
5057
5122
 
5058
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
+
5059
5204
  ### 4a883ecc3bb1010f
5060
5205
 
5061
5206
  Packaged as: LICENSE-MIT
@@ -10100,6 +10245,37 @@ Applies to:
10100
10245
  END OF TERMS AND CONDITIONS
10101
10246
 
10102
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
+
10103
10279
  ### a825bd853ab71619
10104
10280
 
10105
10281
  Packaged as: LICENSE-MIT
@@ -11918,7 +12094,7 @@ Applies to:
11918
12094
 
11919
12095
  ### c2cfccb812fe4821
11920
12096
 
11921
- Packaged as: license-mit
12097
+ Packaged as: LICENSE, license-mit
11922
12098
 
11923
12099
  Applies to:
11924
12100
 
@@ -11934,6 +12110,7 @@ Applies to:
11934
12110
  - cargo:windows_x86_64_gnu@0.52.6
11935
12111
  - cargo:windows_x86_64_gnullvm@0.52.6
11936
12112
  - cargo:windows_x86_64_msvc@0.52.6
12113
+ - npm:@types/node@24.2.0
11937
12114
 
11938
12115
  MIT License
11939
12116
 
@@ -12447,7 +12624,7 @@ Applies to:
12447
12624
 
12448
12625
  ### cfc7749b96f63bd3
12449
12626
 
12450
- Packaged as: LICENSE-APACHE, LICENSE-APACHE.md, LICENSE-APACHE.txt
12627
+ Packaged as: LICENSE, LICENSE-APACHE, LICENSE-APACHE.md, LICENSE-APACHE.txt
12451
12628
 
12452
12629
  Applies to:
12453
12630
 
@@ -12464,6 +12641,8 @@ Applies to:
12464
12641
  - cargo:zeroize@1.9.0
12465
12642
  - cargo:zeroize_derive@1.4.3
12466
12643
  - cargo:zeroize_derive@1.5.0
12644
+ - npm:flatbuffers@25.9.23
12645
+ - npm:long@5.3.2
12467
12646
 
12468
12647
 
12469
12648
  Apache License
@@ -13589,5 +13768,3 @@ Applies to:
13589
13768
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
13590
13769
  IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
13591
13770
  DEALINGS IN THE SOFTWARE.
13592
-
13593
-
@@ -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.23.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": "16d69ea116b33d19df58a2ea30d0fe59277bfe07b856986b576e45f983f81515",
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": "bdd9dc10a334a0733d8e973a127a49f06a5513f28959874239354ef3727411ed"
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": "4e9035611a026dacf58afd85fc245fdcd1803c4dc66d1dceb568430857992279",
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": "855ad07fa9c2d03db626e064bc9393fa684f5deda016eda7a1dc1bff2cec4c95"
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": "703f4d5d38c2f7fee97a8718e4cc210fd7717fed03fa0689e2845679798104c8",
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": "6b18f22e35eb238db007c34f0583e0931f7f10760f2aa39254ce1c5cfa5673c9"
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": "6e63cf05a9d08e8931d281d854eabecd7af6b92bf14cd00db241b3e5b5190222",
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": "891e92be77c5591a57d9f33dab4cfe0d044f8370e5a14c2c4ba5af8169d81b8d"
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": "980fbb6afc822438491809374d9aad90120602b9a432137d30e763aee9361f1d",
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": "d233922e8336065c6184d083c1f68dba56e4a6296ab3e3f45553f202b089da1b"
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":1793011431381}
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":1793011576933}
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":1793011707465}
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":1793011221295}
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":1793011841902}
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;