@vultisig/core-mpc 1.2.22 → 1.3.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 +47 -0
- package/dist/keysign/chainSpecific/resolvers/cardano.d.ts.map +1 -1
- package/dist/keysign/chainSpecific/resolvers/cardano.js +12 -1
- package/dist/keysign/chainSpecific/resolvers/cardano.js.map +1 -1
- package/dist/keysign/signingInputs/resolvers/cardano.d.ts.map +1 -1
- package/dist/keysign/signingInputs/resolvers/cardano.js +0 -7
- package/dist/keysign/signingInputs/resolvers/cardano.js.map +1 -1
- package/dist/keysign/swap/build.d.ts.map +1 -1
- package/dist/keysign/swap/build.js +31 -0
- package/dist/keysign/swap/build.js.map +1 -1
- package/dist/tx/compile/cardano/buildCip20AuxData.d.ts +51 -0
- package/dist/tx/compile/cardano/buildCip20AuxData.d.ts.map +1 -0
- package/dist/tx/compile/cardano/buildCip20AuxData.js +120 -0
- package/dist/tx/compile/cardano/buildCip20AuxData.js.map +1 -0
- package/dist/tx/compile/cardano/buildSignedCardanoTx.d.ts +7 -1
- package/dist/tx/compile/cardano/buildSignedCardanoTx.d.ts.map +1 -1
- package/dist/tx/compile/cardano/buildSignedCardanoTx.js +2 -2
- package/dist/tx/compile/cardano/buildSignedCardanoTx.js.map +1 -1
- package/dist/tx/compile/compileTx.d.ts.map +1 -1
- package/dist/tx/compile/compileTx.js +22 -7
- package/dist/tx/compile/compileTx.js.map +1 -1
- package/dist/tx/preSigningHashes/index.d.ts.map +1 -1
- package/dist/tx/preSigningHashes/index.js +19 -3
- package/dist/tx/preSigningHashes/index.js.map +1 -1
- package/dist/tx/swapkitSignBitcoin.d.ts +12 -0
- package/dist/tx/swapkitSignBitcoin.d.ts.map +1 -0
- package/dist/tx/swapkitSignBitcoin.js +106 -0
- package/dist/tx/swapkitSignBitcoin.js.map +1 -0
- package/package.json +12 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,52 @@
|
|
|
1
1
|
# @vultisig/core-mpc
|
|
2
2
|
|
|
3
|
+
## 1.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#583](https://github.com/vultisig/vultisig-sdk/pull/583) [`f2270cd`](https://github.com/vultisig/vultisig-sdk/commit/f2270cd6aaa741d6800bd2d21e9775092be25d31) Thanks [@gomesalexandre](https://github.com/gomesalexandre)! - feat(cardano): attach CIP-20 label-674 metadata when memo is provided
|
|
8
|
+
|
|
9
|
+
Cardano direct sends with a non-empty memo now embed the memo as
|
|
10
|
+
CIP-20 on-chain metadata (`{ 674: { "msg": [...] } }`) instead of
|
|
11
|
+
silently dropping it.
|
|
12
|
+
|
|
13
|
+
Implementation:
|
|
14
|
+
- `buildCip20AuxData` encodes the memo into CIP-20 CBOR and computes
|
|
15
|
+
the blake2b-256 aux data hash
|
|
16
|
+
- `patchTxBodyWithAuxHash` byte-patches the WalletCore-produced tx body
|
|
17
|
+
to include the auxiliary_data_hash at key 7 (CBOR map header bump)
|
|
18
|
+
- `getPreSigningHashes` for Cardano now returns blake2b of the PATCHED
|
|
19
|
+
body when a memo is present, so all MPC devices sign the correct hash
|
|
20
|
+
- `compileTx` for Cardano re-derives the pre-signing output, patches
|
|
21
|
+
the body when memo is present, and passes auxDataCbor to
|
|
22
|
+
buildSignedCardanoTx so element [3] carries the metadata
|
|
23
|
+
- `getCardanoChainSpecific` bumps the forced fee by 44 \* len(auxDataCbor)
|
|
24
|
+
to account for the extra bytes WalletCore cannot anticipate
|
|
25
|
+
- Sends without memo are byte-identical to the pre-fix behavior
|
|
26
|
+
|
|
27
|
+
### Patch Changes
|
|
28
|
+
|
|
29
|
+
- [#583](https://github.com/vultisig/vultisig-sdk/pull/583) [`f2270cd`](https://github.com/vultisig/vultisig-sdk/commit/f2270cd6aaa741d6800bd2d21e9775092be25d31) Thanks [@gomesalexandre](https://github.com/gomesalexandre)! - ## New
|
|
30
|
+
- Polkadot Asset Hub USDT (asset_id 1984) + USDC (asset_id 1337) token registry ([#562](https://github.com/vultisig/vultisig-sdk/issues/562))
|
|
31
|
+
- Polkadot `pallet_assets.Account` balance resolver for Asset Hub tokens - replaces placeholder 0n guard ([#563](https://github.com/vultisig/vultisig-sdk/issues/563))
|
|
32
|
+
- Tron native send `data` field (proto field 12) for THORChain memos + exchange deposit memos; `BuildTronSendOptions` and `BuildTrc20TransferOptions` gain optional `data?: Uint8Array` field ([#559](https://github.com/vultisig/vultisig-sdk/issues/559))
|
|
33
|
+
|
|
34
|
+
## Fixed
|
|
35
|
+
- Tron TRC-20 fee estimate now subtracts sender's available energy before charging TRX ([#556](https://github.com/vultisig/vultisig-sdk/issues/556))
|
|
36
|
+
- Tron native send free bandwidth check prevents spurious fee charge when bandwidth is available ([#555](https://github.com/vultisig/vultisig-sdk/issues/555))
|
|
37
|
+
|
|
38
|
+
- Updated dependencies [[`f2270cd`](https://github.com/vultisig/vultisig-sdk/commit/f2270cd6aaa741d6800bd2d21e9775092be25d31)]:
|
|
39
|
+
- @vultisig/core-chain@2.4.0
|
|
40
|
+
|
|
41
|
+
## 1.2.23
|
|
42
|
+
|
|
43
|
+
### Patch Changes
|
|
44
|
+
|
|
45
|
+
- [#588](https://github.com/vultisig/vultisig-sdk/pull/588) [`256f67d`](https://github.com/vultisig/vultisig-sdk/commit/256f67da13a6d96f34c83c9b56c1cfb574cd8fd1) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Enable pre-built SwapKit Bitcoin PSBT transactions, verify their destination outputs, and route payloads through the SignBitcoin hashing and compilation path.
|
|
46
|
+
|
|
47
|
+
- Updated dependencies [[`256f67d`](https://github.com/vultisig/vultisig-sdk/commit/256f67da13a6d96f34c83c9b56c1cfb574cd8fd1)]:
|
|
48
|
+
- @vultisig/core-chain@2.3.2
|
|
49
|
+
|
|
3
50
|
## 1.2.22
|
|
4
51
|
|
|
5
52
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cardano.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/keysign/chainSpecific/resolvers/cardano.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cardano.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/keysign/chainSpecific/resolvers/cardano.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAKtD,eAAO,MAAM,uBAAuB,EAAE,wBAAwB,CAAC,SAAS,CAwBvE,CAAA"}
|
|
@@ -4,7 +4,10 @@ import { cardanoDefaultFee } from '@vultisig/core-chain/chains/cardano/config';
|
|
|
4
4
|
import { cardanoSlotOffset } from '@vultisig/core-chain/chains/cardano/config';
|
|
5
5
|
import { CardanoChainSpecificSchema } from '@vultisig/core-mpc/types/vultisig/keysign/v1/blockchain_specific_pb';
|
|
6
6
|
import { bigIntSum } from '@vultisig/lib-utils/bigint/bigIntSum';
|
|
7
|
+
import { buildCip20AuxData } from '../../../tx/compile/cardano/buildCip20AuxData.js';
|
|
7
8
|
import { getKeysignAmount } from '../../utils/getKeysignAmount.js';
|
|
9
|
+
// Cardano fee formula: fee = a * txBytes + b (mainnet params)
|
|
10
|
+
const CARDANO_A_PARAM = BigInt(44);
|
|
8
11
|
export const getCardanoChainSpecific = async ({ keysignPayload }) => {
|
|
9
12
|
const amount = getKeysignAmount(keysignPayload);
|
|
10
13
|
const currentSlot = await getCardanoCurrentSlot();
|
|
@@ -12,10 +15,18 @@ export const getCardanoChainSpecific = async ({ keysignPayload }) => {
|
|
|
12
15
|
const utxoInfo = keysignPayload.utxoInfo;
|
|
13
16
|
const balance = bigIntSum(utxoInfo.map(({ amount }) => amount));
|
|
14
17
|
const sendMaxAmount = amount ? balance === amount : false;
|
|
18
|
+
// When a memo is present, CIP-20 aux data is appended to the final tx.
|
|
19
|
+
// WalletCore does not know about this extra payload, so we bump the forced
|
|
20
|
+
// fee by a * len(auxDataCbor) to prevent a "fee too small" rejection.
|
|
21
|
+
let byteFee = BigInt(cardanoDefaultFee);
|
|
22
|
+
if (keysignPayload.memo) {
|
|
23
|
+
const { auxDataCbor } = buildCip20AuxData(keysignPayload.memo);
|
|
24
|
+
byteFee += CARDANO_A_PARAM * BigInt(auxDataCbor.length);
|
|
25
|
+
}
|
|
15
26
|
return create(CardanoChainSpecificSchema, {
|
|
16
27
|
ttl,
|
|
17
28
|
sendMaxAmount,
|
|
18
|
-
byteFee
|
|
29
|
+
byteFee,
|
|
19
30
|
});
|
|
20
31
|
};
|
|
21
32
|
//# sourceMappingURL=cardano.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cardano.js","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/keysign/chainSpecific/resolvers/cardano.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,wDAAwD,CAAA;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAA;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAA;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qEAAqE,CAAA;AAChH,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAG/D,MAAM,CAAC,MAAM,uBAAuB,GAAwC,KAAK,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;IACvG,MAAM,MAAM,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAA;IAE/C,MAAM,WAAW,GAAG,MAAM,qBAAqB,EAAE,CAAA;IACjD,MAAM,GAAG,GAAG,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAA;IAEnD,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAA;IACxC,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAC/D,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;IAEzD,OAAO,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"cardano.js","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/keysign/chainSpecific/resolvers/cardano.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,wDAAwD,CAAA;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAA;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAA;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qEAAqE,CAAA;AAChH,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAA;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAG/D,8DAA8D;AAC9D,MAAM,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC,CAAA;AAElC,MAAM,CAAC,MAAM,uBAAuB,GAAwC,KAAK,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;IACvG,MAAM,MAAM,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAA;IAE/C,MAAM,WAAW,GAAG,MAAM,qBAAqB,EAAE,CAAA;IACjD,MAAM,GAAG,GAAG,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAA;IAEnD,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAA;IACxC,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAC/D,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;IAEzD,uEAAuE;IACvE,2EAA2E;IAC3E,sEAAsE;IACtE,IAAI,OAAO,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAA;IACvC,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAC9D,OAAO,IAAI,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IACzD,CAAC;IAED,OAAO,MAAM,CAAC,0BAA0B,EAAE;QACxC,GAAG;QACH,aAAa;QACb,OAAO;KACR,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cardano.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/cardano.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AASnD,eAAO,MAAM,uBAAuB,EAAE,qBAAqB,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"cardano.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/cardano.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AASnD,eAAO,MAAM,uBAAuB,EAAE,qBAAqB,CAAC,SAAS,CA8CpE,CAAA"}
|
|
@@ -12,13 +12,6 @@ const amountToBytes = (amount) => {
|
|
|
12
12
|
return Uint8Array.from(Buffer.from(padded, 'hex'));
|
|
13
13
|
};
|
|
14
14
|
export const getCardanoSigningInputs = ({ keysignPayload, walletCore }) => {
|
|
15
|
-
// Cardano memos require CIP-20 auxiliary data whose hash is committed to in the
|
|
16
|
-
// signed tx body — they cannot be attached after signing. Until that path is
|
|
17
|
-
// implemented (see vultisig/vultisig-sdk#432), fail loudly instead of silently
|
|
18
|
-
// dropping the memo and producing a tx with `auxiliary_data = null`.
|
|
19
|
-
if (keysignPayload.memo) {
|
|
20
|
-
throw new Error('Cardano memo is not supported yet: this SDK cannot attach CIP-20 metadata to direct sends, so the memo would be dropped and never land on-chain. Please retry without a memo, or wait for CIP-20 support (vultisig/vultisig-sdk#432).');
|
|
21
|
-
}
|
|
22
15
|
const { sendMaxAmount, ttl, byteFee } = getBlockchainSpecificValue(keysignPayload.blockchainSpecific, 'cardano');
|
|
23
16
|
const coin = shouldBePresent(keysignPayload.coin);
|
|
24
17
|
const isTokenSend = coin.contractAddress !== '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cardano.js","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/cardano.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,0DAA0D,CAAA;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AACvE,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAA;AAC7C,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAA;AAGrF,iFAAiF;AACjF,MAAM,aAAa,GAAG,CAAC,MAAc,EAAc,EAAE;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAA;IACrD,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA;AACpD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAqC,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,EAAE;IAC1G,
|
|
1
|
+
{"version":3,"file":"cardano.js","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/keysign/signingInputs/resolvers/cardano.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/mpc/keysign/swap/build.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/mpc/keysign/swap/build.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AAMnE,OAAO,EAAE,SAAS,EAAmB,MAAM,2CAA2C,CAAA;AAMtF,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAU1D,OAAO,EAAE,cAAc,EAAwB,MAAM,iEAAiE,CAAA;AAGtH,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAA;AAGzE,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,EAAE,WAAW,CAAA;IACrB,MAAM,EAAE,WAAW,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,SAAS,CAAA;IACxB,WAAW,EAAE,SAAS,CAAA;IACtB,OAAO,EAAE,cAAc,CAAA;IACvB,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAsCD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,uBAAuB,GAAU,kHAW3C,4BAA4B,4BA4N9B,CAAA"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Buffer } from 'buffer';
|
|
2
2
|
import { create } from '@bufbuild/protobuf';
|
|
3
|
+
import { buildSignBitcoinFromPsbt } from '@vultisig/core-chain/chains/utxo/tx/buildSignBitcoinFromPsbt';
|
|
3
4
|
import { fromChainAmount } from '@vultisig/core-chain/amount/fromChainAmount';
|
|
4
5
|
import { toChainAmount } from '@vultisig/core-chain/amount/toChainAmount';
|
|
6
|
+
import { Chain } from '@vultisig/core-chain/Chain';
|
|
5
7
|
import { isChainOfKind } from '@vultisig/core-chain/ChainKind';
|
|
6
8
|
import { getErc20Allowance } from '@vultisig/core-chain/chains/evm/erc20/getErc20Allowance';
|
|
7
9
|
import { chainFeeCoin } from '@vultisig/core-chain/coin/chainFeeCoin';
|
|
@@ -12,12 +14,40 @@ import { getChainSpecific } from '@vultisig/core-mpc/keysign/chainSpecific';
|
|
|
12
14
|
import { getBlockchainSpecificValue } from '@vultisig/core-mpc/keysign/chainSpecific/KeysignChainSpecific';
|
|
13
15
|
import { refineKeysignUtxo } from '@vultisig/core-mpc/keysign/refine/utxo';
|
|
14
16
|
import { getKeysignUtxoInfo } from '@vultisig/core-mpc/keysign/utxo/getKeysignUtxoInfo';
|
|
17
|
+
import { verifySwapKitBitcoinPsbtOutputs } from '@vultisig/core-mpc/tx/swapkitSignBitcoin';
|
|
15
18
|
import { toCommCoin } from '@vultisig/core-mpc/types/utils/commCoin';
|
|
16
19
|
import { OneInchQuoteSchema, OneInchSwapPayloadSchema, OneInchTransactionSchema, } from '@vultisig/core-mpc/types/vultisig/keysign/v1/1inch_swap_payload_pb';
|
|
17
20
|
import { Erc20ApprovePayloadSchema } from '@vultisig/core-mpc/types/vultisig/keysign/v1/erc20_approve_payload_pb';
|
|
18
21
|
import { KeysignPayloadSchema } from '@vultisig/core-mpc/types/vultisig/keysign/v1/keysign_message_pb';
|
|
19
22
|
import { SwapKitSwapPayloadSchema } from '@vultisig/core-mpc/types/vultisig/keysign/v1/swapkit_swap_payload_pb';
|
|
20
23
|
import { matchRecordUnion } from '@vultisig/lib-utils/matchRecordUnion';
|
|
24
|
+
import { Psbt } from 'bitcoinjs-lib';
|
|
25
|
+
const isSwapKitBitcoinPsbt = (fromCoin, transfer) => fromCoin.chain === Chain.Bitcoin && transfer.txType?.toUpperCase() === 'PSBT';
|
|
26
|
+
const getSwapKitBitcoinSignData = (fromCoin, transfer) => {
|
|
27
|
+
if (fromCoin.chain !== Chain.Bitcoin) {
|
|
28
|
+
return { case: undefined };
|
|
29
|
+
}
|
|
30
|
+
if (!isSwapKitBitcoinPsbt(fromCoin, transfer)) {
|
|
31
|
+
throw new Error('SwapKit Bitcoin transfer routes must include PSBT txType and txPayload.');
|
|
32
|
+
}
|
|
33
|
+
if (!transfer.txPayload?.length) {
|
|
34
|
+
throw new Error('SwapKit Bitcoin PSBT payload is empty.');
|
|
35
|
+
}
|
|
36
|
+
const signBitcoin = buildSignBitcoinFromPsbt({
|
|
37
|
+
psbt: Psbt.fromBuffer(Buffer.from(transfer.txPayload)),
|
|
38
|
+
senderAddress: fromCoin.address,
|
|
39
|
+
});
|
|
40
|
+
verifySwapKitBitcoinPsbtOutputs({
|
|
41
|
+
signBitcoin,
|
|
42
|
+
senderAddress: fromCoin.address,
|
|
43
|
+
expectedToAddress: transfer.to,
|
|
44
|
+
expectedToAmount: transfer.amount,
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
case: 'signBitcoin',
|
|
48
|
+
value: signBitcoin,
|
|
49
|
+
};
|
|
50
|
+
};
|
|
21
51
|
/**
|
|
22
52
|
* Builds a KeysignPayload for a swap transaction.
|
|
23
53
|
*
|
|
@@ -77,6 +107,7 @@ export const buildSwapKeysignPayload = async ({ fromCoin, toCoin, amount, swapQu
|
|
|
77
107
|
transfer: tx => tx,
|
|
78
108
|
});
|
|
79
109
|
if (quote.provider === 'swapkit' && transfer) {
|
|
110
|
+
keysignPayload.signData = getSwapKitBitcoinSignData(fromCoin, transfer);
|
|
80
111
|
return {
|
|
81
112
|
case: 'swapkitSwapPayload',
|
|
82
113
|
value: create(SwapKitSwapPayloadSchema, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../../../packages/core/mpc/keysign/swap/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAE3F,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAE9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6DAA6D,CAAA;AACvG,OAAO,EAAE,4BAA4B,EAAE,MAAM,mEAAmE,CAAA;AAEhH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,+DAA+D,CAAA;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAA;AAE1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAA;AAEvF,OAAO,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAA;AACpE,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EAExB,wBAAwB,GACzB,MAAM,oEAAoE,CAAA;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,uEAAuE,CAAA;AACjH,OAAO,EAAkB,oBAAoB,EAAE,MAAM,iEAAiE,CAAA;AACtH,OAAO,EAAE,wBAAwB,EAAE,MAAM,sEAAsE,CAAA;AAC/G,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAA;
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../../../packages/core/mpc/keysign/swap/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Split a memo string into chunks of at most 64 UTF-8 bytes each.
|
|
3
|
+
*
|
|
4
|
+
* Each chunk respects UTF-8 character boundaries: a multi-byte codepoint
|
|
5
|
+
* straddling the 64-byte boundary is moved entirely to the next chunk
|
|
6
|
+
* instead of being torn (which would produce U+FFFD replacement chars on
|
|
7
|
+
* decode and corrupt the memo as it lands on-chain).
|
|
8
|
+
*
|
|
9
|
+
* UTF-8 leading bytes have the bit pattern 0xxxxxxx, 110xxxxx, 1110xxxx,
|
|
10
|
+
* or 11110xxx. Continuation bytes have the pattern 10xxxxxx. To find a
|
|
11
|
+
* safe cut point we walk back from the proposed end until the byte at
|
|
12
|
+
* `end` is a leading byte (or we hit the chunk start, in which case the
|
|
13
|
+
* input is malformed and we keep the original cut).
|
|
14
|
+
*/
|
|
15
|
+
export declare function memoToChunks(memo: string): string[];
|
|
16
|
+
/**
|
|
17
|
+
* Encode the CIP-20 transaction metadata for a given memo string.
|
|
18
|
+
*
|
|
19
|
+
* Produces:
|
|
20
|
+
* { 674: { "msg": ["<chunk1>", "<chunk2>", ...] } }
|
|
21
|
+
*
|
|
22
|
+
* The label 674 is the CIP-20 metadata label registered on cardano.org.
|
|
23
|
+
*
|
|
24
|
+
* @returns
|
|
25
|
+
* - `auxDataCbor` — the canonical CBOR bytes to embed as element [3] of
|
|
26
|
+
* the signed transaction array (replaces the `0xf6` null sentinel).
|
|
27
|
+
* - `auxDataHash` — blake2b-256 of `auxDataCbor`, to be committed in the
|
|
28
|
+
* tx body at CBOR map key 7 (auxiliary_data_hash).
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildCip20AuxData(memo: string): {
|
|
31
|
+
auxDataCbor: Uint8Array;
|
|
32
|
+
auxDataHash: Uint8Array;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Re-emit a WalletCore-produced CBOR tx body with an `auxiliary_data_hash`
|
|
36
|
+
* entry (CBOR map key 7) appended.
|
|
37
|
+
*
|
|
38
|
+
* WalletCore emits the tx body as a CBOR map. We avoid a full decode/encode
|
|
39
|
+
* round-trip (which could alter key ordering or integer widths and invalidate
|
|
40
|
+
* the MPC signature) by:
|
|
41
|
+
* 1. Reading the initial CBOR map header byte to extract the current count.
|
|
42
|
+
* 2. Re-emitting the header byte(s) with count+1.
|
|
43
|
+
* 3. Concatenating the original body bytes after the header.
|
|
44
|
+
* 4. Appending `cborUint(7)` + `cborBytes(auxDataHash)`.
|
|
45
|
+
*
|
|
46
|
+
* This works as long as WalletCore never produces a body map with > 23
|
|
47
|
+
* entries (i.e. the count fits in the CBOR one-byte "additional info" form),
|
|
48
|
+
* which is true in practice — current Cardano tx bodies have at most 9 keys.
|
|
49
|
+
*/
|
|
50
|
+
export declare function patchTxBodyWithAuxHash(txBodyCbor: Uint8Array, auxDataHash: Uint8Array): Uint8Array;
|
|
51
|
+
//# sourceMappingURL=buildCip20AuxData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildCip20AuxData.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/tx/compile/cardano/buildCip20AuxData.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA+BnD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAC/C,WAAW,EAAE,UAAU,CAAA;IACvB,WAAW,EAAE,UAAU,CAAA;CACxB,CAOA;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,GAAG,UAAU,CA0ClG"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { blake2b } from '@noble/hashes/blake2b';
|
|
2
|
+
import { cborArray, cborBytes, cborMap, cborText, cborUint, } from '@vultisig/core-chain/chains/cardano/cip30/cardanoCborPrimitives';
|
|
3
|
+
/** CIP-20 limits each metadata text chunk to 64 UTF-8 bytes. */
|
|
4
|
+
const MAX_CHUNK_BYTES = 64;
|
|
5
|
+
/**
|
|
6
|
+
* Split a memo string into chunks of at most 64 UTF-8 bytes each.
|
|
7
|
+
*
|
|
8
|
+
* Each chunk respects UTF-8 character boundaries: a multi-byte codepoint
|
|
9
|
+
* straddling the 64-byte boundary is moved entirely to the next chunk
|
|
10
|
+
* instead of being torn (which would produce U+FFFD replacement chars on
|
|
11
|
+
* decode and corrupt the memo as it lands on-chain).
|
|
12
|
+
*
|
|
13
|
+
* UTF-8 leading bytes have the bit pattern 0xxxxxxx, 110xxxxx, 1110xxxx,
|
|
14
|
+
* or 11110xxx. Continuation bytes have the pattern 10xxxxxx. To find a
|
|
15
|
+
* safe cut point we walk back from the proposed end until the byte at
|
|
16
|
+
* `end` is a leading byte (or we hit the chunk start, in which case the
|
|
17
|
+
* input is malformed and we keep the original cut).
|
|
18
|
+
*/
|
|
19
|
+
export function memoToChunks(memo) {
|
|
20
|
+
const bytes = new TextEncoder().encode(memo);
|
|
21
|
+
if (bytes.length === 0)
|
|
22
|
+
return [''];
|
|
23
|
+
const chunks = [];
|
|
24
|
+
const decoder = new TextDecoder();
|
|
25
|
+
let start = 0;
|
|
26
|
+
while (start < bytes.length) {
|
|
27
|
+
let end = Math.min(start + MAX_CHUNK_BYTES, bytes.length);
|
|
28
|
+
// If we are not at the end of the buffer and `end` lands on a UTF-8
|
|
29
|
+
// continuation byte (top bits 10xxxxxx), back up until we hit the
|
|
30
|
+
// start of that codepoint. The next chunk will pick up the codepoint
|
|
31
|
+
// intact.
|
|
32
|
+
if (end < bytes.length) {
|
|
33
|
+
while (end > start && (bytes[end] & 0xc0) === 0x80) {
|
|
34
|
+
end--;
|
|
35
|
+
}
|
|
36
|
+
// Defensive: if walking back consumed the whole chunk (malformed
|
|
37
|
+
// input — > 64 bytes of continuation bytes in a row, impossible
|
|
38
|
+
// for any valid UTF-8 codepoint which maxes at 4 bytes), fall back
|
|
39
|
+
// to the original cut so we make forward progress.
|
|
40
|
+
if (end === start) {
|
|
41
|
+
end = Math.min(start + MAX_CHUNK_BYTES, bytes.length);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
chunks.push(decoder.decode(bytes.slice(start, end)));
|
|
45
|
+
start = end;
|
|
46
|
+
}
|
|
47
|
+
return chunks;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Encode the CIP-20 transaction metadata for a given memo string.
|
|
51
|
+
*
|
|
52
|
+
* Produces:
|
|
53
|
+
* { 674: { "msg": ["<chunk1>", "<chunk2>", ...] } }
|
|
54
|
+
*
|
|
55
|
+
* The label 674 is the CIP-20 metadata label registered on cardano.org.
|
|
56
|
+
*
|
|
57
|
+
* @returns
|
|
58
|
+
* - `auxDataCbor` — the canonical CBOR bytes to embed as element [3] of
|
|
59
|
+
* the signed transaction array (replaces the `0xf6` null sentinel).
|
|
60
|
+
* - `auxDataHash` — blake2b-256 of `auxDataCbor`, to be committed in the
|
|
61
|
+
* tx body at CBOR map key 7 (auxiliary_data_hash).
|
|
62
|
+
*/
|
|
63
|
+
export function buildCip20AuxData(memo) {
|
|
64
|
+
const chunks = memoToChunks(memo);
|
|
65
|
+
const msgArray = cborArray(chunks.map(c => cborText(c)));
|
|
66
|
+
const innerMap = cborMap([[cborText('msg'), msgArray]]);
|
|
67
|
+
const auxDataCbor = cborMap([[cborUint(674), innerMap]]);
|
|
68
|
+
const auxDataHash = blake2b(auxDataCbor, { dkLen: 32 });
|
|
69
|
+
return { auxDataCbor, auxDataHash };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Re-emit a WalletCore-produced CBOR tx body with an `auxiliary_data_hash`
|
|
73
|
+
* entry (CBOR map key 7) appended.
|
|
74
|
+
*
|
|
75
|
+
* WalletCore emits the tx body as a CBOR map. We avoid a full decode/encode
|
|
76
|
+
* round-trip (which could alter key ordering or integer widths and invalidate
|
|
77
|
+
* the MPC signature) by:
|
|
78
|
+
* 1. Reading the initial CBOR map header byte to extract the current count.
|
|
79
|
+
* 2. Re-emitting the header byte(s) with count+1.
|
|
80
|
+
* 3. Concatenating the original body bytes after the header.
|
|
81
|
+
* 4. Appending `cborUint(7)` + `cborBytes(auxDataHash)`.
|
|
82
|
+
*
|
|
83
|
+
* This works as long as WalletCore never produces a body map with > 23
|
|
84
|
+
* entries (i.e. the count fits in the CBOR one-byte "additional info" form),
|
|
85
|
+
* which is true in practice — current Cardano tx bodies have at most 9 keys.
|
|
86
|
+
*/
|
|
87
|
+
export function patchTxBodyWithAuxHash(txBodyCbor, auxDataHash) {
|
|
88
|
+
if (txBodyCbor.length === 0) {
|
|
89
|
+
throw new Error('patchTxBodyWithAuxHash: empty txBodyCbor');
|
|
90
|
+
}
|
|
91
|
+
const firstByte = txBodyCbor[0];
|
|
92
|
+
const majorType = firstByte >> 5;
|
|
93
|
+
if (majorType !== 5) {
|
|
94
|
+
throw new Error(`patchTxBodyWithAuxHash: expected CBOR map (major type 5), got major type ${majorType}`);
|
|
95
|
+
}
|
|
96
|
+
const additionalInfo = firstByte & 0x1f;
|
|
97
|
+
if (additionalInfo >= 24) {
|
|
98
|
+
// Multi-byte map count — would require a more complex header rewrite.
|
|
99
|
+
// In practice Cardano tx bodies never exceed 23 entries.
|
|
100
|
+
throw new Error(`patchTxBodyWithAuxHash: map header uses additional info ${additionalInfo}; only direct-count maps (< 24 entries) are supported`);
|
|
101
|
+
}
|
|
102
|
+
const oldCount = additionalInfo;
|
|
103
|
+
const newCount = oldCount + 1;
|
|
104
|
+
if (newCount >= 24) {
|
|
105
|
+
throw new Error(`patchTxBodyWithAuxHash: cannot increment map count to ${newCount} (would overflow into two-byte header)`);
|
|
106
|
+
}
|
|
107
|
+
const newHeader = new Uint8Array([(5 << 5) | newCount]);
|
|
108
|
+
const bodyAfterHeader = txBodyCbor.slice(1);
|
|
109
|
+
const auxHashEntry = new Uint8Array([...cborUint(7), ...cborBytes(auxDataHash)]);
|
|
110
|
+
const totalLen = newHeader.length + bodyAfterHeader.length + auxHashEntry.length;
|
|
111
|
+
const out = new Uint8Array(totalLen);
|
|
112
|
+
let offset = 0;
|
|
113
|
+
out.set(newHeader, offset);
|
|
114
|
+
offset += newHeader.length;
|
|
115
|
+
out.set(bodyAfterHeader, offset);
|
|
116
|
+
offset += bodyAfterHeader.length;
|
|
117
|
+
out.set(auxHashEntry, offset);
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=buildCip20AuxData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildCip20AuxData.js","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/tx/compile/cardano/buildCip20AuxData.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,8 +21,14 @@ type BuildSignedCardanoTxInput = {
|
|
|
21
21
|
publicKey: Uint8Array;
|
|
22
22
|
/** 64-byte Ed25519 signature (r || s, each little-endian) */
|
|
23
23
|
signature: Uint8Array;
|
|
24
|
+
/**
|
|
25
|
+
* CIP-20 auxiliary data CBOR (the full { 674: { "msg": [...] } } map).
|
|
26
|
+
* When provided, replaces the `0xf6` null sentinel at element [3] of the
|
|
27
|
+
* signed transaction array. When absent, `0xf6` is used (no aux data).
|
|
28
|
+
*/
|
|
29
|
+
auxDataCbor?: Uint8Array;
|
|
24
30
|
};
|
|
25
31
|
/** Returns the full signed Cardano transaction as CBOR bytes. */
|
|
26
|
-
export declare const buildSignedCardanoTx: ({ txBodyCbor, publicKey, signature }: BuildSignedCardanoTxInput) => Uint8Array;
|
|
32
|
+
export declare const buildSignedCardanoTx: ({ txBodyCbor, publicKey, signature, auxDataCbor, }: BuildSignedCardanoTxInput) => Uint8Array;
|
|
27
33
|
export {};
|
|
28
34
|
//# sourceMappingURL=buildSignedCardanoTx.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildSignedCardanoTx.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/tx/compile/cardano/buildSignedCardanoTx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,KAAK,yBAAyB,GAAG;IAC/B,+DAA+D;IAC/D,UAAU,EAAE,UAAU,CAAA;IACtB,0CAA0C;IAC1C,SAAS,EAAE,UAAU,CAAA;IACrB,6DAA6D;IAC7D,SAAS,EAAE,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"buildSignedCardanoTx.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/tx/compile/cardano/buildSignedCardanoTx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,KAAK,yBAAyB,GAAG;IAC/B,+DAA+D;IAC/D,UAAU,EAAE,UAAU,CAAA;IACtB,0CAA0C;IAC1C,SAAS,EAAE,UAAU,CAAA;IACrB,6DAA6D;IAC7D,SAAS,EAAE,UAAU,CAAA;IACrB;;;;OAIG;IACH,WAAW,CAAC,EAAE,UAAU,CAAA;CACzB,CAAA;AAyDD,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,GAAI,oDAKlC,yBAAyB,KAAG,UAW9B,CAAA"}
|
|
@@ -64,7 +64,7 @@ const concat = (parts) => {
|
|
|
64
64
|
return result;
|
|
65
65
|
};
|
|
66
66
|
/** Returns the full signed Cardano transaction as CBOR bytes. */
|
|
67
|
-
export const buildSignedCardanoTx = ({ txBodyCbor, publicKey, signature }) => {
|
|
67
|
+
export const buildSignedCardanoTx = ({ txBodyCbor, publicKey, signature, auxDataCbor, }) => {
|
|
68
68
|
const witnessCbor = buildWitnessCbor(publicKey, signature);
|
|
69
69
|
// Signed tx: 0x84 [tx_body, witnesses, isValid, auxiliary_data]
|
|
70
70
|
return concat([
|
|
@@ -72,7 +72,7 @@ export const buildSignedCardanoTx = ({ txBodyCbor, publicKey, signature }) => {
|
|
|
72
72
|
txBodyCbor,
|
|
73
73
|
witnessCbor,
|
|
74
74
|
new Uint8Array([0xf5]), // CBOR true (is_valid)
|
|
75
|
-
new Uint8Array([0xf6]), //
|
|
75
|
+
auxDataCbor ?? new Uint8Array([0xf6]), // CIP-20 metadata or CBOR null
|
|
76
76
|
]);
|
|
77
77
|
};
|
|
78
78
|
//# sourceMappingURL=buildSignedCardanoTx.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildSignedCardanoTx.js","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/tx/compile/cardano/buildSignedCardanoTx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"buildSignedCardanoTx.js","sourceRoot":"","sources":["../../../../../../../packages/core/mpc/tx/compile/cardano/buildSignedCardanoTx.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compileTx.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/mpc/tx/compile/compileTx.ts"],"names":[],"mappings":"AAEA,OAAO,EAAM,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAA;AAEzE,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"compileTx.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/mpc/tx/compile/compileTx.ts"],"names":[],"mappings":"AAEA,OAAO,EAAM,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAA;AAEzE,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAWlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAEjE,OAAO,EAAE,cAAc,EAAwB,MAAM,oDAAoD,CAAA;AAMzG,KAAK,KAAK,GAAG;IACX,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,WAAW,EAAE,UAAU,CAAA;IACvB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;IAC5C,KAAK,EAAE,KAAK,CAAA;IACZ,UAAU,EAAE,UAAU,CAAA;IACtB,cAAc,CAAC,EAAE,cAAc,CAAA;CAChC,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,+FAOvB,KAAK,gCA0JP,CAAA"}
|
|
@@ -8,20 +8,23 @@ import { getCoinType } from '@vultisig/core-chain/coin/coinType';
|
|
|
8
8
|
import { signatureFormats } from '@vultisig/core-chain/signing/SignatureFormat';
|
|
9
9
|
import { assertSignature } from '@vultisig/core-chain/utils/assertSignature';
|
|
10
10
|
import { getQBTCSignedTransaction } from '../../chains/cosmos/qbtc/QBTCHelper.js';
|
|
11
|
+
import { buildCip20AuxData, patchTxBodyWithAuxHash } from './cardano/buildCip20AuxData.js';
|
|
11
12
|
import { buildSignedCardanoTx } from './cardano/buildSignedCardanoTx.js';
|
|
12
13
|
import { getBlockchainSpecificValue } from '../../keysign/chainSpecific/KeysignChainSpecific.js';
|
|
13
14
|
import { decodeBittensorTxInput } from '../../keysign/signingInputs/resolvers/bittensor.js';
|
|
14
15
|
import { KeysignPayloadSchema } from '../../types/vultisig/keysign/v1/keysign_message_pb.js';
|
|
15
16
|
import { getPreSigningHashes } from '../preSigningHashes/index.js';
|
|
16
17
|
import { generateSignature } from '../signature/generateSignature.js';
|
|
18
|
+
import { getSwapKitSignBitcoin } from '../swapkitSignBitcoin.js';
|
|
17
19
|
import { compileSignBitcoinTx } from './compileSignBitcoinTx.js';
|
|
18
20
|
export const compileTx = ({ publicKey, txInputData, signatures: keysignSignatures, chain, walletCore, keysignPayload, }) => {
|
|
21
|
+
const signBitcoin = keysignPayload ? getSwapKitSignBitcoin(keysignPayload) : undefined;
|
|
19
22
|
// PSBT signing: build raw signed tx from SignBitcoin fields + MPC signatures
|
|
20
|
-
if (
|
|
23
|
+
if (signBitcoin) {
|
|
21
24
|
if (!publicKey) {
|
|
22
25
|
throw new Error('publicKey is required for SignBitcoin compilation');
|
|
23
26
|
}
|
|
24
|
-
return compileSignBitcoinTx(
|
|
27
|
+
return compileSignBitcoinTx(signBitcoin, keysignSignatures, publicKey);
|
|
25
28
|
}
|
|
26
29
|
if (chain === Chain.QBTC) {
|
|
27
30
|
const qbtcPayload = fromBinary(KeysignPayloadSchema, txInputData);
|
|
@@ -72,6 +75,9 @@ export const compileTx = ({ publicKey, txInputData, signatures: keysignSignature
|
|
|
72
75
|
})).finish();
|
|
73
76
|
}
|
|
74
77
|
if (chain === Chain.Cardano) {
|
|
78
|
+
// hashes[0] is blake2b-256 of the tx body. When a memo is set,
|
|
79
|
+
// getPreSigningHashes returns blake2b of the patched body (with aux_data_hash
|
|
80
|
+
// at key 7) so both signing phase and compile phase agree on the same bytes.
|
|
75
81
|
const hash = hashes[0];
|
|
76
82
|
const hashHex = Buffer.from(hash).toString('hex');
|
|
77
83
|
const sig = generateSignature({
|
|
@@ -85,19 +91,28 @@ export const compileTx = ({ publicKey, txInputData, signatures: keysignSignature
|
|
|
85
91
|
signature: sig,
|
|
86
92
|
signatureFormat,
|
|
87
93
|
});
|
|
88
|
-
//
|
|
94
|
+
// Re-derive the tx body (and aux data when memo is set) to wrap it with
|
|
95
|
+
// the witness set and produce the final signed transaction.
|
|
89
96
|
const preOutput = TW.TxCompiler.Proto.PreSigningOutput.decode(walletCore.TransactionCompiler.preImageHashes(getCoinType({ chain, walletCore }), txInputData));
|
|
97
|
+
const memo = keysignPayload?.memo;
|
|
98
|
+
let txBodyCbor = preOutput.data;
|
|
99
|
+
let auxDataCbor;
|
|
100
|
+
if (memo) {
|
|
101
|
+
const cip20 = buildCip20AuxData(memo);
|
|
102
|
+
auxDataCbor = cip20.auxDataCbor;
|
|
103
|
+
txBodyCbor = patchTxBodyWithAuxHash(txBodyCbor, cip20.auxDataHash);
|
|
104
|
+
}
|
|
90
105
|
const spendingKey = new Uint8Array(publicKey.data()).slice(0, 32);
|
|
91
106
|
const encoded = buildSignedCardanoTx({
|
|
92
|
-
txBodyCbor
|
|
107
|
+
txBodyCbor,
|
|
93
108
|
publicKey: spendingKey,
|
|
94
109
|
signature: new Uint8Array(sig),
|
|
110
|
+
auxDataCbor,
|
|
95
111
|
});
|
|
96
112
|
return TW.Cardano.Proto.SigningOutput.encode(TW.Cardano.Proto.SigningOutput.create({
|
|
97
113
|
encoded,
|
|
98
|
-
//
|
|
99
|
-
|
|
100
|
-
txId: preOutput.dataHash,
|
|
114
|
+
// hashes[0] is blake2b-256 of the body — correct txId for both paths
|
|
115
|
+
txId: hash,
|
|
101
116
|
})).finish();
|
|
102
117
|
}
|
|
103
118
|
const allSignatures = walletCore.DataVector.create();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compileTx.js","sourceRoot":"","sources":["../../../../../../packages/core/mpc/tx/compile/compileTx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,EAAE,EAAc,MAAM,0BAA0B,CAAA;AAGzD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,8DAA8D,CAAA;AACzG,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAA;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAE5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAA;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kDAAkD,CAAA;AAE7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAA;AACxF,OAAO,EAAkB,oBAAoB,EAAE,MAAM,oDAAoD,CAAA;AACzG,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAW7D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EACxB,SAAS,EACT,WAAW,EACX,UAAU,EAAE,iBAAiB,EAC7B,KAAK,EACL,UAAU,EACV,cAAc,GACR,EAAE,EAAE;IACV,
|
|
1
|
+
{"version":3,"file":"compileTx.js","sourceRoot":"","sources":["../../../../../../packages/core/mpc/tx/compile/compileTx.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/mpc/tx/preSigningHashes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/mpc/tx/preSigningHashes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AASlD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAIrD,OAAO,EAAE,cAAc,EAAwB,MAAM,oDAAoD,CAAA;AAGzG,KAAK,KAAK,GAAG;IACX,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,EAAE,KAAK,CAAA;IACZ,WAAW,EAAE,UAAU,CAAA;IACvB,cAAc,CAAC,EAAE,cAAc,CAAA;CAChC,CAAA;AAKD,eAAO,MAAM,mBAAmB,GAAI,oDAAoD,KAAK,kCA+D5F,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Chain } from '@vultisig/core-chain/Chain';
|
|
2
2
|
import { fromBinary } from '@bufbuild/protobuf';
|
|
3
|
+
import { blake2b } from '@noble/hashes/blake2b';
|
|
3
4
|
import { decodeBittensorTxInput } from '../../keysign/signingInputs/resolvers/bittensor.js';
|
|
4
5
|
import { computePreSigningHashes } from '../../keysign/signingInputs/resolvers/bitcoin/sighash.js';
|
|
5
6
|
import { getQBTCPreSignedImageHash } from '../../chains/cosmos/qbtc/QBTCHelper.js';
|
|
@@ -8,11 +9,17 @@ import { shouldBePresent } from '@vultisig/lib-utils/assert/shouldBePresent';
|
|
|
8
9
|
import { blake2AsU8a } from '@polkadot/util-crypto';
|
|
9
10
|
import { getBlockchainSpecificValue } from '../../keysign/chainSpecific/KeysignChainSpecific.js';
|
|
10
11
|
import { getPreSigningOutput } from '../../keysign/preSigningOutput/index.js';
|
|
12
|
+
import { buildCip20AuxData, patchTxBodyWithAuxHash } from '../compile/cardano/buildCip20AuxData.js';
|
|
11
13
|
import { KeysignPayloadSchema } from '../../types/vultisig/keysign/v1/keysign_message_pb.js';
|
|
14
|
+
import { getSwapKitSignBitcoin } from '../swapkitSignBitcoin.js';
|
|
15
|
+
const sortHashes = (hashes) => [...hashes].sort((one, another) => Buffer.from(one).compare(Buffer.from(another)));
|
|
12
16
|
export const getPreSigningHashes = ({ walletCore, txInputData, chain, keysignPayload }) => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
const signBitcoin = keysignPayload ? getSwapKitSignBitcoin(keysignPayload) : undefined;
|
|
18
|
+
// PSBT signing: compute BIP-143 sighashes directly from structured data.
|
|
19
|
+
// Sort the public ceremony hashes for deterministic cross-platform order;
|
|
20
|
+
// final PSBT assembly still maps signatures by hash and preserves input order.
|
|
21
|
+
if (signBitcoin) {
|
|
22
|
+
return sortHashes(computePreSigningHashes(signBitcoin));
|
|
16
23
|
}
|
|
17
24
|
if (chain === Chain.QBTC) {
|
|
18
25
|
const qbtcPayload = fromBinary(KeysignPayloadSchema, txInputData);
|
|
@@ -24,6 +31,15 @@ export const getPreSigningHashes = ({ walletCore, txInputData, chain, keysignPay
|
|
|
24
31
|
const toSign = payload.length > 256 ? blake2AsU8a(payload, 256) : payload;
|
|
25
32
|
return [toSign];
|
|
26
33
|
}
|
|
34
|
+
// Cardano with memo: the aux-data hash is committed into the tx body, so
|
|
35
|
+
// the signed bytes differ from the WalletCore body. Patch the body and
|
|
36
|
+
// return blake2b-256 of the patched bytes — that is what MPC must sign.
|
|
37
|
+
if (chain === Chain.Cardano && keysignPayload?.memo) {
|
|
38
|
+
const output = getPreSigningOutput({ walletCore, txInputData, chain });
|
|
39
|
+
const { auxDataHash } = buildCip20AuxData(keysignPayload.memo);
|
|
40
|
+
const patchedBody = patchTxBodyWithAuxHash(output.data, auxDataHash);
|
|
41
|
+
return [blake2b(patchedBody, { dkLen: 32 })];
|
|
42
|
+
}
|
|
27
43
|
const output = getPreSigningOutput({
|
|
28
44
|
walletCore,
|
|
29
45
|
txInputData,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/core/mpc/tx/preSigningHashes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAA;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,uDAAuD,CAAA;AAC/F,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAA;AAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kDAAkD,CAAA;AAC7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAkB,oBAAoB,EAAE,MAAM,oDAAoD,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/core/mpc/tx/preSigningHashes/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { KeysignPayload } from '../types/vultisig/keysign/v1/keysign_message_pb.js';
|
|
2
|
+
import { SignBitcoin } from '../types/vultisig/keysign/v1/wasm_execute_contract_payload_pb.js';
|
|
3
|
+
type VerifySwapKitBitcoinPsbtOutputsInput = {
|
|
4
|
+
signBitcoin: SignBitcoin;
|
|
5
|
+
senderAddress: string;
|
|
6
|
+
expectedToAddress: string;
|
|
7
|
+
expectedToAmount: string | bigint;
|
|
8
|
+
};
|
|
9
|
+
export declare const verifySwapKitBitcoinPsbtOutputs: ({ signBitcoin, senderAddress, expectedToAddress, expectedToAmount, }: VerifySwapKitBitcoinPsbtOutputsInput) => void;
|
|
10
|
+
export declare const getSwapKitSignBitcoin: (keysignPayload: KeysignPayload) => SignBitcoin | undefined;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=swapkitSignBitcoin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swapkitSignBitcoin.d.ts","sourceRoot":"","sources":["../../../../../packages/core/mpc/tx/swapkitSignBitcoin.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,iDAAiD,CAAA;AAEhF,OAAO,EAAE,WAAW,EAAE,MAAM,+DAA+D,CAAA;AAE3F,KAAK,oCAAoC,GAAG;IAC1C,WAAW,EAAE,WAAW,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAAA;CAClC,CAAA;AAsCD,eAAO,MAAM,+BAA+B,GAAI,sEAK7C,oCAAoC,SA+CtC,CAAA;AAWD,eAAO,MAAM,qBAAqB,GAAI,gBAAgB,cAAc,KAAG,WAAW,GAAG,SAiCpF,CAAA"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Buffer } from 'buffer';
|
|
2
|
+
import { Chain } from '@vultisig/core-chain/Chain';
|
|
3
|
+
import { buildSignBitcoinFromPsbt } from '@vultisig/core-chain/chains/utxo/tx/buildSignBitcoinFromPsbt';
|
|
4
|
+
import { address as btcAddress, networks, Psbt } from 'bitcoinjs-lib';
|
|
5
|
+
const getScriptPubKeyForAddress = (address, label) => {
|
|
6
|
+
if (!address) {
|
|
7
|
+
throw new Error(`SwapKit Bitcoin PSBT ${label} address is empty.`);
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
return Buffer.from(btcAddress.toOutputScript(address, networks.bitcoin));
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
throw new Error(`SwapKit Bitcoin PSBT ${label} address is invalid: ${address}`);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const parseExpectedAmount = (amount) => {
|
|
17
|
+
if (typeof amount === 'string' && !/^\d+$/.test(amount)) {
|
|
18
|
+
throw new Error(`SwapKit Bitcoin PSBT expected amount is invalid: ${amount}`);
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const value = typeof amount === 'bigint' ? amount : BigInt(amount);
|
|
22
|
+
if (value < 0n) {
|
|
23
|
+
throw new Error('negative');
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new Error(`SwapKit Bitcoin PSBT expected amount is invalid: ${amount}`);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const getOutputScript = (scriptPubKey, index) => {
|
|
32
|
+
if (!/^(?:[0-9a-f]{2})+$/iu.test(scriptPubKey)) {
|
|
33
|
+
throw new Error(`SwapKit Bitcoin PSBT output #${index} has an invalid scriptPubKey.`);
|
|
34
|
+
}
|
|
35
|
+
return Buffer.from(scriptPubKey, 'hex');
|
|
36
|
+
};
|
|
37
|
+
export const verifySwapKitBitcoinPsbtOutputs = ({ signBitcoin, senderAddress, expectedToAddress, expectedToAmount, }) => {
|
|
38
|
+
const expectedDestinationScript = getScriptPubKeyForAddress(expectedToAddress, 'destination');
|
|
39
|
+
const expectedChangeScript = getScriptPubKeyForAddress(senderAddress, 'sender');
|
|
40
|
+
const expectedAmount = parseExpectedAmount(expectedToAmount);
|
|
41
|
+
const outputs = signBitcoin.outputs.map((output, index) => ({
|
|
42
|
+
output,
|
|
43
|
+
script: getOutputScript(output.scriptPubKey, index),
|
|
44
|
+
}));
|
|
45
|
+
outputs.forEach(({ output, script }, index) => {
|
|
46
|
+
const derivedIsChange = script.equals(expectedChangeScript);
|
|
47
|
+
if (output.isChange !== derivedIsChange) {
|
|
48
|
+
throw new Error(`SwapKit Bitcoin PSBT output #${index} has isChange=${output.isChange}, ` +
|
|
49
|
+
`but its scriptPubKey ${derivedIsChange ? 'does' : 'does not'} pay back to the sender.`);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
const nonChangeOutputs = outputs.filter(({ output }) => !output.isChange);
|
|
53
|
+
const nonChangeAmount = nonChangeOutputs.reduce((sum, { output }) => sum + output.amount, 0n);
|
|
54
|
+
if (nonChangeAmount !== expectedAmount) {
|
|
55
|
+
throw new Error(`SwapKit Bitcoin PSBT non-change outputs sum to ${nonChangeAmount}, ` + `but expected ${expectedAmount}.`);
|
|
56
|
+
}
|
|
57
|
+
const destinationMatches = nonChangeOutputs.map(({ output, script }) => ({
|
|
58
|
+
amount: output.amount,
|
|
59
|
+
matches: script.equals(expectedDestinationScript),
|
|
60
|
+
}));
|
|
61
|
+
if (destinationMatches.some(({ amount, matches }) => amount > 0n && !matches)) {
|
|
62
|
+
throw new Error('SwapKit Bitcoin PSBT contains a value-bearing non-change output that is not the quoted destination.');
|
|
63
|
+
}
|
|
64
|
+
const destinationMatchCount = destinationMatches.filter(({ matches }) => matches).length;
|
|
65
|
+
if (destinationMatchCount !== 1) {
|
|
66
|
+
throw new Error(`SwapKit Bitcoin PSBT must contain exactly one non-change output paying to ${expectedToAddress}, ` +
|
|
67
|
+
`but found ${destinationMatchCount}.`);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const getSwapKitBitcoinPsbtPayload = (keysignPayload) => {
|
|
71
|
+
if (keysignPayload.coin?.chain !== Chain.Bitcoin || keysignPayload.swapPayload.case !== 'swapkitSwapPayload') {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
const swapKitPayload = keysignPayload.swapPayload.value;
|
|
75
|
+
return swapKitPayload.txType.toUpperCase() === 'PSBT' ? swapKitPayload : undefined;
|
|
76
|
+
};
|
|
77
|
+
export const getSwapKitSignBitcoin = (keysignPayload) => {
|
|
78
|
+
let signBitcoin;
|
|
79
|
+
const swapKitBitcoinPsbtPayload = getSwapKitBitcoinPsbtPayload(keysignPayload);
|
|
80
|
+
if (keysignPayload.signData.case === 'signBitcoin') {
|
|
81
|
+
signBitcoin = keysignPayload.signData.value;
|
|
82
|
+
}
|
|
83
|
+
else if (swapKitBitcoinPsbtPayload) {
|
|
84
|
+
const txPayload = swapKitBitcoinPsbtPayload.txPayload;
|
|
85
|
+
if (txPayload.length === 0) {
|
|
86
|
+
throw new Error('SwapKit Bitcoin PSBT payload is empty.');
|
|
87
|
+
}
|
|
88
|
+
signBitcoin = buildSignBitcoinFromPsbt({
|
|
89
|
+
psbt: Psbt.fromBuffer(Buffer.from(txPayload)),
|
|
90
|
+
senderAddress: keysignPayload.coin?.address ?? '',
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (!signBitcoin) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
if (swapKitBitcoinPsbtPayload) {
|
|
97
|
+
verifySwapKitBitcoinPsbtOutputs({
|
|
98
|
+
signBitcoin,
|
|
99
|
+
senderAddress: keysignPayload.coin?.address ?? '',
|
|
100
|
+
expectedToAddress: keysignPayload.toAddress,
|
|
101
|
+
expectedToAmount: keysignPayload.toAmount,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return signBitcoin;
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=swapkitSignBitcoin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swapkitSignBitcoin.js","sourceRoot":"","sources":["../../../../../packages/core/mpc/tx/swapkitSignBitcoin.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vultisig/core-mpc",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "MPC, keysign, and vault types shared across Vultisig clients",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -772,6 +772,11 @@
|
|
|
772
772
|
"import": "./dist/swap/utils/getSwapTrackingUrl.js",
|
|
773
773
|
"default": "./dist/swap/utils/getSwapTrackingUrl.js"
|
|
774
774
|
},
|
|
775
|
+
"./tx/compile/cardano/buildCip20AuxData": {
|
|
776
|
+
"types": "./dist/tx/compile/cardano/buildCip20AuxData.d.ts",
|
|
777
|
+
"import": "./dist/tx/compile/cardano/buildCip20AuxData.js",
|
|
778
|
+
"default": "./dist/tx/compile/cardano/buildCip20AuxData.js"
|
|
779
|
+
},
|
|
775
780
|
"./tx/compile/cardano/buildSignedCardanoTx": {
|
|
776
781
|
"types": "./dist/tx/compile/cardano/buildSignedCardanoTx.d.ts",
|
|
777
782
|
"import": "./dist/tx/compile/cardano/buildSignedCardanoTx.js",
|
|
@@ -797,6 +802,11 @@
|
|
|
797
802
|
"import": "./dist/tx/signature/generateSignature.js",
|
|
798
803
|
"default": "./dist/tx/signature/generateSignature.js"
|
|
799
804
|
},
|
|
805
|
+
"./tx/swapkitSignBitcoin": {
|
|
806
|
+
"types": "./dist/tx/swapkitSignBitcoin.d.ts",
|
|
807
|
+
"import": "./dist/tx/swapkitSignBitcoin.js",
|
|
808
|
+
"default": "./dist/tx/swapkitSignBitcoin.js"
|
|
809
|
+
},
|
|
800
810
|
"./types/plugin/constraint_pb": {
|
|
801
811
|
"types": "./dist/types/plugin/constraint_pb.d.ts",
|
|
802
812
|
"import": "./dist/types/plugin/constraint_pb.js",
|
|
@@ -984,7 +994,7 @@
|
|
|
984
994
|
"@noble/hashes": "^1.8.0",
|
|
985
995
|
"@solana/web3.js": "^1.98.4",
|
|
986
996
|
"@trustwallet/wallet-core": "^4.6.9",
|
|
987
|
-
"@vultisig/core-chain": "2.
|
|
997
|
+
"@vultisig/core-chain": "2.4.0",
|
|
988
998
|
"@vultisig/core-config": "0.9.1",
|
|
989
999
|
"@vultisig/lib-dkls": "0.9.0",
|
|
990
1000
|
"@vultisig/lib-mldsa": "0.9.0",
|