@drakkar.software/octobot-client 0.4.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.
- package/README.md +140 -0
- package/dist/client/adapters/accounts.d.ts +66 -0
- package/dist/client/adapters/accounts.d.ts.map +1 -0
- package/dist/client/adapters/accounts.js +214 -0
- package/dist/client/adapters/accounts.js.map +1 -0
- package/dist/client/adapters/actionHandle.d.ts +29 -0
- package/dist/client/adapters/actionHandle.d.ts.map +1 -0
- package/dist/client/adapters/actionHandle.js +34 -0
- package/dist/client/adapters/actionHandle.js.map +1 -0
- package/dist/client/adapters/automations.d.ts +31 -0
- package/dist/client/adapters/automations.d.ts.map +1 -0
- package/dist/client/adapters/automations.js +79 -0
- package/dist/client/adapters/automations.js.map +1 -0
- package/dist/client/adapters/documents.d.ts +55 -0
- package/dist/client/adapters/documents.d.ts.map +1 -0
- package/dist/client/adapters/documents.js +66 -0
- package/dist/client/adapters/documents.js.map +1 -0
- package/dist/client/adapters/nodeApi.d.ts +25 -0
- package/dist/client/adapters/nodeApi.d.ts.map +1 -0
- package/dist/client/adapters/nodeApi.js +81 -0
- package/dist/client/adapters/nodeApi.js.map +1 -0
- package/dist/client/adapters/settings.d.ts +16 -0
- package/dist/client/adapters/settings.d.ts.map +1 -0
- package/dist/client/adapters/settings.js +43 -0
- package/dist/client/adapters/settings.js.map +1 -0
- package/dist/client/adapters/strategies.d.ts +17 -0
- package/dist/client/adapters/strategies.d.ts.map +1 -0
- package/dist/client/adapters/strategies.js +75 -0
- package/dist/client/adapters/strategies.js.map +1 -0
- package/dist/client/connect/connect.d.ts +40 -0
- package/dist/client/connect/connect.d.ts.map +1 -0
- package/dist/client/connect/connect.js +133 -0
- package/dist/client/connect/connect.js.map +1 -0
- package/dist/client/connect/readOnly.d.ts +97 -0
- package/dist/client/connect/readOnly.d.ts.map +1 -0
- package/dist/client/connect/readOnly.js +167 -0
- package/dist/client/connect/readOnly.js.map +1 -0
- package/dist/client/core/errors.d.ts +80 -0
- package/dist/client/core/errors.d.ts.map +1 -0
- package/dist/client/core/errors.js +154 -0
- package/dist/client/core/errors.js.map +1 -0
- package/dist/client/core/options.d.ts +44 -0
- package/dist/client/core/options.d.ts.map +1 -0
- package/dist/client/core/options.js +2 -0
- package/dist/client/core/options.js.map +1 -0
- package/dist/client/core/session.d.ts +90 -0
- package/dist/client/core/session.d.ts.map +1 -0
- package/dist/client/core/session.js +72 -0
- package/dist/client/core/session.js.map +1 -0
- package/dist/client/core/views.d.ts +40 -0
- package/dist/client/core/views.d.ts.map +1 -0
- package/dist/client/core/views.js +32 -0
- package/dist/client/core/views.js.map +1 -0
- package/dist/client/index.d.ts +16 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +9 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/mirror/collections.d.ts +125 -0
- package/dist/client/mirror/collections.d.ts.map +1 -0
- package/dist/client/mirror/collections.js +118 -0
- package/dist/client/mirror/collections.js.map +1 -0
- package/dist/client/mirror/index.d.ts +4 -0
- package/dist/client/mirror/index.d.ts.map +1 -0
- package/dist/client/mirror/index.js +4 -0
- package/dist/client/mirror/index.js.map +1 -0
- package/dist/client/mirror/writer.d.ts +39 -0
- package/dist/client/mirror/writer.d.ts.map +1 -0
- package/dist/client/mirror/writer.js +50 -0
- package/dist/client/mirror/writer.js.map +1 -0
- package/dist/client/pairing/mirrorGrant.d.ts +91 -0
- package/dist/client/pairing/mirrorGrant.d.ts.map +1 -0
- package/dist/client/pairing/mirrorGrant.js +99 -0
- package/dist/client/pairing/mirrorGrant.js.map +1 -0
- package/dist/client/pairing/mirrorReader.d.ts +99 -0
- package/dist/client/pairing/mirrorReader.d.ts.map +1 -0
- package/dist/client/pairing/mirrorReader.js +117 -0
- package/dist/client/pairing/mirrorReader.js.map +1 -0
- package/dist/client/pairing/pairingGrantExchange.d.ts +135 -0
- package/dist/client/pairing/pairingGrantExchange.d.ts.map +1 -0
- package/dist/client/pairing/pairingGrantExchange.js +186 -0
- package/dist/client/pairing/pairingGrantExchange.js.map +1 -0
- package/dist/client/pairing/pairingRequest.d.ts +82 -0
- package/dist/client/pairing/pairingRequest.d.ts.map +1 -0
- package/dist/client/pairing/pairingRequest.js +120 -0
- package/dist/client/pairing/pairingRequest.js.map +1 -0
- package/dist/client/strategy.d.ts +36 -0
- package/dist/client/strategy.d.ts.map +1 -0
- package/dist/client/strategy.js +26 -0
- package/dist/client/strategy.js.map +1 -0
- package/dist/collections/index.d.ts +3 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +3 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/nodeCollections.d.ts +57 -0
- package/dist/collections/nodeCollections.d.ts.map +1 -0
- package/dist/collections/nodeCollections.js +40 -0
- package/dist/collections/nodeCollections.js.map +1 -0
- package/dist/collections/paths.d.ts +7 -0
- package/dist/collections/paths.d.ts.map +1 -0
- package/dist/collections/paths.js +13 -0
- package/dist/collections/paths.js.map +1 -0
- package/dist/crypto/collectionKeys.d.ts +28 -0
- package/dist/crypto/collectionKeys.d.ts.map +1 -0
- package/dist/crypto/collectionKeys.js +53 -0
- package/dist/crypto/collectionKeys.js.map +1 -0
- package/dist/crypto/hkdf.d.ts +14 -0
- package/dist/crypto/hkdf.d.ts.map +1 -0
- package/dist/crypto/hkdf.js +19 -0
- package/dist/crypto/hkdf.js.map +1 -0
- package/dist/crypto/index.d.ts +5 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +5 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/secretEncryptor.d.ts +20 -0
- package/dist/crypto/secretEncryptor.d.ts.map +1 -0
- package/dist/crypto/secretEncryptor.js +82 -0
- package/dist/crypto/secretEncryptor.js.map +1 -0
- package/dist/crypto/wireConstants.d.ts +14 -0
- package/dist/crypto/wireConstants.d.ts.map +1 -0
- package/dist/crypto/wireConstants.js +17 -0
- package/dist/crypto/wireConstants.js.map +1 -0
- package/dist/identity/address.d.ts +3 -0
- package/dist/identity/address.d.ts.map +1 -0
- package/dist/identity/address.js +17 -0
- package/dist/identity/address.js.map +1 -0
- package/dist/identity/bip39-wordlist.d.ts +2 -0
- package/dist/identity/bip39-wordlist.d.ts.map +1 -0
- package/dist/identity/bip39-wordlist.js +2051 -0
- package/dist/identity/bip39-wordlist.js.map +1 -0
- package/dist/identity/capProvider.d.ts +45 -0
- package/dist/identity/capProvider.d.ts.map +1 -0
- package/dist/identity/capProvider.js +80 -0
- package/dist/identity/capProvider.js.map +1 -0
- package/dist/identity/derivationSchemes.d.ts +25 -0
- package/dist/identity/derivationSchemes.d.ts.map +1 -0
- package/dist/identity/derivationSchemes.js +34 -0
- package/dist/identity/derivationSchemes.js.map +1 -0
- package/dist/identity/evm.d.ts +8 -0
- package/dist/identity/evm.d.ts.map +1 -0
- package/dist/identity/evm.js +78 -0
- package/dist/identity/evm.js.map +1 -0
- package/dist/identity/index.d.ts +10 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +10 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/keys.d.ts +17 -0
- package/dist/identity/keys.d.ts.map +1 -0
- package/dist/identity/keys.js +36 -0
- package/dist/identity/keys.js.map +1 -0
- package/dist/identity/mnemonic.d.ts +4 -0
- package/dist/identity/mnemonic.d.ts.map +1 -0
- package/dist/identity/mnemonic.js +93 -0
- package/dist/identity/mnemonic.js.map +1 -0
- package/dist/identity/pairing.d.ts +45 -0
- package/dist/identity/pairing.d.ts.map +1 -0
- package/dist/identity/pairing.js +91 -0
- package/dist/identity/pairing.js.map +1 -0
- package/dist/identity/pairingRequest.d.ts +99 -0
- package/dist/identity/pairingRequest.d.ts.map +1 -0
- package/dist/identity/pairingRequest.js +217 -0
- package/dist/identity/pairingRequest.js.map +1 -0
- package/dist/identity/secret.d.ts +32 -0
- package/dist/identity/secret.d.ts.map +1 -0
- package/dist/identity/secret.js +54 -0
- package/dist/identity/secret.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/bytes.d.ts +11 -0
- package/dist/internal/bytes.d.ts.map +1 -0
- package/dist/internal/bytes.js +38 -0
- package/dist/internal/bytes.js.map +1 -0
- package/dist/node-api/dexPair.d.ts +24 -0
- package/dist/node-api/dexPair.d.ts.map +1 -0
- package/dist/node-api/dexPair.js +39 -0
- package/dist/node-api/dexPair.js.map +1 -0
- package/dist/node-api/dsl.d.ts +10 -0
- package/dist/node-api/dsl.d.ts.map +1 -0
- package/dist/node-api/dsl.js +7 -0
- package/dist/node-api/dsl.js.map +1 -0
- package/dist/node-api/exchanges.d.ts +49 -0
- package/dist/node-api/exchanges.d.ts.map +1 -0
- package/dist/node-api/exchanges.js +32 -0
- package/dist/node-api/exchanges.js.map +1 -0
- package/dist/node-api/index.d.ts +12 -0
- package/dist/node-api/index.d.ts.map +1 -0
- package/dist/node-api/index.js +12 -0
- package/dist/node-api/index.js.map +1 -0
- package/dist/node-api/marketMaking.d.ts +39 -0
- package/dist/node-api/marketMaking.d.ts.map +1 -0
- package/dist/node-api/marketMaking.js +44 -0
- package/dist/node-api/marketMaking.js.map +1 -0
- package/dist/node-api/octobots.d.ts +14 -0
- package/dist/node-api/octobots.d.ts.map +1 -0
- package/dist/node-api/octobots.js +16 -0
- package/dist/node-api/octobots.js.map +1 -0
- package/dist/node-api/orderBookPreview.d.ts +11 -0
- package/dist/node-api/orderBookPreview.d.ts.map +1 -0
- package/dist/node-api/orderBookPreview.js +7 -0
- package/dist/node-api/orderBookPreview.js.map +1 -0
- package/dist/node-api/pairing.d.ts +39 -0
- package/dist/node-api/pairing.d.ts.map +1 -0
- package/dist/node-api/pairing.js +61 -0
- package/dist/node-api/pairing.js.map +1 -0
- package/dist/node-api/pairs.d.ts +32 -0
- package/dist/node-api/pairs.d.ts.map +1 -0
- package/dist/node-api/pairs.js +72 -0
- package/dist/node-api/pairs.js.map +1 -0
- package/dist/node-api/requiredFunds.d.ts +11 -0
- package/dist/node-api/requiredFunds.d.ts.map +1 -0
- package/dist/node-api/requiredFunds.js +7 -0
- package/dist/node-api/requiredFunds.js.map +1 -0
- package/dist/node-api/setup.d.ts +25 -0
- package/dist/node-api/setup.d.ts.map +1 -0
- package/dist/node-api/setup.js +13 -0
- package/dist/node-api/setup.js.map +1 -0
- package/dist/node-api/wallet.d.ts +55 -0
- package/dist/node-api/wallet.d.ts.map +1 -0
- package/dist/node-api/wallet.js +87 -0
- package/dist/node-api/wallet.js.map +1 -0
- package/dist/protocol/actions.d.ts +40 -0
- package/dist/protocol/actions.d.ts.map +1 -0
- package/dist/protocol/actions.js +118 -0
- package/dist/protocol/actions.js.map +1 -0
- package/dist/protocol/documents.d.ts +25 -0
- package/dist/protocol/documents.d.ts.map +1 -0
- package/dist/protocol/documents.js +2 -0
- package/dist/protocol/documents.js.map +1 -0
- package/dist/protocol/index.d.ts +10 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +12 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/orchestration/createAutomation.d.ts +61 -0
- package/dist/protocol/orchestration/createAutomation.d.ts.map +1 -0
- package/dist/protocol/orchestration/createAutomation.js +71 -0
- package/dist/protocol/orchestration/createAutomation.js.map +1 -0
- package/dist/protocol/poll.d.ts +4 -0
- package/dist/protocol/poll.d.ts.map +1 -0
- package/dist/protocol/poll.js +4 -0
- package/dist/protocol/poll.js.map +1 -0
- package/dist/protocol/proposal.d.ts +36 -0
- package/dist/protocol/proposal.d.ts.map +1 -0
- package/dist/protocol/proposal.js +39 -0
- package/dist/protocol/proposal.js.map +1 -0
- package/dist/protocol/state.d.ts +87 -0
- package/dist/protocol/state.d.ts.map +1 -0
- package/dist/protocol/state.js +303 -0
- package/dist/protocol/state.js.map +1 -0
- package/dist/protocol/strategy/build.d.ts +44 -0
- package/dist/protocol/strategy/build.d.ts.map +1 -0
- package/dist/protocol/strategy/build.js +50 -0
- package/dist/protocol/strategy/build.js.map +1 -0
- package/dist/protocol/strategy/builders.d.ts +252 -0
- package/dist/protocol/strategy/builders.d.ts.map +1 -0
- package/dist/protocol/strategy/builders.js +382 -0
- package/dist/protocol/strategy/builders.js.map +1 -0
- package/dist/protocol/strategy/index.d.ts +5 -0
- package/dist/protocol/strategy/index.d.ts.map +1 -0
- package/dist/protocol/strategy/index.js +4 -0
- package/dist/protocol/strategy/index.js.map +1 -0
- package/dist/protocol/strategy/kinds.d.ts +2 -0
- package/dist/protocol/strategy/kinds.d.ts.map +1 -0
- package/dist/protocol/strategy/kinds.js +2 -0
- package/dist/protocol/strategy/kinds.js.map +1 -0
- package/dist/protocol/strategy/patch.d.ts +59 -0
- package/dist/protocol/strategy/patch.d.ts.map +1 -0
- package/dist/protocol/strategy/patch.js +253 -0
- package/dist/protocol/strategy/patch.js.map +1 -0
- package/dist/protocol/symbols.d.ts +8 -0
- package/dist/protocol/symbols.d.ts.map +1 -0
- package/dist/protocol/symbols.js +11 -0
- package/dist/protocol/symbols.js.map +1 -0
- package/dist/transport/constants.d.ts +8 -0
- package/dist/transport/constants.d.ts.map +1 -0
- package/dist/transport/constants.js +8 -0
- package/dist/transport/constants.js.map +1 -0
- package/dist/transport/documents.d.ts +27 -0
- package/dist/transport/documents.d.ts.map +1 -0
- package/dist/transport/documents.js +34 -0
- package/dist/transport/documents.js.map +1 -0
- package/dist/transport/index.d.ts +8 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +8 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/probe.d.ts +44 -0
- package/dist/transport/probe.d.ts.map +1 -0
- package/dist/transport/probe.js +121 -0
- package/dist/transport/probe.js.map +1 -0
- package/dist/transport/rendezvous.d.ts +116 -0
- package/dist/transport/rendezvous.d.ts.map +1 -0
- package/dist/transport/rendezvous.js +139 -0
- package/dist/transport/rendezvous.js.map +1 -0
- package/dist/transport/rest.d.ts +35 -0
- package/dist/transport/rest.d.ts.map +1 -0
- package/dist/transport/rest.js +58 -0
- package/dist/transport/rest.js.map +1 -0
- package/dist/transport/syncClient.d.ts +14 -0
- package/dist/transport/syncClient.d.ts.map +1 -0
- package/dist/transport/syncClient.js +30 -0
- package/dist/transport/syncClient.js.map +1 -0
- package/dist/transport/urls.d.ts +35 -0
- package/dist/transport/urls.d.ts.map +1 -0
- package/dist/transport/urls.js +126 -0
- package/dist/transport/urls.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bip39-wordlist.js","sourceRoot":"","sources":["../../src/identity/bip39-wordlist.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,SAAS;IACT,SAAS;IACT,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,UAAU;IACV,SAAS;IACT,QAAQ;IACR,SAAS;IACT,MAAM;IACN,UAAU;IACV,SAAS;IACT,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,OAAO;IACP,KAAK;IACL,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,OAAO;IACP,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,KAAK;IACL,OAAO;IACP,OAAO;IACP,OAAO;IACP,KAAK;IACL,KAAK;IACL,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,KAAK;IACL,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;IACT,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,UAAU;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,SAAS;IACT,SAAS;IACT,KAAK;IACL,OAAO;IACP,SAAS;IACT,QAAQ;IACR,OAAO;IACP,SAAS;IACT,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,OAAO;IACP,OAAO;IACP,KAAK;IACL,OAAO;IACP,OAAO;IACP,MAAM;IACN,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,KAAK;IACL,UAAU;IACV,QAAQ;IACR,SAAS;IACT,KAAK;IACL,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,SAAS;IACT,SAAS;IACT,OAAO;IACP,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,SAAS;IACT,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,SAAS;IACT,OAAO;IACP,SAAS;IACT,MAAM;IACN,MAAM;IACN,UAAU;IACV,OAAO;IACP,OAAO;IACP,KAAK;IACL,SAAS;IACT,SAAS;IACT,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,KAAK;IACL,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,QAAQ;IACR,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,KAAK;IACL,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,KAAK;IACL,UAAU;IACV,MAAM;IACN,QAAQ;IACR,OAAO;IACP,MAAM;IACN,SAAS;IACT,OAAO;IACP,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,SAAS;IACT,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,SAAS;IACT,OAAO;IACP,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,SAAS;IACT,MAAM;IACN,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,OAAO;IACP,UAAU;IACV,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;IACP,UAAU;IACV,QAAQ;IACR,SAAS;IACT,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,QAAQ;IACR,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,QAAQ;IACR,OAAO;IACP,OAAO;IACP,SAAS;IACT,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,SAAS;IACT,OAAO;IACP,QAAQ;IACR,SAAS;IACT,MAAM;IACN,SAAS;IACT,OAAO;IACP,QAAQ;IACR,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,UAAU;IACV,SAAS;IACT,UAAU;IACV,SAAS;IACT,UAAU;IACV,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,MAAM;IACN,SAAS;IACT,OAAO;IACP,OAAO;IACP,QAAQ;IACR,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,SAAS;IACT,OAAO;IACP,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,KAAK;IACL,SAAS;IACT,MAAM;IACN,SAAS;IACT,KAAK;IACL,UAAU;IACV,SAAS;IACT,SAAS;IACT,SAAS;IACT,OAAO;IACP,SAAS;IACT,QAAQ;IACR,MAAM;IACN,OAAO;IACP,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,UAAU;IACV,MAAM;IACN,KAAK;IACL,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,SAAS;IACT,UAAU;IACV,UAAU;IACV,MAAM;IACN,SAAS;IACT,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,SAAS;IACT,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,SAAS;IACT,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,SAAS;IACT,SAAS;IACT,SAAS;IACT,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,MAAM;IACN,UAAU;IACV,UAAU;IACV,SAAS;IACT,MAAM;IACN,SAAS;IACT,UAAU;IACV,SAAS;IACT,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;IACR,UAAU;IACV,KAAK;IACL,MAAM;IACN,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,SAAS;IACT,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,SAAS;IACT,MAAM;IACN,MAAM;IACN,SAAS;IACT,QAAQ;IACR,KAAK;IACL,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,UAAU;IACV,SAAS;IACT,SAAS;IACT,UAAU;IACV,UAAU;IACV,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;IACR,OAAO;IACP,KAAK;IACL,SAAS;IACT,SAAS;IACT,OAAO;IACP,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,OAAO;IACP,UAAU;IACV,SAAS;IACT,OAAO;IACP,OAAO;IACP,KAAK;IACL,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,UAAU;IACV,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,UAAU;IACV,SAAS;IACT,SAAS;IACT,OAAO;IACP,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,KAAK;IACL,SAAS;IACT,QAAQ;IACR,MAAM;IACN,SAAS;IACT,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,OAAO;IACP,SAAS;IACT,MAAM;IACN,SAAS;IACT,KAAK;IACL,OAAO;IACP,QAAQ;IACR,SAAS;IACT,OAAO;IACP,UAAU;IACV,SAAS;IACT,UAAU;IACV,SAAS;IACT,KAAK;IACL,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,UAAU;IACV,OAAO;IACP,OAAO;IACP,KAAK;IACL,OAAO;IACP,SAAS;IACT,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,KAAK;IACL,SAAS;IACT,KAAK;IACL,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,SAAS;IACT,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,KAAK;IACL,SAAS;IACT,OAAO;IACP,UAAU;IACV,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,MAAM;IACN,KAAK;IACL,OAAO;IACP,SAAS;IACT,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,SAAS;IACT,MAAM;IACN,KAAK;IACL,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,KAAK;IACL,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,MAAM;IACN,SAAS;IACT,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,SAAS;IACT,SAAS;IACT,OAAO;IACP,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,SAAS;IACT,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,KAAK;IACL,KAAK;IACL,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,OAAO;IACP,SAAS;IACT,KAAK;IACL,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,OAAO;IACP,OAAO;IACP,UAAU;IACV,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,MAAM;IACN,KAAK;IACL,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,SAAS;IACT,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,SAAS;IACT,QAAQ;IACR,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,UAAU;IACV,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,OAAO;IACP,MAAM;IACN,SAAS;IACT,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,UAAU;IACV,MAAM;IACN,QAAQ;IACR,KAAK;IACL,SAAS;IACT,SAAS;IACT,OAAO;IACP,SAAS;IACT,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,SAAS;IACT,MAAM;IACN,SAAS;IACT,QAAQ;IACR,UAAU;IACV,OAAO;IACP,UAAU;IACV,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,UAAU;IACV,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,SAAS;IACT,QAAQ;IACR,UAAU;IACV,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,MAAM;IACN,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;IACP,KAAK;IACL,MAAM;IACN,MAAM;IACN,SAAS;IACT,KAAK;IACL,OAAO;IACP,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,UAAU;IACV,MAAM;IACN,MAAM;IACN,SAAS;IACT,KAAK;IACL,MAAM;IACN,KAAK;IACL,QAAQ;IACR,MAAM;IACN,SAAS;IACT,MAAM;IACN,KAAK;IACL,SAAS;IACT,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,KAAK;IACL,OAAO;IACP,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,UAAU;IACV,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,MAAM;IACN,KAAK;IACL,MAAM;IACN,SAAS;IACT,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,OAAO;IACP,OAAO;IACP,SAAS;IACT,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,SAAS;IACT,SAAS;IACT,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,SAAS;IACT,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,QAAQ;IACR,MAAM;IACN,OAAO;IACP,OAAO;IACP,SAAS;IACT,QAAQ;IACR,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,KAAK;IACL,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,SAAS;IACT,OAAO;IACP,SAAS;IACT,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,UAAU;IACV,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,MAAM;IACN,SAAS;IACT,MAAM;IACN,UAAU;IACV,OAAO;IACP,OAAO;IACP,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,MAAM;IACN,SAAS;IACT,OAAO;IACP,MAAM;IACN,SAAS;IACT,OAAO;IACP,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,SAAS;IACT,KAAK;IACL,OAAO;IACP,SAAS;IACT,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,SAAS;IACT,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,UAAU;IACV,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,UAAU;IACV,SAAS;IACT,SAAS;IACT,QAAQ;IACR,OAAO;IACP,MAAM;IACN,KAAK;IACL,SAAS;IACT,SAAS;IACT,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,SAAS;IACT,MAAM;IACN,SAAS;IACT,QAAQ;IACR,OAAO;IACP,KAAK;IACL,SAAS;IACT,QAAQ;IACR,OAAO;IACP,KAAK;IACL,KAAK;IACL,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,OAAO;IACP,SAAS;IACT,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,OAAO;IACP,KAAK;IACL,MAAM;IACN,KAAK;IACL,OAAO;IACP,SAAS;IACT,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,SAAS;IACT,OAAO;IACP,UAAU;IACV,OAAO;IACP,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,SAAS;IACT,OAAO;IACP,SAAS;IACT,OAAO;IACP,QAAQ;IACR,SAAS;IACT,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,SAAS;IACT,OAAO;IACP,QAAQ;IACR,MAAM;IACN,SAAS;IACT,SAAS;IACT,KAAK;IACL,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,OAAO;IACP,OAAO;IACP,QAAQ;IACR,UAAU;IACV,OAAO;IACP,QAAQ;IACR,SAAS;IACT,OAAO;IACP,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;IACP,MAAM;IACN,SAAS;IACT,MAAM;IACN,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,SAAS;IACT,UAAU;IACV,UAAU;IACV,MAAM;IACN,QAAQ;IACR,SAAS;IACT,SAAS;IACT,QAAQ;IACR,OAAO;IACP,UAAU;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,UAAU;IACV,QAAQ;IACR,SAAS;IACT,OAAO;IACP,SAAS;IACT,SAAS;IACT,SAAS;IACT,QAAQ;IACR,SAAS;IACT,SAAS;IACT,SAAS;IACT,OAAO;IACP,UAAU;IACV,SAAS;IACT,SAAS;IACT,OAAO;IACP,SAAS;IACT,QAAQ;IACR,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;IACP,UAAU;IACV,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,KAAK;IACL,QAAQ;IACR,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,UAAU;IACV,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,KAAK;IACL,OAAO;IACP,OAAO;IACP,MAAM;IACN,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,UAAU;IACV,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,QAAQ;IACR,OAAO;IACP,KAAK;IACL,QAAQ;IACR,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,MAAM;IACN,SAAS;IACT,SAAS;IACT,OAAO;IACP,SAAS;IACT,MAAM;IACN,KAAK;IACL,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,UAAU;IACV,UAAU;IACV,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,UAAU;IACV,MAAM;IACN,MAAM;IACN,SAAS;IACT,QAAQ;IACR,MAAM;IACN,SAAS;IACT,QAAQ;IACR,OAAO;IACP,UAAU;IACV,QAAQ;IACR,SAAS;IACT,SAAS;IACT,QAAQ;IACR,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,SAAS;IACT,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,QAAQ;IACR,OAAO;IACP,OAAO;IACP,MAAM;IACN,QAAQ;IACR,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,UAAU;IACV,OAAO;IACP,QAAQ;IACR,OAAO;IACP,SAAS;IACT,KAAK;IACL,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;IACT,KAAK;IACL,MAAM;IACN,OAAO;IACP,QAAQ;IACR,KAAK;IACL,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,SAAS;IACT,OAAO;IACP,UAAU;IACV,OAAO;IACP,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,OAAO;IACP,MAAM;IACN,QAAQ;IACR,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,SAAS;IACT,UAAU;IACV,QAAQ;IACR,SAAS;IACT,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,SAAS;IACT,OAAO;IACP,SAAS;IACT,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,SAAS;IACT,MAAM;IACN,QAAQ;IACR,KAAK;IACL,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,SAAS;IACT,MAAM;IACN,SAAS;IACT,OAAO;IACP,UAAU;IACV,UAAU;IACV,QAAQ;IACR,SAAS;IACT,SAAS;IACT,SAAS;IACT,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,KAAK;IACL,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,SAAS;IACT,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,SAAS;IACT,QAAQ;IACR,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,SAAS;IACT,KAAK;IACL,UAAU;IACV,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,UAAU;IACV,MAAM;IACN,QAAQ;IACR,SAAS;IACT,MAAM;IACN,OAAO;IACP,KAAK;IACL,OAAO;IACP,QAAQ;IACR,OAAO;IACP,SAAS;IACT,UAAU;IACV,MAAM;IACN,OAAO;IACP,SAAS;IACT,QAAQ;IACR,OAAO;IACP,MAAM;IACN,KAAK;IACL,OAAO;IACP,OAAO;IACP,SAAS;IACT,QAAQ;IACR,OAAO;IACP,UAAU;IACV,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,KAAK;IACL,MAAM;IACN,SAAS;IACT,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,SAAS;IACT,MAAM;IACN,UAAU;IACV,QAAQ;IACR,SAAS;IACT,OAAO;IACP,SAAS;IACT,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,SAAS;IACT,QAAQ;IACR,MAAM;IACN,UAAU;IACV,SAAS;IACT,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,QAAQ;IACR,SAAS;IACT,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,KAAK;IACL,QAAQ;IACR,OAAO;IACP,SAAS;IACT,MAAM;IACN,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,SAAS;IACT,SAAS;IACT,OAAO;IACP,MAAM;IACN,SAAS;IACT,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,SAAS;IACT,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,SAAS;IACT,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,SAAS;IACT,KAAK;IACL,SAAS;IACT,SAAS;IACT,OAAO;IACP,SAAS;IACT,MAAM;IACN,KAAK;IACL,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,SAAS;IACT,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,KAAK;IACL,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,KAAK;CACG,CAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { RootIdentity } from '@drakkar.software/starfish-identities';
|
|
2
|
+
import type { StarfishCapProvider } from '@drakkar.software/starfish-client';
|
|
3
|
+
/** Which derivation scheme identifies the wallet — a `DerivationScheme.id`
|
|
4
|
+
* from `derivationSchemes.ts`. `'bip44'` (the standard `m/44'/60'/0'/0/0`
|
|
5
|
+
* path) is the only one this package ships, and the default; a consumer
|
|
6
|
+
* needing another wallet type registers one via `registerDerivationScheme`
|
|
7
|
+
* and passes its id here. An unknown id throws rather than silently
|
|
8
|
+
* deriving under the wrong scheme. */
|
|
9
|
+
export type KeyDerivation = string;
|
|
10
|
+
export declare const BOOTSTRAP_CHALLENGE = "octobot:sync-bootstrap";
|
|
11
|
+
/**
|
|
12
|
+
* Derive the wallet's Starfish root identity (userId + Ed25519/X25519 device
|
|
13
|
+
* keys) from a BIP39 seed. Exported so a caller under the same wallet (e.g. a
|
|
14
|
+
* strategy-marketplace or third-party client) can build a session under the
|
|
15
|
+
* SAME identity as this package's sync stack — one wallet → one Starfish
|
|
16
|
+
* userId across every namespace.
|
|
17
|
+
*
|
|
18
|
+
* `derivation` defaults to `'bip44'` — picking the wrong scheme derives a
|
|
19
|
+
* DIFFERENT identity, which looks exactly like "pairing worked" followed by
|
|
20
|
+
* an empty account (nothing was ever synced under that identity).
|
|
21
|
+
*/
|
|
22
|
+
export declare function deriveRoot(seed: string, derivation?: KeyDerivation): Promise<RootIdentity>;
|
|
23
|
+
/**
|
|
24
|
+
* Starfish v3 cap-cert provider derived from a BIP39 mnemonic seed.
|
|
25
|
+
*
|
|
26
|
+
* Mirrors octobot_sync/auth/provider.py WalletCapProvider: the EVM wallet
|
|
27
|
+
* deterministically signs BOOTSTRAP_CHALLENGE (EIP-191), the 65-byte
|
|
28
|
+
* signature is HKDF-expanded into a root Ed25519+X25519 identity, and a
|
|
29
|
+
* fresh short-lived device cap-cert is minted per request.
|
|
30
|
+
*
|
|
31
|
+
* userId = sha256(rootEdPub)[:32] hex — used as the {identity} URL segment
|
|
32
|
+
* instead of the raw EVM address.
|
|
33
|
+
*
|
|
34
|
+
* @see packages/sync/octobot_sync/auth/provider.py — WalletCapProvider
|
|
35
|
+
*/
|
|
36
|
+
export declare class WalletCapProvider implements StarfishCapProvider {
|
|
37
|
+
private readonly rootPromise;
|
|
38
|
+
constructor(seed: string, derivation?: KeyDerivation);
|
|
39
|
+
getCap(): Promise<{
|
|
40
|
+
cap: import("@drakkar.software/starfish-protocol").CapCert;
|
|
41
|
+
devEdPrivHex: string;
|
|
42
|
+
}>;
|
|
43
|
+
getUserId(): Promise<string>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=capProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capProvider.d.ts","sourceRoot":"","sources":["../../src/identity/capProvider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAA;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AAO5E;;;;;uCAKuC;AACvC,MAAM,MAAM,aAAa,GAAG,MAAM,CAAA;AAOlC,eAAO,MAAM,mBAAmB,2BAA2B,CAAA;AAwB3D;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,aAA4C,GACvD,OAAO,CAAC,YAAY,CAAC,CAMvB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,iBAAkB,YAAW,mBAAmB;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;gBAEvC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,aAA4C;IAI5E,MAAM;;;;IAYN,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;CAGnC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { deriveRootIdentityFromEvmSignature, mintDeviceCap, scopes, } from '@drakkar.software/starfish-identities';
|
|
2
|
+
import { secp256k1 } from '@noble/curves/secp256k1.js';
|
|
3
|
+
import { keccak_256 } from '@noble/hashes/sha3.js';
|
|
4
|
+
import { deriveEvmAddress } from './address.js';
|
|
5
|
+
import { hexToBytes } from '../internal/bytes.js';
|
|
6
|
+
import { getDerivationScheme, DEFAULT_DERIVATION_SCHEME_ID } from './derivationSchemes.js';
|
|
7
|
+
// The EVM wallet signs this challenge (EIP-191 personal_sign) to derive its
|
|
8
|
+
// Starfish root identity. Must match octobot_sync/constants.py SYNC_BOOTSTRAP_CHALLENGE.
|
|
9
|
+
// @see packages/sync/octobot_sync/constants.py — SYNC_BOOTSTRAP_CHALLENGE
|
|
10
|
+
// @remarks Changing this breaks sync silently: the client and node would derive
|
|
11
|
+
// different root identities from the same wallet.
|
|
12
|
+
export const BOOTSTRAP_CHALLENGE = 'octobot:sync-bootstrap';
|
|
13
|
+
/**
|
|
14
|
+
* Sign challenge text with EIP-191 personal_sign.
|
|
15
|
+
* Returns 65-byte r‖s‖v signature where v = recoveryBit + 27.
|
|
16
|
+
* Matches Python web3.Account.sign_message(encode_defunct(text=challenge)).signature.
|
|
17
|
+
*/
|
|
18
|
+
function signBootstrap(privateKey, challenge) {
|
|
19
|
+
const enc = new TextEncoder();
|
|
20
|
+
const msgBytes = enc.encode(challenge);
|
|
21
|
+
const prefix = enc.encode(`\x19Ethereum Signed Message:\n${msgBytes.length}`);
|
|
22
|
+
const combined = new Uint8Array(prefix.length + msgBytes.length);
|
|
23
|
+
combined.set(prefix, 0);
|
|
24
|
+
combined.set(msgBytes, prefix.length);
|
|
25
|
+
const hash = keccak_256(combined);
|
|
26
|
+
// noble v2: format:'recovered' → recovery_bit(1) ‖ r(32) ‖ s(32)
|
|
27
|
+
const sig = secp256k1.sign(hash, privateKey, { format: 'recovered', lowS: true, prehash: false });
|
|
28
|
+
const out = new Uint8Array(65);
|
|
29
|
+
out.set(sig.slice(1, 33), 0); // r
|
|
30
|
+
out.set(sig.slice(33, 65), 32); // s
|
|
31
|
+
out[64] = sig[0] + 27; // v (Ethereum: 27/28)
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Derive the wallet's Starfish root identity (userId + Ed25519/X25519 device
|
|
36
|
+
* keys) from a BIP39 seed. Exported so a caller under the same wallet (e.g. a
|
|
37
|
+
* strategy-marketplace or third-party client) can build a session under the
|
|
38
|
+
* SAME identity as this package's sync stack — one wallet → one Starfish
|
|
39
|
+
* userId across every namespace.
|
|
40
|
+
*
|
|
41
|
+
* `derivation` defaults to `'bip44'` — picking the wrong scheme derives a
|
|
42
|
+
* DIFFERENT identity, which looks exactly like "pairing worked" followed by
|
|
43
|
+
* an empty account (nothing was ever synced under that identity).
|
|
44
|
+
*/
|
|
45
|
+
export async function deriveRoot(seed, derivation = DEFAULT_DERIVATION_SCHEME_ID) {
|
|
46
|
+
const privateKeyHex = await getDerivationScheme(derivation).derive(seed);
|
|
47
|
+
const privateKey = hexToBytes(privateKeyHex);
|
|
48
|
+
const address = deriveEvmAddress(privateKey);
|
|
49
|
+
const signature = signBootstrap(privateKey, BOOTSTRAP_CHALLENGE);
|
|
50
|
+
return deriveRootIdentityFromEvmSignature({ address, signature, challenge: BOOTSTRAP_CHALLENGE });
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Starfish v3 cap-cert provider derived from a BIP39 mnemonic seed.
|
|
54
|
+
*
|
|
55
|
+
* Mirrors octobot_sync/auth/provider.py WalletCapProvider: the EVM wallet
|
|
56
|
+
* deterministically signs BOOTSTRAP_CHALLENGE (EIP-191), the 65-byte
|
|
57
|
+
* signature is HKDF-expanded into a root Ed25519+X25519 identity, and a
|
|
58
|
+
* fresh short-lived device cap-cert is minted per request.
|
|
59
|
+
*
|
|
60
|
+
* userId = sha256(rootEdPub)[:32] hex — used as the {identity} URL segment
|
|
61
|
+
* instead of the raw EVM address.
|
|
62
|
+
*
|
|
63
|
+
* @see packages/sync/octobot_sync/auth/provider.py — WalletCapProvider
|
|
64
|
+
*/
|
|
65
|
+
export class WalletCapProvider {
|
|
66
|
+
rootPromise;
|
|
67
|
+
constructor(seed, derivation = DEFAULT_DERIVATION_SCHEME_ID) {
|
|
68
|
+
this.rootPromise = deriveRoot(seed, derivation);
|
|
69
|
+
}
|
|
70
|
+
async getCap() {
|
|
71
|
+
const root = await this.rootPromise;
|
|
72
|
+
const cap = await mintDeviceCap(root.keys.edPriv, root.keys.edPub, { edPubHex: root.keys.edPub, kemPubHex: root.keys.kemPub }, scopes.rootAll());
|
|
73
|
+
// pubHex omitted: device caps bind the identity via cap.sub, not audience
|
|
74
|
+
return { cap, devEdPrivHex: root.keys.edPriv };
|
|
75
|
+
}
|
|
76
|
+
async getUserId() {
|
|
77
|
+
return (await this.rootPromise).userId;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=capProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capProvider.js","sourceRoot":"","sources":["../../src/identity/capProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Turns a mnemonic into a private key hex string. Every scheme must pass a
|
|
2
|
+
* raw private key through unchanged (via `isEvmPrivateKey`/
|
|
3
|
+
* `normalizeEvmPrivateKey`) — a raw key has no derivation, it IS the key. */
|
|
4
|
+
export type DeriveKeyFn = (mnemonicOrKey: string) => Promise<string>;
|
|
5
|
+
export type DerivationScheme = {
|
|
6
|
+
/** Stable identifier persisted alongside a wallet — e.g. in `Wallet.derivation`
|
|
7
|
+
* on the consumer side. Never reuse an id for a different derivation once
|
|
8
|
+
* anything may have been minted under it. */
|
|
9
|
+
id: string;
|
|
10
|
+
derive: DeriveKeyFn;
|
|
11
|
+
};
|
|
12
|
+
/** The scheme used when a caller doesn't pass one explicitly. */
|
|
13
|
+
export declare const DEFAULT_DERIVATION_SCHEME_ID = "bip44";
|
|
14
|
+
/** Registers a new derivation scheme (e.g. for a future wallet type this
|
|
15
|
+
* package doesn't ship natively) so `deriveRoot`/`WalletCapProvider`/
|
|
16
|
+
* `createKeyCache()` can address it by id. Throws if `id` is already
|
|
17
|
+
* registered — schemes are identity-bearing, so silently replacing one
|
|
18
|
+
* would re-derive every wallet that used it under a different key. */
|
|
19
|
+
export declare function registerDerivationScheme(scheme: DerivationScheme): void;
|
|
20
|
+
/** Throws for an unknown id — there is no silent fallback, since deriving
|
|
21
|
+
* under the wrong scheme silently produces a DIFFERENT identity rather than
|
|
22
|
+
* an error a caller could catch. */
|
|
23
|
+
export declare function getDerivationScheme(id: string): DerivationScheme;
|
|
24
|
+
export declare function listDerivationSchemeIds(): string[];
|
|
25
|
+
//# sourceMappingURL=derivationSchemes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derivationSchemes.d.ts","sourceRoot":"","sources":["../../src/identity/derivationSchemes.ts"],"names":[],"mappings":"AAEA;;8EAE8E;AAC9E,MAAM,MAAM,WAAW,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAEpE,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;kDAE8C;IAC9C,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,WAAW,CAAA;CACpB,CAAA;AAWD,iEAAiE;AACjE,eAAO,MAAM,4BAA4B,UAAU,CAAA;AAEnD;;;;uEAIuE;AACvE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAGvE;AAED;;qCAEqC;AACrC,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,CAIhE;AAED,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,CAElD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { isEvmPrivateKey, normalizeEvmPrivateKey, deriveBip44PrivateKey } from './evm.js';
|
|
2
|
+
function bip44Derive(mnemonicOrKey) {
|
|
3
|
+
if (isEvmPrivateKey(mnemonicOrKey))
|
|
4
|
+
return Promise.resolve(normalizeEvmPrivateKey(mnemonicOrKey));
|
|
5
|
+
return deriveBip44PrivateKey(mnemonicOrKey);
|
|
6
|
+
}
|
|
7
|
+
const schemes = new Map([
|
|
8
|
+
['bip44', { id: 'bip44', derive: bip44Derive }],
|
|
9
|
+
]);
|
|
10
|
+
/** The scheme used when a caller doesn't pass one explicitly. */
|
|
11
|
+
export const DEFAULT_DERIVATION_SCHEME_ID = 'bip44';
|
|
12
|
+
/** Registers a new derivation scheme (e.g. for a future wallet type this
|
|
13
|
+
* package doesn't ship natively) so `deriveRoot`/`WalletCapProvider`/
|
|
14
|
+
* `createKeyCache()` can address it by id. Throws if `id` is already
|
|
15
|
+
* registered — schemes are identity-bearing, so silently replacing one
|
|
16
|
+
* would re-derive every wallet that used it under a different key. */
|
|
17
|
+
export function registerDerivationScheme(scheme) {
|
|
18
|
+
if (schemes.has(scheme.id))
|
|
19
|
+
throw new Error(`derivation scheme "${scheme.id}" is already registered`);
|
|
20
|
+
schemes.set(scheme.id, scheme);
|
|
21
|
+
}
|
|
22
|
+
/** Throws for an unknown id — there is no silent fallback, since deriving
|
|
23
|
+
* under the wrong scheme silently produces a DIFFERENT identity rather than
|
|
24
|
+
* an error a caller could catch. */
|
|
25
|
+
export function getDerivationScheme(id) {
|
|
26
|
+
const scheme = schemes.get(id);
|
|
27
|
+
if (!scheme)
|
|
28
|
+
throw new Error(`unknown derivation scheme: "${id}"`);
|
|
29
|
+
return scheme;
|
|
30
|
+
}
|
|
31
|
+
export function listDerivationSchemeIds() {
|
|
32
|
+
return [...schemes.keys()];
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=derivationSchemes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derivationSchemes.js","sourceRoot":"","sources":["../../src/identity/derivationSchemes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAezF,SAAS,WAAW,CAAC,aAAqB;IACxC,IAAI,eAAe,CAAC,aAAa,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC,CAAA;IACjG,OAAO,qBAAqB,CAAC,aAAa,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAA2B;IAChD,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;CAChD,CAAC,CAAA;AAEF,iEAAiE;AACjE,MAAM,CAAC,MAAM,4BAA4B,GAAG,OAAO,CAAA;AAEnD;;;;uEAIuE;AACvE,MAAM,UAAU,wBAAwB,CAAC,MAAwB;IAC/D,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,EAAE,yBAAyB,CAAC,CAAA;IACrG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;AAChC,CAAC;AAED;;qCAEqC;AACrC,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC9B,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAA;IAClE,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;AAC5B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** True if `s` is a valid secp256k1 EVM private key (0x-prefixed or bare 64-hex, in range [1, n-1]). */
|
|
2
|
+
export declare function isEvmPrivateKey(s: string): boolean;
|
|
3
|
+
/** Normalises a private key string to lowercase, 0x-prefixed hex. */
|
|
4
|
+
export declare function normalizeEvmPrivateKey(s: string): string;
|
|
5
|
+
/** Derives the standard BIP44 EVM private key (m/44'/60'/0'/0/0) from a BIP39
|
|
6
|
+
* mnemonic — the derivation web3.py, ethers and MetaMask all agree on. */
|
|
7
|
+
export declare function deriveBip44PrivateKey(mnemonic: string): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=evm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../../src/identity/evm.ts"],"names":[],"mappings":"AAkDA,wGAAwG;AACxG,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAKlD;AAED,qEAAqE;AACrE,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxD;AAyBD;2EAC2E;AAC3E,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG7E"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { secp256k1 } from '@noble/curves/secp256k1.js';
|
|
2
|
+
const HARDENED = 0x80_000_000;
|
|
3
|
+
// secp256k1 curve order — mathematical constant, used for BIP32 child key modular reduction
|
|
4
|
+
const CURVE_N = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141');
|
|
5
|
+
// TS 5.x: Uint8Array<ArrayBufferLike> doesn't satisfy BufferSource; slice gives ArrayBuffer
|
|
6
|
+
function buf(u) {
|
|
7
|
+
return u.buffer.slice(u.byteOffset, u.byteOffset + u.byteLength);
|
|
8
|
+
}
|
|
9
|
+
async function hmacSha512(key, data) {
|
|
10
|
+
const cryptoKey = await globalThis.crypto.subtle.importKey('raw', buf(key), { name: 'HMAC', hash: 'SHA-512' }, false, ['sign']);
|
|
11
|
+
return new Uint8Array(await globalThis.crypto.subtle.sign('HMAC', cryptoKey, buf(data)));
|
|
12
|
+
}
|
|
13
|
+
function bytesToBigInt(b) {
|
|
14
|
+
let n = 0n;
|
|
15
|
+
for (const byte of b)
|
|
16
|
+
n = (n << 8n) | BigInt(byte);
|
|
17
|
+
return n;
|
|
18
|
+
}
|
|
19
|
+
function bigIntTo32Bytes(n) {
|
|
20
|
+
const out = new Uint8Array(32);
|
|
21
|
+
for (let i = 31; i >= 0; i--) {
|
|
22
|
+
out[i] = Number(n & 0xffn);
|
|
23
|
+
n >>= 8n;
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
async function deriveChild(key, chain, index) {
|
|
28
|
+
const data = new Uint8Array(37);
|
|
29
|
+
if (index >= HARDENED) {
|
|
30
|
+
data[0] = 0x00;
|
|
31
|
+
data.set(key, 1);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
data.set(secp256k1.getPublicKey(key, true), 0);
|
|
35
|
+
}
|
|
36
|
+
new DataView(data.buffer).setUint32(33, index, false);
|
|
37
|
+
const I = await hmacSha512(chain, data);
|
|
38
|
+
const childKey = (bytesToBigInt(I.slice(0, 32)) + bytesToBigInt(key)) % CURVE_N;
|
|
39
|
+
return { key: bigIntTo32Bytes(childKey), chain: I.slice(32) };
|
|
40
|
+
}
|
|
41
|
+
const EVM_PRIVATE_KEY_PATTERN = /^(0x)?[0-9a-fA-F]{64}$/;
|
|
42
|
+
/** True if `s` is a valid secp256k1 EVM private key (0x-prefixed or bare 64-hex, in range [1, n-1]). */
|
|
43
|
+
export function isEvmPrivateKey(s) {
|
|
44
|
+
if (!EVM_PRIVATE_KEY_PATTERN.test(s))
|
|
45
|
+
return false;
|
|
46
|
+
const hex = s.startsWith('0x') ? s.slice(2) : s;
|
|
47
|
+
const n = BigInt('0x' + hex);
|
|
48
|
+
return n > 0n && n < CURVE_N;
|
|
49
|
+
}
|
|
50
|
+
/** Normalises a private key string to lowercase, 0x-prefixed hex. */
|
|
51
|
+
export function normalizeEvmPrivateKey(s) {
|
|
52
|
+
const trimmed = s.trim().toLowerCase();
|
|
53
|
+
return trimmed.startsWith('0x') ? trimmed : '0x' + trimmed;
|
|
54
|
+
}
|
|
55
|
+
// Real m/44'/60'/0'/0/0.
|
|
56
|
+
const BIP44_PATH = [44 + HARDENED, 60 + HARDENED, 0 + HARDENED, 0, 0];
|
|
57
|
+
async function derivePath(mnemonic, path) {
|
|
58
|
+
const enc = new TextEncoder();
|
|
59
|
+
const keyMaterial = await globalThis.crypto.subtle.importKey('raw', enc.encode(mnemonic), 'PBKDF2', false, ['deriveBits']);
|
|
60
|
+
const seedBits = await globalThis.crypto.subtle.deriveBits({ name: 'PBKDF2', hash: 'SHA-512', salt: enc.encode('mnemonic'), iterations: 2048 }, keyMaterial, 512);
|
|
61
|
+
const seed = new Uint8Array(seedBits);
|
|
62
|
+
const I = await hmacSha512(enc.encode('Bitcoin seed'), seed);
|
|
63
|
+
let key = I.slice(0, 32);
|
|
64
|
+
let chain = I.slice(32);
|
|
65
|
+
for (const idx of path) {
|
|
66
|
+
;
|
|
67
|
+
({ key, chain } = await deriveChild(key, chain, idx));
|
|
68
|
+
}
|
|
69
|
+
return '0x' + Array.from(key, (b) => b.toString(16).padStart(2, '0')).join('');
|
|
70
|
+
}
|
|
71
|
+
/** Derives the standard BIP44 EVM private key (m/44'/60'/0'/0/0) from a BIP39
|
|
72
|
+
* mnemonic — the derivation web3.py, ethers and MetaMask all agree on. */
|
|
73
|
+
export async function deriveBip44PrivateKey(mnemonic) {
|
|
74
|
+
if (isEvmPrivateKey(mnemonic))
|
|
75
|
+
return normalizeEvmPrivateKey(mnemonic);
|
|
76
|
+
return derivePath(mnemonic, BIP44_PATH);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=evm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm.js","sourceRoot":"","sources":["../../src/identity/evm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { deriveBip44PrivateKey, isEvmPrivateKey, normalizeEvmPrivateKey, } from './evm.js';
|
|
2
|
+
export { deriveEvmAddress } from './address.js';
|
|
3
|
+
export { entropyToMnemonic, generateSeedPhrase, validateSeedPhrase, } from './mnemonic.js';
|
|
4
|
+
export { classifySecret, classifyBareSecret, readSecretEnvelope, type ClassifiedSecret, } from './secret.js';
|
|
5
|
+
export { WalletCapProvider, deriveRoot, BOOTSTRAP_CHALLENGE, type KeyDerivation } from './capProvider.js';
|
|
6
|
+
export { createReadOnlyPairing, parseReadOnlyPairing, type ReadOnlyPairingPayload } from './pairing.js';
|
|
7
|
+
export { createPairingRequest, parsePairingRequest, type PairingRequestPayload } from './pairingRequest.js';
|
|
8
|
+
export { createKeyCache, type KeyCache } from './keys.js';
|
|
9
|
+
export { registerDerivationScheme, getDerivationScheme, listDerivationSchemeIds, DEFAULT_DERIVATION_SCHEME_ID, type DerivationScheme, type DeriveKeyFn, } from './derivationSchemes.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,sBAAsB,GACvB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACzG,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAA;AACvG,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3G,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAA;AACzD,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,4BAA4B,EAC5B,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { deriveBip44PrivateKey, isEvmPrivateKey, normalizeEvmPrivateKey, } from './evm.js';
|
|
2
|
+
export { deriveEvmAddress } from './address.js';
|
|
3
|
+
export { entropyToMnemonic, generateSeedPhrase, validateSeedPhrase, } from './mnemonic.js';
|
|
4
|
+
export { classifySecret, classifyBareSecret, readSecretEnvelope, } from './secret.js';
|
|
5
|
+
export { WalletCapProvider, deriveRoot, BOOTSTRAP_CHALLENGE } from './capProvider.js';
|
|
6
|
+
export { createReadOnlyPairing, parseReadOnlyPairing } from './pairing.js';
|
|
7
|
+
export { createPairingRequest, parsePairingRequest } from './pairingRequest.js';
|
|
8
|
+
export { createKeyCache } from './keys.js';
|
|
9
|
+
export { registerDerivationScheme, getDerivationScheme, listDerivationSchemeIds, DEFAULT_DERIVATION_SCHEME_ID, } from './derivationSchemes.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,sBAAsB,GACvB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAsB,MAAM,kBAAkB,CAAA;AACzG,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAA+B,MAAM,cAAc,CAAA;AACvG,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAA8B,MAAM,qBAAqB,CAAA;AAC3G,OAAO,EAAE,cAAc,EAAiB,MAAM,WAAW,CAAA;AACzD,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,4BAA4B,GAG7B,MAAM,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { KeyDerivation } from './capProvider.js';
|
|
2
|
+
/** One session's worth of derived key material, keyed off the seed so a
|
|
3
|
+
* caller can hold several independently (unlike the module-level singleton
|
|
4
|
+
* cache octobot-sdk uses internally). */
|
|
5
|
+
export type KeyCache = {
|
|
6
|
+
getWalletAddress(seed: string, derivation?: KeyDerivation): Promise<string>;
|
|
7
|
+
getEncryptionKey(seed: string, derivation?: KeyDerivation): Promise<string>;
|
|
8
|
+
clear(): void;
|
|
9
|
+
};
|
|
10
|
+
/** Creates an isolated single-entry key-derivation cache: avoids re-deriving
|
|
11
|
+
* PBKDF2 + BIP32 on every call for the same (seed, derivation) pair. Keyed
|
|
12
|
+
* by a hash of both so the raw seed isn't held as a map key. Each
|
|
13
|
+
* `connectOctoBot()` session gets its own — this is the ONE piece of state
|
|
14
|
+
* this package keeps beyond a single call, and it's dropped by
|
|
15
|
+
* `close()`/`clear()`. */
|
|
16
|
+
export declare function createKeyCache(): KeyCache;
|
|
17
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/identity/keys.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGrD;;0CAE0C;AAC1C,MAAM,MAAM,QAAQ,GAAG;IACrB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3E,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3E,KAAK,IAAI,IAAI,CAAA;CACd,CAAA;AAQD;;;;;2BAK2B;AAC3B,wBAAgB,cAAc,IAAI,QAAQ,CAuBzC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { keccak_256 } from '@noble/hashes/sha3.js';
|
|
2
|
+
import { deriveEvmAddress } from './address.js';
|
|
3
|
+
import { toHex, hexToBytes } from '../internal/bytes.js';
|
|
4
|
+
import { getDerivationScheme, DEFAULT_DERIVATION_SCHEME_ID } from './derivationSchemes.js';
|
|
5
|
+
function fingerprintOf(seed, derivation) {
|
|
6
|
+
return toHex(keccak_256(new TextEncoder().encode(`${derivation}:${seed}`)));
|
|
7
|
+
}
|
|
8
|
+
/** Creates an isolated single-entry key-derivation cache: avoids re-deriving
|
|
9
|
+
* PBKDF2 + BIP32 on every call for the same (seed, derivation) pair. Keyed
|
|
10
|
+
* by a hash of both so the raw seed isn't held as a map key. Each
|
|
11
|
+
* `connectOctoBot()` session gets its own — this is the ONE piece of state
|
|
12
|
+
* this package keeps beyond a single call, and it's dropped by
|
|
13
|
+
* `close()`/`clear()`. */
|
|
14
|
+
export function createKeyCache() {
|
|
15
|
+
let cached = null;
|
|
16
|
+
async function getKey(seed, derivation) {
|
|
17
|
+
const fingerprint = fingerprintOf(seed, derivation);
|
|
18
|
+
if (cached?.fingerprint === fingerprint)
|
|
19
|
+
return cached;
|
|
20
|
+
const privateKeyHex = await getDerivationScheme(derivation).derive(seed);
|
|
21
|
+
const privateKey = hexToBytes(privateKeyHex);
|
|
22
|
+
const address = deriveEvmAddress(privateKey);
|
|
23
|
+
cached = { fingerprint, privateKey, address };
|
|
24
|
+
return cached;
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
/** EIP-55 checksummed EVM address the seed derives to. `derivation`
|
|
28
|
+
* defaults to `'bip44'`. */
|
|
29
|
+
getWalletAddress: async (seed, derivation = DEFAULT_DERIVATION_SCHEME_ID) => (await getKey(seed, derivation)).address,
|
|
30
|
+
/** The private key hex used as the HKDF secret for payload encryption
|
|
31
|
+
* (see crypto/secretEncryptor.ts). `derivation` defaults to `'bip44'`. */
|
|
32
|
+
getEncryptionKey: async (seed, derivation = DEFAULT_DERIVATION_SCHEME_ID) => '0x' + toHex((await getKey(seed, derivation)).privateKey),
|
|
33
|
+
clear: () => { cached = null; },
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/identity/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAExD,OAAO,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAA;AAa1F,SAAS,aAAa,CAAC,IAAY,EAAE,UAAyB;IAC5D,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC7E,CAAC;AAED;;;;;2BAK2B;AAC3B,MAAM,UAAU,cAAc;IAC5B,IAAI,MAAM,GAAqB,IAAI,CAAA;IAEnC,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,UAAyB;QAC3D,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QACnD,IAAI,MAAM,EAAE,WAAW,KAAK,WAAW;YAAE,OAAO,MAAM,CAAA;QACtD,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACxE,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,CAAA;QAC5C,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC5C,MAAM,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,CAAA;QAC7C,OAAO,MAAM,CAAA;IACf,CAAC;IAED,OAAO;QACL;qCAC6B;QAC7B,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,GAAG,4BAA4B,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO;QACrH;mFAC2E;QAC3E,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,GAAG,4BAA4B,EAAE,EAAE,CAC1E,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;QAC3D,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,CAAA,CAAC,CAAC;KAC/B,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function entropyToMnemonic(entropy: Uint8Array): Promise<string[]>;
|
|
2
|
+
export declare function generateSeedPhrase(count?: number): Promise<string[]>;
|
|
3
|
+
export declare function validateSeedPhrase(phrase: string): Promise<boolean>;
|
|
4
|
+
//# sourceMappingURL=mnemonic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mnemonic.d.ts","sourceRoot":"","sources":["../../src/identity/mnemonic.ts"],"names":[],"mappings":"AAkBA,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyB9E;AAED,wBAAsB,kBAAkB,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOtE;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA0CzE"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { BIP39_WORDLIST } from './bip39-wordlist.js';
|
|
2
|
+
const STRENGTH_BY_COUNT = {
|
|
3
|
+
12: 128,
|
|
4
|
+
15: 160,
|
|
5
|
+
18: 192,
|
|
6
|
+
21: 224,
|
|
7
|
+
24: 256,
|
|
8
|
+
};
|
|
9
|
+
function getCrypto() {
|
|
10
|
+
const c = globalThis.crypto;
|
|
11
|
+
if (!c?.getRandomValues || !c?.subtle?.digest) {
|
|
12
|
+
throw new Error('Crypto polyfill not ready: cannot generate a secure seed phrase');
|
|
13
|
+
}
|
|
14
|
+
return c;
|
|
15
|
+
}
|
|
16
|
+
export async function entropyToMnemonic(entropy) {
|
|
17
|
+
const c = getCrypto();
|
|
18
|
+
// TS 5.7+ makes Uint8Array generic over ArrayBufferLike; WebCrypto wants the
|
|
19
|
+
// concrete ArrayBuffer variant (not SharedArrayBuffer).
|
|
20
|
+
const hashBuf = await c.subtle.digest('SHA-256', entropy);
|
|
21
|
+
const hash = new Uint8Array(hashBuf);
|
|
22
|
+
const checksumBits = (entropy.length * 8) / 32;
|
|
23
|
+
const wordCount = (entropy.length * 8 + checksumBits) / 11;
|
|
24
|
+
// combined = entropy bytes + one byte holding the checksum (only top checksumBits are read)
|
|
25
|
+
const combined = new Uint8Array(entropy.length + 1);
|
|
26
|
+
combined.set(entropy);
|
|
27
|
+
combined[entropy.length] = hash[0];
|
|
28
|
+
const words = [];
|
|
29
|
+
for (let wi = 0; wi < wordCount; wi++) {
|
|
30
|
+
let index = 0;
|
|
31
|
+
const startBit = wi * 11;
|
|
32
|
+
for (let b = 0; b < 11; b++) {
|
|
33
|
+
const bit = startBit + b;
|
|
34
|
+
const byteIdx = bit >> 3;
|
|
35
|
+
const bitInByte = 7 - (bit & 7);
|
|
36
|
+
index = (index << 1) | ((combined[byteIdx] >> bitInByte) & 1);
|
|
37
|
+
}
|
|
38
|
+
words.push(BIP39_WORDLIST[index]);
|
|
39
|
+
}
|
|
40
|
+
return words;
|
|
41
|
+
}
|
|
42
|
+
export async function generateSeedPhrase(count = 12) {
|
|
43
|
+
const strength = STRENGTH_BY_COUNT[count];
|
|
44
|
+
if (strength === undefined)
|
|
45
|
+
throw new Error(`Unsupported word count: ${count}. Use 12, 15, 18, 21, or 24.`);
|
|
46
|
+
const c = getCrypto();
|
|
47
|
+
const entropy = new Uint8Array(strength / 8);
|
|
48
|
+
c.getRandomValues(entropy);
|
|
49
|
+
return entropyToMnemonic(entropy);
|
|
50
|
+
}
|
|
51
|
+
export async function validateSeedPhrase(phrase) {
|
|
52
|
+
const words = phrase.trim().split(/\s+/);
|
|
53
|
+
const strength = STRENGTH_BY_COUNT[words.length];
|
|
54
|
+
if (strength === undefined)
|
|
55
|
+
return false;
|
|
56
|
+
const indices = words.map((w) => BIP39_WORDLIST.indexOf(w));
|
|
57
|
+
if (indices.some((i) => i === -1))
|
|
58
|
+
return false;
|
|
59
|
+
const entropyBits = strength;
|
|
60
|
+
const checksumBits = strength / 32;
|
|
61
|
+
const totalBits = words.length * 11;
|
|
62
|
+
// Rebuild the full bit array from word indices
|
|
63
|
+
const bits = new Uint8Array(totalBits);
|
|
64
|
+
for (let i = 0; i < words.length; i++) {
|
|
65
|
+
const idx = indices[i];
|
|
66
|
+
for (let b = 0; b < 11; b++) {
|
|
67
|
+
bits[i * 11 + b] = (idx >> (10 - b)) & 1;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Extract entropy bytes
|
|
71
|
+
const entropy = new Uint8Array(entropyBits / 8);
|
|
72
|
+
for (let byte = 0; byte < entropy.length; byte++) {
|
|
73
|
+
let v = 0;
|
|
74
|
+
for (let bit = 0; bit < 8; bit++) {
|
|
75
|
+
v = (v << 1) | bits[byte * 8 + bit];
|
|
76
|
+
}
|
|
77
|
+
entropy[byte] = v;
|
|
78
|
+
}
|
|
79
|
+
// Compare given checksum bits vs recomputed SHA-256 checksum
|
|
80
|
+
const c = globalThis.crypto;
|
|
81
|
+
if (!c?.subtle?.digest)
|
|
82
|
+
return false;
|
|
83
|
+
const hashBuf = await c.subtle.digest('SHA-256', entropy);
|
|
84
|
+
const hash = new Uint8Array(hashBuf);
|
|
85
|
+
for (let i = 0; i < checksumBits; i++) {
|
|
86
|
+
const given = bits[entropyBits + i];
|
|
87
|
+
const expected = (hash[0] >> (7 - i)) & 1;
|
|
88
|
+
if (given !== expected)
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=mnemonic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mnemonic.js","sourceRoot":"","sources":["../../src/identity/mnemonic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type GeneratedDeviceKeys, type ScopePreset } from '@drakkar.software/starfish-identities';
|
|
2
|
+
import type { CapCert } from '@drakkar.software/starfish-protocol';
|
|
3
|
+
import { type KeyDerivation } from './capProvider.js';
|
|
4
|
+
import type { NodeEndpoint } from '../transport/urls.js';
|
|
5
|
+
import { type NodeCollectionKey } from '../collections/nodeCollections.js';
|
|
6
|
+
/** A read-only device's bearer credential: an ephemeral keypair this device
|
|
7
|
+
* generated itself, plus a cap-cert the wallet's root key signed for it,
|
|
8
|
+
* plus one derived AES-256 key per granted collection (`collectionKeys`) —
|
|
9
|
+
* each `HKDF-SHA256(secret, salt, collection.encryptionInfo)`, the same
|
|
10
|
+
* derivation `createSecretEncryptor` performs internally, stopped one step
|
|
11
|
+
* early so the raw bytes can travel here. That derivation is one-way and
|
|
12
|
+
* collection-independent: holding `collectionKeys.userData` reveals nothing
|
|
13
|
+
* about `collectionKeys.accounts`, and neither reveals the wallet's
|
|
14
|
+
* derived secret, let alone the wallet's private key. A device holding
|
|
15
|
+
* this payload can decrypt exactly the granted collections and nothing
|
|
16
|
+
* else, and can never widen its own grant (it never touches the root
|
|
17
|
+
* private key). See `crypto/collectionKeys.ts`. */
|
|
18
|
+
export interface ReadOnlyPairingPayload {
|
|
19
|
+
v: 2;
|
|
20
|
+
kind: 'octobot-read-only-pairing';
|
|
21
|
+
node: NodeEndpoint;
|
|
22
|
+
rootEdPub: string;
|
|
23
|
+
userId: string;
|
|
24
|
+
device: GeneratedDeviceKeys;
|
|
25
|
+
cap: CapCert;
|
|
26
|
+
scope: ScopePreset;
|
|
27
|
+
collectionKeys: Partial<Record<NodeCollectionKey, string>>;
|
|
28
|
+
}
|
|
29
|
+
/** Mint a read-only pairing payload from the wallet's seed. The caller (e.g.
|
|
30
|
+
* mobile2) renders the returned string as a QR code for another device to
|
|
31
|
+
* scan — this package never renders QR images itself. The payload is fully
|
|
32
|
+
* self-contained (it carries the node's endpoint), so
|
|
33
|
+
* `connectReadOnlyDevice()` needs nothing else to connect. */
|
|
34
|
+
export declare function createReadOnlyPairing(seed: string, derivation: KeyDerivation, node: NodeEndpoint, opts?: {
|
|
35
|
+
collections?: string[];
|
|
36
|
+
ttlSec?: number;
|
|
37
|
+
}): Promise<{
|
|
38
|
+
payload: string;
|
|
39
|
+
}>;
|
|
40
|
+
/** Parse and structurally validate a scanned/pasted read-only pairing
|
|
41
|
+
* payload. Throws on anything that isn't shaped like one — callers doing QR
|
|
42
|
+
* classification (e.g. `classifyScannedCode`) should catch and fall through
|
|
43
|
+
* to the next candidate parser rather than propagate. */
|
|
44
|
+
export declare function parseReadOnlyPairing(payload: string): ReadOnlyPairingPayload;
|
|
45
|
+
//# sourceMappingURL=pairing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pairing.d.ts","sourceRoot":"","sources":["../../src/identity/pairing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,KAAK,mBAAmB,EAAE,KAAK,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACrI,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAA;AAClE,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAExD,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAgB5F;;;;;;;;;;;oDAWoD;AACpD,MAAM,WAAW,sBAAsB;IACrC,CAAC,EAAE,CAAC,CAAA;IACJ,IAAI,EAAE,2BAA2B,CAAA;IACjC,IAAI,EAAE,YAAY,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,mBAAmB,CAAA;IAC3B,GAAG,EAAE,OAAO,CAAA;IACZ,KAAK,EAAE,WAAW,CAAA;IAClB,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAA;CAC3D;AAED;;;;+DAI+D;AAC/D,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,aAAa,EACzB,IAAI,EAAE,YAAY,EAClB,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA8B9B;AAED;;;0DAG0D;AAC1D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAmC5E"}
|