@vultisig/core-mpc 0.9.0 → 1.0.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/CHANGELOG.md +28 -0
- package/dist/chains/cosmos/qbtc/QBTCHelper.d.ts +25 -0
- package/dist/chains/cosmos/qbtc/QBTCHelper.d.ts.map +1 -0
- package/dist/chains/cosmos/qbtc/QBTCHelper.js +158 -0
- package/dist/chains/cosmos/qbtc/QBTCHelper.js.map +1 -0
- package/dist/dkls/dkls.d.ts +6 -3
- package/dist/dkls/dkls.d.ts.map +1 -1
- package/dist/dkls/dkls.js +102 -57
- package/dist/dkls/dkls.js.map +1 -1
- package/dist/fast/api/batchReshareWithServer.d.ts +19 -0
- package/dist/fast/api/batchReshareWithServer.d.ts.map +1 -0
- package/dist/fast/api/batchReshareWithServer.js +7 -0
- package/dist/fast/api/batchReshareWithServer.js.map +1 -0
- package/dist/fast/api/createVaultWithServer.d.ts +14 -0
- package/dist/fast/api/createVaultWithServer.d.ts.map +1 -0
- package/dist/fast/api/createVaultWithServer.js +7 -0
- package/dist/fast/api/createVaultWithServer.js.map +1 -0
- package/dist/fast/api/keyImportWithServer.d.ts +3 -2
- package/dist/fast/api/keyImportWithServer.d.ts.map +1 -1
- package/dist/fast/api/keyImportWithServer.js +2 -2
- package/dist/fast/api/keyImportWithServer.js.map +1 -1
- package/dist/fast/api/reshareWithServer.d.ts +3 -1
- package/dist/fast/api/reshareWithServer.d.ts.map +1 -1
- package/dist/fast/api/reshareWithServer.js +2 -2
- package/dist/fast/api/reshareWithServer.js.map +1 -1
- package/dist/fast/api/sequentialKeyImportWithServer.d.ts +15 -0
- package/dist/fast/api/sequentialKeyImportWithServer.d.ts.map +1 -0
- package/dist/fast/api/sequentialKeyImportWithServer.js +7 -0
- package/dist/fast/api/sequentialKeyImportWithServer.js.map +1 -0
- package/dist/fast/api/setupVaultWithServer.d.ts +2 -1
- package/dist/fast/api/setupVaultWithServer.d.ts.map +1 -1
- package/dist/fast/api/setupVaultWithServer.js +1 -1
- package/dist/fast/api/setupVaultWithServer.js.map +1 -1
- package/dist/keygen/KeygenStep.d.ts +1 -1
- package/dist/keygen/KeygenStep.d.ts.map +1 -1
- package/dist/keygen/KeygenStep.js +7 -1
- package/dist/keygen/KeygenStep.js.map +1 -1
- package/dist/keysign/chainSpecific/KeysignChainSpecific.d.ts +1 -0
- package/dist/keysign/chainSpecific/KeysignChainSpecific.d.ts.map +1 -1
- package/dist/keysign/chainSpecific/KeysignChainSpecific.js +1 -0
- package/dist/keysign/chainSpecific/KeysignChainSpecific.js.map +1 -1
- package/dist/keysign/chainSpecific/index.d.ts.map +1 -1
- package/dist/keysign/chainSpecific/index.js +2 -0
- package/dist/keysign/chainSpecific/index.js.map +1 -1
- package/dist/keysign/chainSpecific/resolvers/qbtc.d.ts +3 -0
- package/dist/keysign/chainSpecific/resolvers/qbtc.d.ts.map +1 -0
- package/dist/keysign/chainSpecific/resolvers/qbtc.js +25 -0
- package/dist/keysign/chainSpecific/resolvers/qbtc.js.map +1 -0
- package/dist/keysign/chainSpecific/resolvers/solana/index.js +1 -1
- package/dist/keysign/chainSpecific/resolvers/solana/index.js.map +1 -1
- package/dist/keysign/cosigner.js +1 -1
- package/dist/keysign/cosigner.js.map +1 -1
- package/dist/keysign/fee/index.d.ts.map +1 -1
- package/dist/keysign/fee/index.js +2 -0
- package/dist/keysign/fee/index.js.map +1 -1
- package/dist/keysign/fee/resolvers/qbtc.d.ts +3 -0
- package/dist/keysign/fee/resolvers/qbtc.d.ts.map +1 -0
- package/dist/keysign/fee/resolvers/qbtc.js +6 -0
- package/dist/keysign/fee/resolvers/qbtc.js.map +1 -0
- package/dist/keysign/index.d.ts.map +1 -1
- package/dist/keysign/index.js +28 -19
- package/dist/keysign/index.js.map +1 -1
- package/dist/keysign/preSigningOutput/index.d.ts +1 -0
- package/dist/keysign/preSigningOutput/index.d.ts.map +1 -1
- package/dist/keysign/preSigningOutput/index.js +1 -0
- package/dist/keysign/preSigningOutput/index.js.map +1 -1
- package/dist/keysign/send/build.d.ts +4 -2
- package/dist/keysign/send/build.d.ts.map +1 -1
- package/dist/keysign/send/build.js +19 -10
- package/dist/keysign/send/build.js.map +1 -1
- package/dist/keysign/send/getSendFeeEstimate.d.ts.map +1 -1
- package/dist/keysign/send/getSendFeeEstimate.js +9 -1
- package/dist/keysign/send/getSendFeeEstimate.js.map +1 -1
- package/dist/keysign/setupMessage/make.d.ts.map +1 -1
- package/dist/keysign/setupMessage/make.js +12 -2
- package/dist/keysign/setupMessage/make.js.map +1 -1
- package/dist/keysign/signingInputs/core.d.ts +1 -0
- package/dist/keysign/signingInputs/core.d.ts.map +1 -1
- package/dist/keysign/signingInputs/core.js +1 -0
- package/dist/keysign/signingInputs/core.js.map +1 -1
- package/dist/keysign/signingInputs/index.d.ts.map +1 -1
- package/dist/keysign/signingInputs/index.js +3 -1
- package/dist/keysign/signingInputs/index.js.map +1 -1
- package/dist/keysign/signingInputs/resolvers/evm/incrementKeysignPayloadNonce.d.ts +3 -0
- package/dist/keysign/signingInputs/resolvers/evm/incrementKeysignPayloadNonce.d.ts.map +1 -0
- package/dist/keysign/signingInputs/resolvers/evm/incrementKeysignPayloadNonce.js +17 -0
- package/dist/keysign/signingInputs/resolvers/evm/incrementKeysignPayloadNonce.js.map +1 -0
- package/dist/keysign/signingInputs/resolvers/evm/index.js +1 -1
- package/dist/keysign/signingInputs/resolvers/evm/index.js.map +1 -1
- package/dist/keysign/signingInputs/resolvers/qbtc.d.ts +5 -0
- package/dist/keysign/signingInputs/resolvers/qbtc.d.ts.map +1 -0
- package/dist/keysign/signingInputs/resolvers/qbtc.js +4 -0
- package/dist/keysign/signingInputs/resolvers/qbtc.js.map +1 -0
- package/dist/keysign/signingInputs/resolvers/ton/index.d.ts.map +1 -1
- package/dist/keysign/signingInputs/resolvers/ton/index.js +25 -13
- package/dist/keysign/signingInputs/resolvers/ton/index.js.map +1 -1
- package/dist/keysign/signingInputs/resolvers/ton/jetton.d.ts.map +1 -1
- package/dist/keysign/signingInputs/resolvers/ton/jetton.js +2 -1
- package/dist/keysign/signingInputs/resolvers/ton/jetton.js.map +1 -1
- package/dist/keysign/signingInputs/resolvers/ton/native.d.ts +9 -0
- package/dist/keysign/signingInputs/resolvers/ton/native.d.ts.map +1 -1
- package/dist/keysign/signingInputs/resolvers/ton/native.js +31 -3
- package/dist/keysign/signingInputs/resolvers/ton/native.js.map +1 -1
- package/dist/keysign/swap/build.js +1 -1
- package/dist/keysign/swap/build.js.map +1 -1
- package/dist/keysign/utxo/getKeysignUtxoInfo.d.ts.map +1 -1
- package/dist/keysign/utxo/getKeysignUtxoInfo.js +11 -2
- package/dist/keysign/utxo/getKeysignUtxoInfo.js.map +1 -1
- package/dist/lib/initialize.d.ts.map +1 -1
- package/dist/lib/initialize.js +2 -0
- package/dist/lib/initialize.js.map +1 -1
- package/dist/lib/keyshare.d.ts +2 -1
- package/dist/lib/keyshare.d.ts.map +1 -1
- package/dist/lib/keyshare.js +2 -0
- package/dist/lib/keyshare.js.map +1 -1
- package/dist/lib/signSession.d.ts +3 -2
- package/dist/lib/signSession.d.ts.map +1 -1
- package/dist/lib/signSession.js +4 -1
- package/dist/lib/signSession.js.map +1 -1
- package/dist/mldsa/mldsaKeygen.d.ts +4 -0
- package/dist/mldsa/mldsaKeygen.d.ts.map +1 -1
- package/dist/mldsa/mldsaKeygen.js +9 -5
- package/dist/mldsa/mldsaKeygen.js.map +1 -1
- package/dist/mpcLib.d.ts +3 -3
- package/dist/mpcLib.d.ts.map +1 -1
- package/dist/schnorr/schnorrKeygen.d.ts +5 -3
- package/dist/schnorr/schnorrKeygen.d.ts.map +1 -1
- package/dist/schnorr/schnorrKeygen.js +72 -40
- package/dist/schnorr/schnorrKeygen.js.map +1 -1
- package/dist/security/blockaid/tx/simulation/input/index.d.ts +4 -0
- package/dist/security/blockaid/tx/simulation/input/index.d.ts.map +1 -0
- package/dist/security/blockaid/tx/simulation/input/index.js +26 -0
- package/dist/security/blockaid/tx/simulation/input/index.js.map +1 -0
- package/dist/security/blockaid/tx/simulation/input/resolver.d.ts +18 -0
- package/dist/security/blockaid/tx/simulation/input/resolver.d.ts.map +1 -0
- package/dist/security/blockaid/tx/simulation/input/resolver.js +2 -0
- package/dist/security/blockaid/tx/simulation/input/resolver.js.map +1 -0
- package/dist/security/blockaid/tx/simulation/input/resolvers/evm.d.ts +4 -0
- package/dist/security/blockaid/tx/simulation/input/resolvers/evm.d.ts.map +1 -0
- package/dist/security/blockaid/tx/simulation/input/resolvers/evm.js +67 -0
- package/dist/security/blockaid/tx/simulation/input/resolvers/evm.js.map +1 -0
- package/dist/security/blockaid/tx/simulation/input/resolvers/solana.d.ts +4 -0
- package/dist/security/blockaid/tx/simulation/input/resolvers/solana.d.ts.map +1 -0
- package/dist/security/blockaid/tx/simulation/input/resolvers/solana.js +31 -0
- package/dist/security/blockaid/tx/simulation/input/resolvers/solana.js.map +1 -0
- package/dist/security/blockaid/tx/utils/getCompiledTxsForBlockaidInput.d.ts +9 -0
- package/dist/security/blockaid/tx/utils/getCompiledTxsForBlockaidInput.d.ts.map +1 -0
- package/dist/security/blockaid/tx/utils/getCompiledTxsForBlockaidInput.js +50 -0
- package/dist/security/blockaid/tx/utils/getCompiledTxsForBlockaidInput.js.map +1 -0
- package/dist/security/blockaid/tx/validation/input/index.d.ts +4 -0
- package/dist/security/blockaid/tx/validation/input/index.d.ts.map +1 -0
- package/dist/security/blockaid/tx/validation/input/index.js +30 -0
- package/dist/security/blockaid/tx/validation/input/index.js.map +1 -0
- package/dist/security/blockaid/tx/validation/input/resolver.d.ts +16 -0
- package/dist/security/blockaid/tx/validation/input/resolver.d.ts.map +1 -0
- package/dist/security/blockaid/tx/validation/input/resolver.js +2 -0
- package/dist/security/blockaid/tx/validation/input/resolver.js.map +1 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/evm.d.ts +4 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/evm.d.ts.map +1 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/evm.js +58 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/evm.js.map +1 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/solana.d.ts +4 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/solana.d.ts.map +1 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/solana.js +20 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/solana.js.map +1 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/sui.d.ts +4 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/sui.d.ts.map +1 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/sui.js +20 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/sui.js.map +1 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/utxo.d.ts +4 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/utxo.d.ts.map +1 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/utxo.js +19 -0
- package/dist/security/blockaid/tx/validation/input/resolvers/utxo.js.map +1 -0
- package/dist/swap/native/utils/nativeSwapQuoteToSwapPayload.d.ts +16 -0
- package/dist/swap/native/utils/nativeSwapQuoteToSwapPayload.d.ts.map +1 -0
- package/dist/swap/native/utils/nativeSwapQuoteToSwapPayload.js +31 -0
- package/dist/swap/native/utils/nativeSwapQuoteToSwapPayload.js.map +1 -0
- package/dist/swap/utils/getSwapTrackingUrl.d.ts +10 -0
- package/dist/swap/utils/getSwapTrackingUrl.d.ts.map +1 -0
- package/dist/swap/utils/getSwapTrackingUrl.js +29 -0
- package/dist/swap/utils/getSwapTrackingUrl.js.map +1 -0
- package/dist/tx/compile/compileTx.d.ts +14 -0
- package/dist/tx/compile/compileTx.d.ts.map +1 -0
- package/dist/tx/compile/compileTx.js +85 -0
- package/dist/tx/compile/compileTx.js.map +1 -0
- package/dist/tx/preSigningHashes/index.d.ts +10 -0
- package/dist/tx/preSigningHashes/index.d.ts.map +1 -0
- package/dist/tx/preSigningHashes/index.js +41 -0
- package/dist/tx/preSigningHashes/index.js.map +1 -0
- package/dist/tx/signature/generateSignature.d.ts +11 -0
- package/dist/tx/signature/generateSignature.d.ts.map +1 -0
- package/dist/tx/signature/generateSignature.js +20 -0
- package/dist/tx/signature/generateSignature.js.map +1 -0
- package/dist/types/utils/libType.d.ts +1 -2
- package/dist/types/utils/libType.d.ts.map +1 -1
- package/dist/types/utils/libType.js +2 -6
- package/dist/types/utils/libType.js.map +1 -1
- package/dist/types/vultisig/keysign/v1/keysign_message_pb.d.ts +7 -1
- package/dist/types/vultisig/keysign/v1/keysign_message_pb.d.ts.map +1 -1
- package/dist/types/vultisig/keysign/v1/keysign_message_pb.js +1 -1
- package/dist/types/vultisig/keysign/v1/keysign_message_pb.js.map +1 -1
- package/dist/types/vultisig/keysign/v1/wasm_execute_contract_payload_pb.d.ts +36 -0
- package/dist/types/vultisig/keysign/v1/wasm_execute_contract_payload_pb.d.ts.map +1 -1
- package/dist/types/vultisig/keysign/v1/wasm_execute_contract_payload_pb.js +12 -2
- package/dist/types/vultisig/keysign/v1/wasm_execute_contract_payload_pb.js.map +1 -1
- package/dist/vault/Vault.d.ts +4 -2
- package/dist/vault/Vault.d.ts.map +1 -1
- package/dist/vault/Vault.js.map +1 -1
- package/package.json +929 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# @vultisig/core-mpc
|
|
2
2
|
|
|
3
|
+
## 1.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- [#157](https://github.com/vultisig/vultisig-sdk/pull/157) [`5286b98`](https://github.com/vultisig/vultisig-sdk/commit/5286b98d19692acd216a2c95d5a7a903217bef36) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Regenerate explicit `package.json` exports for `@vultisig/core-config` and `@vultisig/lib-utils` so directory and flat subpaths resolve under Node, TypeScript, and Vite.
|
|
8
|
+
|
|
9
|
+
**Breaking (`@vultisig/core-chain`, `@vultisig/core-mpc`):** Remove the npm dependency cycle by dropping `@vultisig/core-mpc` from `core-chain`. Modules that required MPC types or keysign helpers now live under `@vultisig/core-mpc` (for example `tx/compile/compileTx`, `tx/preSigningHashes`, `chains/cosmos/qbtc/QBTCHelper`, Blockaid keysign input builders, `swap/native/utils/nativeSwapQuoteToSwapPayload`, `swap/utils/getSwapTrackingUrl`, and EVM `incrementKeysignPayloadNonce` at `keysign/signingInputs/resolvers/evm/incrementKeysignPayloadNonce`). `getUtxos` / `getCardanoUtxos` return plain `ChainPlainUtxo`; keysign maps to protobuf in MPC.
|
|
10
|
+
|
|
11
|
+
**SDK:** QBTC support, shared import updates, and alignment with the new package boundaries.
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Updated dependencies [[`5286b98`](https://github.com/vultisig/vultisig-sdk/commit/5286b98d19692acd216a2c95d5a7a903217bef36)]:
|
|
16
|
+
- @vultisig/core-config@0.9.1
|
|
17
|
+
- @vultisig/lib-utils@0.9.1
|
|
18
|
+
- @vultisig/core-chain@1.0.0
|
|
19
|
+
|
|
20
|
+
## 0.10.0
|
|
21
|
+
|
|
22
|
+
### Minor Changes
|
|
23
|
+
|
|
24
|
+
- [#149](https://github.com/vultisig/vultisig-sdk/pull/149) [`67dc6ce`](https://github.com/vultisig/vultisig-sdk/commit/67dc6ceaa1b318144cfbe3812ddecb14b108eba4) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Sync Windows-style TSS batching: batched FastVault APIs (`/batch/keygen`, `/batch/import`, `/batch/reshare`), batched relay message IDs for ECDSA, EdDSA, MLDSA, and per-chain import, secure vault QR `tssBatching=1` for joiner alignment, sequential fallbacks, and test coverage.
|
|
25
|
+
|
|
26
|
+
### Patch Changes
|
|
27
|
+
|
|
28
|
+
- Updated dependencies [[`67dc6ce`](https://github.com/vultisig/vultisig-sdk/commit/67dc6ceaa1b318144cfbe3812ddecb14b108eba4)]:
|
|
29
|
+
- @vultisig/core-chain@0.10.0
|
|
30
|
+
|
|
3
31
|
## 0.9.0
|
|
4
32
|
|
|
5
33
|
### Minor Changes
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Cosmos transaction builder for QBTC chain.
|
|
3
|
+
* Bypasses WalletCore's TransactionCompiler because MLDSA keys
|
|
4
|
+
* are incompatible with WalletCore's secp256k1 verification.
|
|
5
|
+
* Builds Cosmos protobuf (SignDoc, TxRaw) manually.
|
|
6
|
+
*/
|
|
7
|
+
import { KeysignSignature } from '../../../keysign/KeysignSignature.js';
|
|
8
|
+
import { CosmosSpecific } from '../../../types/vultisig/keysign/v1/blockchain_specific_pb.js';
|
|
9
|
+
import { KeysignPayload } from '../../../types/vultisig/keysign/v1/keysign_message_pb.js';
|
|
10
|
+
type QBTCKeysignInput = {
|
|
11
|
+
keysignPayload: KeysignPayload;
|
|
12
|
+
cosmosSpecific: CosmosSpecific;
|
|
13
|
+
};
|
|
14
|
+
/** Returns the SHA256 hash(es) of the SignDoc that must be signed. */
|
|
15
|
+
export declare const getQBTCPreSignedImageHash: ({ keysignPayload, cosmosSpecific, }: QBTCKeysignInput) => Uint8Array[];
|
|
16
|
+
type QBTCSignedTransactionInput = QBTCKeysignInput & {
|
|
17
|
+
signatures: Record<string, KeysignSignature>;
|
|
18
|
+
};
|
|
19
|
+
/** Assembles the signed transaction ready for broadcast. */
|
|
20
|
+
export declare const getQBTCSignedTransaction: ({ keysignPayload, cosmosSpecific, signatures, }: QBTCSignedTransactionInput) => {
|
|
21
|
+
serialized: string;
|
|
22
|
+
transactionHash: string;
|
|
23
|
+
};
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=QBTCHelper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QBTCHelper.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/chains/cosmos/qbtc/QBTCHelper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,2DAA2D,CAAA;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,uDAAuD,CAAA;AAWtF,KAAK,gBAAgB,GAAG;IACtB,cAAc,EAAE,cAAc,CAAA;IAC9B,cAAc,EAAE,cAAc,CAAA;CAC/B,CAAA;AAED,sEAAsE;AACtE,eAAO,MAAM,yBAAyB,GAAI,qCAGvC,gBAAgB,KAAG,UAAU,EAG/B,CAAA;AAED,KAAK,0BAA0B,GAAG,gBAAgB,GAAG;IACnD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;CAC7C,CAAA;AAED,4DAA4D;AAC5D,eAAO,MAAM,wBAAwB,GAAI,iDAItC,0BAA0B,KAAG;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;CA+BxB,CAAA"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Cosmos transaction builder for QBTC chain.
|
|
3
|
+
* Bypasses WalletCore's TransactionCompiler because MLDSA keys
|
|
4
|
+
* are incompatible with WalletCore's secp256k1 verification.
|
|
5
|
+
* Builds Cosmos protobuf (SignDoc, TxRaw) manually.
|
|
6
|
+
*/
|
|
7
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
8
|
+
import { shouldBePresent } from '@vultisig/lib-utils/assert/shouldBePresent';
|
|
9
|
+
import { concatBytes, protoBytes, protoString, protoVarint, } from '@vultisig/core-chain/chains/cosmos/qbtc/protoEncoding';
|
|
10
|
+
const pubKeyTypeURL = '/cosmos.crypto.mldsa.PubKey';
|
|
11
|
+
const msgSendTypeURL = '/cosmos.bank.v1beta1.MsgSend';
|
|
12
|
+
const msgTransferTypeURL = '/ibc.applications.transfer.v1.MsgTransfer';
|
|
13
|
+
const msgVoteTypeURL = '/cosmos.gov.v1beta1.MsgVote';
|
|
14
|
+
/** QBTC fee denom and chain ID (Cosmos SDK). */
|
|
15
|
+
const denom = 'qbtc';
|
|
16
|
+
const chainID = 'qbtc-testnet';
|
|
17
|
+
/** Returns the SHA256 hash(es) of the SignDoc that must be signed. */
|
|
18
|
+
export const getQBTCPreSignedImageHash = ({ keysignPayload, cosmosSpecific, }) => {
|
|
19
|
+
const signDoc = buildSignDoc({ keysignPayload, cosmosSpecific });
|
|
20
|
+
return [sha256(signDoc)];
|
|
21
|
+
};
|
|
22
|
+
/** Assembles the signed transaction ready for broadcast. */
|
|
23
|
+
export const getQBTCSignedTransaction = ({ keysignPayload, cosmosSpecific, signatures, }) => {
|
|
24
|
+
const { bodyBytes, authInfoBytes } = buildTxComponents({
|
|
25
|
+
keysignPayload,
|
|
26
|
+
cosmosSpecific,
|
|
27
|
+
});
|
|
28
|
+
const signDoc = buildSignDocFromComponents({
|
|
29
|
+
bodyBytes,
|
|
30
|
+
authInfoBytes,
|
|
31
|
+
accountNumber: cosmosSpecific.accountNumber,
|
|
32
|
+
});
|
|
33
|
+
const hashHex = Buffer.from(sha256(signDoc)).toString('hex');
|
|
34
|
+
const sig = shouldBePresent(signatures[hashHex], `QBTC signature for hash ${hashHex}`);
|
|
35
|
+
const sigData = Buffer.from(sig.der_signature, 'hex');
|
|
36
|
+
const txRaw = buildTxRaw({ bodyBytes, authInfoBytes, signature: sigData });
|
|
37
|
+
const txBytesBase64 = Buffer.from(txRaw).toString('base64');
|
|
38
|
+
const serialized = JSON.stringify({
|
|
39
|
+
tx_bytes: txBytesBase64,
|
|
40
|
+
mode: 'BROADCAST_MODE_SYNC',
|
|
41
|
+
});
|
|
42
|
+
const transactionHash = Buffer.from(sha256(txRaw))
|
|
43
|
+
.toString('hex')
|
|
44
|
+
.toUpperCase();
|
|
45
|
+
return { serialized, transactionHash };
|
|
46
|
+
};
|
|
47
|
+
const buildSignDoc = ({ keysignPayload, cosmosSpecific }) => {
|
|
48
|
+
const { bodyBytes, authInfoBytes } = buildTxComponents({
|
|
49
|
+
keysignPayload,
|
|
50
|
+
cosmosSpecific,
|
|
51
|
+
});
|
|
52
|
+
return buildSignDocFromComponents({
|
|
53
|
+
bodyBytes,
|
|
54
|
+
authInfoBytes,
|
|
55
|
+
accountNumber: cosmosSpecific.accountNumber,
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
const buildTxComponents = ({ keysignPayload, cosmosSpecific, }) => {
|
|
59
|
+
const coin = shouldBePresent(keysignPayload.coin);
|
|
60
|
+
const pubKeyData = Buffer.from(coin.hexPublicKey, 'hex');
|
|
61
|
+
const bodyBytes = buildTxBody({ keysignPayload, cosmosSpecific });
|
|
62
|
+
const authInfoBytes = buildAuthInfo({
|
|
63
|
+
pubKeyData,
|
|
64
|
+
sequence: cosmosSpecific.sequence,
|
|
65
|
+
gas: cosmosSpecific.gas,
|
|
66
|
+
});
|
|
67
|
+
return { bodyBytes, authInfoBytes };
|
|
68
|
+
};
|
|
69
|
+
const buildSignDocFromComponents = ({ bodyBytes, authInfoBytes, accountNumber, }) => concatBytes(protoBytes(1, bodyBytes), protoBytes(2, authInfoBytes), protoString(3, chainID), protoVarint(4, accountNumber));
|
|
70
|
+
const buildTxBody = ({ keysignPayload, cosmosSpecific, }) => {
|
|
71
|
+
const { transactionType, ibcDenomTraces } = cosmosSpecific;
|
|
72
|
+
let { memo } = keysignPayload;
|
|
73
|
+
let anyMsg;
|
|
74
|
+
if (transactionType === 3) {
|
|
75
|
+
anyMsg = buildIBCTransferAny({ keysignPayload, ibcDenomTraces });
|
|
76
|
+
const parts = memo?.split(':');
|
|
77
|
+
memo = parts && parts.length === 4 ? parts[3] : undefined;
|
|
78
|
+
}
|
|
79
|
+
else if (transactionType === 1) {
|
|
80
|
+
anyMsg = buildVoteAny(keysignPayload);
|
|
81
|
+
memo = undefined;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
anyMsg = buildMsgSendAny(keysignPayload);
|
|
85
|
+
}
|
|
86
|
+
return concatBytes(protoBytes(1, anyMsg), memo ? protoString(2, memo) : new Uint8Array(0));
|
|
87
|
+
};
|
|
88
|
+
const buildMsgSendAny = (keysignPayload) => {
|
|
89
|
+
const msgSend = buildMsgSend(keysignPayload);
|
|
90
|
+
return concatBytes(protoString(1, msgSendTypeURL), protoBytes(2, msgSend));
|
|
91
|
+
};
|
|
92
|
+
const buildMsgSend = (keysignPayload) => {
|
|
93
|
+
const coin = shouldBePresent(keysignPayload.coin);
|
|
94
|
+
const coinDenom = coin.isNativeToken ? denom : coin.contractAddress;
|
|
95
|
+
const coinProto = concatBytes(protoString(1, coinDenom), protoString(2, keysignPayload.toAmount));
|
|
96
|
+
return concatBytes(protoString(1, coin.address), protoString(2, keysignPayload.toAddress), protoBytes(3, coinProto));
|
|
97
|
+
};
|
|
98
|
+
const buildIBCTransferAny = ({ keysignPayload, ibcDenomTraces, }) => {
|
|
99
|
+
const msgTransfer = buildMsgTransfer({ keysignPayload, ibcDenomTraces });
|
|
100
|
+
return concatBytes(protoString(1, msgTransferTypeURL), protoBytes(2, msgTransfer));
|
|
101
|
+
};
|
|
102
|
+
const buildMsgTransfer = ({ keysignPayload, ibcDenomTraces, }) => {
|
|
103
|
+
const memo = shouldBePresent(keysignPayload.memo, 'IBC transfer memo');
|
|
104
|
+
const parts = memo.split(':');
|
|
105
|
+
if (parts.length < 2) {
|
|
106
|
+
throw new Error('QBTC: IBC transfer requires memo with source channel (ibc:channel-N:...)');
|
|
107
|
+
}
|
|
108
|
+
const sourceChannel = parts[1];
|
|
109
|
+
const timeouts = ibcDenomTraces?.latestBlock?.split('_') ?? [];
|
|
110
|
+
const timeoutStr = timeouts[timeouts.length - 1];
|
|
111
|
+
if (!timeoutStr || timeoutStr === '0') {
|
|
112
|
+
throw new Error('QBTC: IBC transfer requires valid timeout timestamp');
|
|
113
|
+
}
|
|
114
|
+
const timeout = BigInt(timeoutStr);
|
|
115
|
+
const coin = shouldBePresent(keysignPayload.coin);
|
|
116
|
+
const tokenDenom = coin.isNativeToken ? denom : coin.contractAddress;
|
|
117
|
+
const token = concatBytes(protoString(1, tokenDenom), protoString(2, keysignPayload.toAmount));
|
|
118
|
+
return concatBytes(protoString(1, 'transfer'), protoString(2, sourceChannel), protoBytes(3, token), protoString(4, coin.address), protoString(5, keysignPayload.toAddress), protoVarint(7, timeout));
|
|
119
|
+
};
|
|
120
|
+
const buildVoteAny = (keysignPayload) => {
|
|
121
|
+
const msgVote = buildMsgVote(keysignPayload);
|
|
122
|
+
return concatBytes(protoString(1, msgVoteTypeURL), protoBytes(2, msgVote));
|
|
123
|
+
};
|
|
124
|
+
const voteOptionValues = {
|
|
125
|
+
YES: 1n,
|
|
126
|
+
ABSTAIN: 2n,
|
|
127
|
+
NO: 3n,
|
|
128
|
+
NO_WITH_VETO: 4n,
|
|
129
|
+
NOWITHVETO: 4n,
|
|
130
|
+
};
|
|
131
|
+
const buildMsgVote = (keysignPayload) => {
|
|
132
|
+
const coin = shouldBePresent(keysignPayload.coin);
|
|
133
|
+
const voteStr = (keysignPayload.memo ?? '').replace('QBTC_VOTE:', '');
|
|
134
|
+
const parts = voteStr.split(':');
|
|
135
|
+
if (parts.length !== 2) {
|
|
136
|
+
throw new Error('QBTC: invalid vote memo format, expected OPTION:PROPOSAL_ID');
|
|
137
|
+
}
|
|
138
|
+
const optionKey = parts[0].toUpperCase();
|
|
139
|
+
const option = voteOptionValues[optionKey];
|
|
140
|
+
if (option === undefined) {
|
|
141
|
+
throw new Error(`QBTC: invalid vote option '${parts[0]}', expected one of: ${Object.keys(voteOptionValues).join(', ')}`);
|
|
142
|
+
}
|
|
143
|
+
const proposalId = BigInt(parts[1]);
|
|
144
|
+
return concatBytes(protoVarint(1, proposalId), protoString(2, coin.address), protoVarint(3, option));
|
|
145
|
+
};
|
|
146
|
+
const buildAuthInfo = ({ pubKeyData, sequence, gas, }) => {
|
|
147
|
+
const pubKeyMsg = protoBytes(1, pubKeyData);
|
|
148
|
+
const pubKeyAny = concatBytes(protoString(1, pubKeyTypeURL), protoBytes(2, pubKeyMsg));
|
|
149
|
+
const singleMode = protoVarint(1, 1n);
|
|
150
|
+
const modeInfo = protoBytes(1, singleMode);
|
|
151
|
+
const signerInfo = concatBytes(protoBytes(1, pubKeyAny), protoBytes(2, modeInfo), protoVarint(3, sequence));
|
|
152
|
+
const feeCoin = concatBytes(protoString(1, denom), protoString(2, gas.toString()));
|
|
153
|
+
const gasLimit = 300000n;
|
|
154
|
+
const fee = concatBytes(protoBytes(1, feeCoin), protoVarint(2, gasLimit));
|
|
155
|
+
return concatBytes(protoBytes(1, signerInfo), protoBytes(2, fee));
|
|
156
|
+
};
|
|
157
|
+
const buildTxRaw = ({ bodyBytes, authInfoBytes, signature, }) => concatBytes(protoBytes(1, bodyBytes), protoBytes(2, authInfoBytes), protoBytes(3, signature));
|
|
158
|
+
//# sourceMappingURL=QBTCHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QBTCHelper.js","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/chains/cosmos/qbtc/QBTCHelper.ts"],"names":[],"mappings":"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"}
|
package/dist/dkls/dkls.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export declare class DKLS {
|
|
|
15
15
|
private inboundSequenceNo;
|
|
16
16
|
private cache;
|
|
17
17
|
private setupMessage;
|
|
18
|
+
private pendingKeyImportSession;
|
|
18
19
|
private readonly localUI?;
|
|
19
20
|
private readonly publicKey?;
|
|
20
21
|
private readonly chainCode?;
|
|
@@ -27,21 +28,23 @@ export declare class DKLS {
|
|
|
27
28
|
});
|
|
28
29
|
private processOutbound;
|
|
29
30
|
private processInbound;
|
|
31
|
+
prepareKeygenSetup(): Promise<void>;
|
|
30
32
|
private startKeygen;
|
|
31
|
-
startKeygenWithRetry(): Promise<{
|
|
33
|
+
startKeygenWithRetry(messageId?: string): Promise<{
|
|
32
34
|
keyshare: string;
|
|
33
35
|
publicKey: string;
|
|
34
36
|
chaincode: string;
|
|
35
37
|
}>;
|
|
36
38
|
getSetupMessage(): Uint8Array<ArrayBufferLike>;
|
|
37
39
|
private startReshare;
|
|
38
|
-
startReshareWithRetry(keyshare: string | undefined): Promise<{
|
|
40
|
+
startReshareWithRetry(keyshare: string | undefined, messageId?: string): Promise<{
|
|
39
41
|
keyshare: string;
|
|
40
42
|
publicKey: string;
|
|
41
43
|
chaincode: string;
|
|
42
44
|
}>;
|
|
45
|
+
prepareKeyImportSetup(hexPrivateKey: string, hexChainCode: string, messageId?: string): Promise<void>;
|
|
43
46
|
private startKeyImport;
|
|
44
|
-
startKeyImportWithRetry(privateKey: string, chainCode: string,
|
|
47
|
+
startKeyImportWithRetry(privateKey: string, chainCode: string, setupMessageId?: string, protocolMessageId?: string): Promise<{
|
|
45
48
|
keyshare: string;
|
|
46
49
|
publicKey: string;
|
|
47
50
|
chaincode: string;
|
package/dist/dkls/dkls.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dkls.d.ts","sourceRoot":"","sources":["../../../../../packages/core/mpc/dkls/dkls.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAY3D,qBAAa,IAAI;IACf,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAElC;IACT,OAAO,CAAC,gBAAgB,CAAiB;IACzC,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAQ;gBAEjC,eAAe,EAAE,eAAe,EAChC,gBAAgB,EAAE,OAAO,EACzB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EAAE,EACzB,kBAAkB,EAAE,MAAM,EAAE,EAC5B,gBAAgB,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,yBAAyB,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,IAAI,CAAA;KAChE;YAiBW,eAAe;
|
|
1
|
+
{"version":3,"file":"dkls.d.ts","sourceRoot":"","sources":["../../../../../packages/core/mpc/dkls/dkls.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAY3D,qBAAa,IAAI;IACf,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAElC;IACT,OAAO,CAAC,gBAAgB,CAAiB;IACzC,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,uBAAuB,CAAkC;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAQ;gBAEjC,eAAe,EAAE,eAAe,EAChC,gBAAgB,EAAE,OAAO,EACzB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EAAE,EACzB,kBAAkB,EAAE,MAAM,EAAE,EAC5B,gBAAgB,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,yBAAyB,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,IAAI,CAAA;KAChE;YAiBW,eAAe;YA6Cf,cAAc;IA8Df,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;YAmClC,WAAW;IA6DZ,oBAAoB,CAAC,SAAS,CAAC,EAAE,MAAM;;;;;IAY7C,eAAe;YAIR,YAAY;IAiGb,qBAAqB,CAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,CAAC,EAAE,MAAM;;;;;IAcP,qBAAqB,CAChC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;YA+BF,cAAc;IAuFf,uBAAuB,CAClC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,MAAM,EACvB,iBAAiB,CAAC,EAAE,MAAM;;;;;CAmB7B"}
|
package/dist/dkls/dkls.js
CHANGED
|
@@ -27,6 +27,7 @@ export class DKLS {
|
|
|
27
27
|
inboundSequenceNo = 0;
|
|
28
28
|
cache = {};
|
|
29
29
|
setupMessage = new Uint8Array();
|
|
30
|
+
pendingKeyImportSession = null;
|
|
30
31
|
localUI;
|
|
31
32
|
publicKey;
|
|
32
33
|
chainCode;
|
|
@@ -45,7 +46,7 @@ export class DKLS {
|
|
|
45
46
|
this.timeoutMs = options?.timeoutMs ?? 60000;
|
|
46
47
|
this.onInboundSequenceNoChange = options?.onInboundSequenceNoChange;
|
|
47
48
|
}
|
|
48
|
-
async processOutbound(session) {
|
|
49
|
+
async processOutbound(session, messageId) {
|
|
49
50
|
try {
|
|
50
51
|
const message = session.outputMessage();
|
|
51
52
|
if (message === undefined) {
|
|
@@ -55,7 +56,7 @@ export class DKLS {
|
|
|
55
56
|
}
|
|
56
57
|
else {
|
|
57
58
|
await sleep(100);
|
|
58
|
-
return await this.processOutbound(session);
|
|
59
|
+
return await this.processOutbound(session, messageId);
|
|
59
60
|
}
|
|
60
61
|
}
|
|
61
62
|
console.log('outbound message:', message);
|
|
@@ -74,29 +75,31 @@ export class DKLS {
|
|
|
74
75
|
serverUrl: this.serverURL,
|
|
75
76
|
message: relayMessage,
|
|
76
77
|
sessionId: this.sessionId,
|
|
78
|
+
messageId,
|
|
77
79
|
});
|
|
78
80
|
this.sequenceNo++;
|
|
79
81
|
});
|
|
80
82
|
await sleep(100);
|
|
81
|
-
return await this.processOutbound(session);
|
|
83
|
+
return await this.processOutbound(session, messageId);
|
|
82
84
|
}
|
|
83
85
|
catch (error) {
|
|
84
86
|
console.error('processOutbound error:', error);
|
|
85
87
|
await sleep(100);
|
|
86
|
-
return await this.processOutbound(session);
|
|
88
|
+
return await this.processOutbound(session, messageId);
|
|
87
89
|
}
|
|
88
90
|
}
|
|
89
|
-
async processInbound(session, start) {
|
|
91
|
+
async processInbound(session, start, messageId) {
|
|
90
92
|
try {
|
|
91
93
|
const parsedMessages = await getMpcRelayMessages({
|
|
92
94
|
serverUrl: this.serverURL,
|
|
93
95
|
localPartyId: this.localPartyId,
|
|
94
96
|
sessionId: this.sessionId,
|
|
97
|
+
messageId,
|
|
95
98
|
});
|
|
96
99
|
if (parsedMessages.length === 0) {
|
|
97
100
|
// no message to download, backoff for 100ms
|
|
98
101
|
await sleep(100);
|
|
99
|
-
return await this.processInbound(session, start);
|
|
102
|
+
return await this.processInbound(session, start, messageId);
|
|
100
103
|
}
|
|
101
104
|
for (const msg of parsedMessages) {
|
|
102
105
|
const cacheKey = `${msg.session_id}-${msg.from}-${msg.hash}`;
|
|
@@ -120,6 +123,7 @@ export class DKLS {
|
|
|
120
123
|
localPartyId: this.localPartyId,
|
|
121
124
|
sessionId: this.sessionId,
|
|
122
125
|
messageHash: msg.hash,
|
|
126
|
+
messageId,
|
|
123
127
|
});
|
|
124
128
|
}
|
|
125
129
|
const end = Date.now();
|
|
@@ -129,39 +133,54 @@ export class DKLS {
|
|
|
129
133
|
return false;
|
|
130
134
|
}
|
|
131
135
|
await sleep(100);
|
|
132
|
-
return await this.processInbound(session, start);
|
|
136
|
+
return await this.processInbound(session, start, messageId);
|
|
133
137
|
}
|
|
134
138
|
catch (error) {
|
|
135
139
|
console.error('processInbound error:', error);
|
|
136
140
|
await sleep(100);
|
|
137
|
-
return await this.processInbound(session, start);
|
|
141
|
+
return await this.processInbound(session, start, messageId);
|
|
138
142
|
}
|
|
139
143
|
}
|
|
140
|
-
async
|
|
144
|
+
async prepareKeygenSetup() {
|
|
145
|
+
if (this.setupMessage.length > 0) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (this.isInitiateDevice) {
|
|
149
|
+
const threshold = getKeygenThreshold(this.keygenCommittee.length);
|
|
150
|
+
this.setupMessage = KeygenSession.setup(undefined, threshold, this.keygenCommittee);
|
|
151
|
+
const encryptedSetupMsg = toMpcServerMessage(this.setupMessage, this.hexEncryptionKey);
|
|
152
|
+
await uploadMpcSetupMessage({
|
|
153
|
+
serverUrl: this.serverURL,
|
|
154
|
+
message: encryptedSetupMsg,
|
|
155
|
+
sessionId: this.sessionId,
|
|
156
|
+
});
|
|
157
|
+
console.log('uploaded setup message successfully');
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const encodedEncryptedSetupMsg = await waitForSetupMessage({
|
|
161
|
+
serverUrl: this.serverURL,
|
|
162
|
+
sessionId: this.sessionId,
|
|
163
|
+
});
|
|
164
|
+
this.setupMessage = fromMpcServerMessage(encodedEncryptedSetupMsg, this.hexEncryptionKey);
|
|
165
|
+
}
|
|
166
|
+
async startKeygen(attempt, messageId) {
|
|
141
167
|
console.log('startKeygen attempt:', attempt);
|
|
142
168
|
console.log('session id:', this.sessionId);
|
|
143
169
|
this.isKeygenComplete = false;
|
|
144
170
|
this.inboundSequenceNo = 0;
|
|
145
171
|
this.onInboundSequenceNoChange?.(this.inboundSequenceNo);
|
|
146
172
|
try {
|
|
147
|
-
if (this.
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
const encodedEncryptedSetupMsg = await waitForSetupMessage({
|
|
161
|
-
serverUrl: this.serverURL,
|
|
162
|
-
sessionId: this.sessionId,
|
|
163
|
-
});
|
|
164
|
-
this.setupMessage = fromMpcServerMessage(encodedEncryptedSetupMsg, this.hexEncryptionKey);
|
|
173
|
+
if (this.setupMessage.length === 0) {
|
|
174
|
+
if (this.isInitiateDevice && attempt === 0) {
|
|
175
|
+
await this.prepareKeygenSetup();
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
const encodedEncryptedSetupMsg = await waitForSetupMessage({
|
|
179
|
+
serverUrl: this.serverURL,
|
|
180
|
+
sessionId: this.sessionId,
|
|
181
|
+
});
|
|
182
|
+
this.setupMessage = fromMpcServerMessage(encodedEncryptedSetupMsg, this.hexEncryptionKey);
|
|
183
|
+
}
|
|
165
184
|
}
|
|
166
185
|
let session;
|
|
167
186
|
if ('create' in this.keygenOperation) {
|
|
@@ -176,8 +195,8 @@ export class DKLS {
|
|
|
176
195
|
throw new Error('Invalid keygen operation');
|
|
177
196
|
}
|
|
178
197
|
const start = Date.now();
|
|
179
|
-
const outbound = this.processOutbound(session);
|
|
180
|
-
const inbound = this.processInbound(session, start);
|
|
198
|
+
const outbound = this.processOutbound(session, messageId);
|
|
199
|
+
const inbound = this.processInbound(session, start, messageId);
|
|
181
200
|
const [, inboundResult] = await Promise.all([outbound, inbound]);
|
|
182
201
|
if (inboundResult) {
|
|
183
202
|
const keyShare = session.finish();
|
|
@@ -197,11 +216,11 @@ export class DKLS {
|
|
|
197
216
|
throw error;
|
|
198
217
|
}
|
|
199
218
|
}
|
|
200
|
-
async startKeygenWithRetry() {
|
|
219
|
+
async startKeygenWithRetry(messageId) {
|
|
201
220
|
await initializeMpcLib('ecdsa');
|
|
202
221
|
for (let i = 0; i < 3; i++) {
|
|
203
222
|
try {
|
|
204
|
-
const result = await this.startKeygen(i);
|
|
223
|
+
const result = await this.startKeygen(i, messageId);
|
|
205
224
|
return result;
|
|
206
225
|
}
|
|
207
226
|
catch (error) {
|
|
@@ -213,7 +232,7 @@ export class DKLS {
|
|
|
213
232
|
getSetupMessage() {
|
|
214
233
|
return this.setupMessage;
|
|
215
234
|
}
|
|
216
|
-
async startReshare(dklsKeyshare, attempt) {
|
|
235
|
+
async startReshare(dklsKeyshare, attempt, messageId) {
|
|
217
236
|
console.log('startReshare dkls, attempt:', attempt);
|
|
218
237
|
this.isKeygenComplete = false;
|
|
219
238
|
this.inboundSequenceNo = 0;
|
|
@@ -261,8 +280,8 @@ export class DKLS {
|
|
|
261
280
|
const session = new QcSession(setupMessage, this.localPartyId, localKeyshare);
|
|
262
281
|
try {
|
|
263
282
|
const start = Date.now();
|
|
264
|
-
const outbound = this.processOutbound(session);
|
|
265
|
-
const inbound = this.processInbound(session, start);
|
|
283
|
+
const outbound = this.processOutbound(session, messageId);
|
|
284
|
+
const inbound = this.processInbound(session, start, messageId);
|
|
266
285
|
const [, inboundResult] = await Promise.all([outbound, inbound]);
|
|
267
286
|
if (inboundResult) {
|
|
268
287
|
const keyShare = session.finish();
|
|
@@ -289,11 +308,11 @@ export class DKLS {
|
|
|
289
308
|
throw error;
|
|
290
309
|
}
|
|
291
310
|
}
|
|
292
|
-
async startReshareWithRetry(keyshare) {
|
|
311
|
+
async startReshareWithRetry(keyshare, messageId) {
|
|
293
312
|
await initializeMpcLib('ecdsa');
|
|
294
313
|
for (let i = 0; i < 3; i++) {
|
|
295
314
|
try {
|
|
296
|
-
const result = await this.startReshare(keyshare, i);
|
|
315
|
+
const result = await this.startReshare(keyshare, i, messageId);
|
|
297
316
|
return result;
|
|
298
317
|
}
|
|
299
318
|
catch (error) {
|
|
@@ -302,33 +321,58 @@ export class DKLS {
|
|
|
302
321
|
}
|
|
303
322
|
throw new Error('DKLS reshare failed');
|
|
304
323
|
}
|
|
305
|
-
async
|
|
324
|
+
async prepareKeyImportSetup(hexPrivateKey, hexChainCode, messageId) {
|
|
325
|
+
if (!this.isInitiateDevice) {
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
const threshold = getKeygenThreshold(this.keygenCommittee.length);
|
|
329
|
+
const privateKey = Buffer.from(hexPrivateKey, 'hex');
|
|
330
|
+
const chainCode = Buffer.from(hexChainCode, 'hex');
|
|
331
|
+
this.pendingKeyImportSession = new KeyImportInitiator(Uint8Array.from(privateKey), Uint8Array.from(chainCode), threshold, this.keygenCommittee);
|
|
332
|
+
this.setupMessage = this.pendingKeyImportSession.setup;
|
|
333
|
+
const encryptedSetupMsg = toMpcServerMessage(this.setupMessage, this.hexEncryptionKey);
|
|
334
|
+
await uploadMpcSetupMessage({
|
|
335
|
+
serverUrl: this.serverURL,
|
|
336
|
+
message: encryptedSetupMsg,
|
|
337
|
+
sessionId: this.sessionId,
|
|
338
|
+
messageId,
|
|
339
|
+
});
|
|
340
|
+
console.log('uploaded setup message successfully');
|
|
341
|
+
}
|
|
342
|
+
async startKeyImport(hexPrivateKey, hexChainCode, attempt, setupMessageId, protocolMessageId) {
|
|
306
343
|
console.log('startKeyImport attempt:', attempt);
|
|
307
344
|
this.isKeygenComplete = false;
|
|
308
345
|
try {
|
|
309
346
|
let session = null;
|
|
310
347
|
if (this.isInitiateDevice) {
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
348
|
+
if (attempt === 0 && this.pendingKeyImportSession) {
|
|
349
|
+
const pendingSession = this.pendingKeyImportSession;
|
|
350
|
+
session = pendingSession;
|
|
351
|
+
this.setupMessage = pendingSession.setup;
|
|
352
|
+
this.pendingKeyImportSession = null;
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
const threshold = getKeygenThreshold(this.keygenCommittee.length);
|
|
356
|
+
const privateKey = Buffer.from(hexPrivateKey, 'hex');
|
|
357
|
+
const chainCode = Buffer.from(hexChainCode, 'hex');
|
|
358
|
+
const keyImportSession = new KeyImportInitiator(Uint8Array.from(privateKey), Uint8Array.from(chainCode), threshold, this.keygenCommittee);
|
|
359
|
+
this.setupMessage = keyImportSession.setup;
|
|
360
|
+
session = keyImportSession;
|
|
361
|
+
const encryptedSetupMsg = toMpcServerMessage(this.setupMessage, this.hexEncryptionKey);
|
|
362
|
+
await uploadMpcSetupMessage({
|
|
363
|
+
serverUrl: this.serverURL,
|
|
364
|
+
message: encryptedSetupMsg,
|
|
365
|
+
sessionId: this.sessionId,
|
|
366
|
+
messageId: setupMessageId,
|
|
367
|
+
});
|
|
368
|
+
console.log('uploaded setup message successfully');
|
|
369
|
+
}
|
|
326
370
|
}
|
|
327
371
|
else {
|
|
328
372
|
const encodedEncryptedSetupMsg = await waitForSetupMessage({
|
|
329
373
|
serverUrl: this.serverURL,
|
|
330
374
|
sessionId: this.sessionId,
|
|
331
|
-
messageId:
|
|
375
|
+
messageId: setupMessageId,
|
|
332
376
|
});
|
|
333
377
|
this.setupMessage = fromMpcServerMessage(encodedEncryptedSetupMsg, this.hexEncryptionKey);
|
|
334
378
|
}
|
|
@@ -343,9 +387,10 @@ export class DKLS {
|
|
|
343
387
|
if (session === null) {
|
|
344
388
|
throw new Error('DKLS key import session is null');
|
|
345
389
|
}
|
|
390
|
+
const exchangeMessageId = protocolMessageId;
|
|
346
391
|
const start = Date.now();
|
|
347
|
-
const outbound = this.processOutbound(session);
|
|
348
|
-
const inbound = this.processInbound(session, start);
|
|
392
|
+
const outbound = this.processOutbound(session, exchangeMessageId);
|
|
393
|
+
const inbound = this.processInbound(session, start, exchangeMessageId);
|
|
349
394
|
const [, inboundResult] = await Promise.all([outbound, inbound]);
|
|
350
395
|
if (inboundResult) {
|
|
351
396
|
const keyShare = session.finish();
|
|
@@ -365,11 +410,11 @@ export class DKLS {
|
|
|
365
410
|
throw error;
|
|
366
411
|
}
|
|
367
412
|
}
|
|
368
|
-
async startKeyImportWithRetry(privateKey, chainCode,
|
|
413
|
+
async startKeyImportWithRetry(privateKey, chainCode, setupMessageId, protocolMessageId) {
|
|
369
414
|
await initializeMpcLib('ecdsa');
|
|
370
415
|
for (let i = 0; i < 3; i++) {
|
|
371
416
|
try {
|
|
372
|
-
const result = await this.startKeyImport(privateKey, chainCode, i,
|
|
417
|
+
const result = await this.startKeyImport(privateKey, chainCode, i, setupMessageId, protocolMessageId);
|
|
373
418
|
return result;
|
|
374
419
|
}
|
|
375
420
|
catch (error) {
|