@sequence0/sdk 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +1 -1
  2. package/dist/chains/algorand.d.ts +44 -0
  3. package/dist/chains/algorand.d.ts.map +1 -0
  4. package/dist/chains/algorand.js +148 -0
  5. package/dist/chains/algorand.js.map +1 -0
  6. package/dist/chains/aptos.d.ts +39 -0
  7. package/dist/chains/aptos.d.ts.map +1 -0
  8. package/dist/chains/aptos.js +168 -0
  9. package/dist/chains/aptos.js.map +1 -0
  10. package/dist/chains/bitcoin-taproot.d.ts +77 -14
  11. package/dist/chains/bitcoin-taproot.d.ts.map +1 -1
  12. package/dist/chains/bitcoin-taproot.js +324 -65
  13. package/dist/chains/bitcoin-taproot.js.map +1 -1
  14. package/dist/chains/bitcoin.d.ts +12 -7
  15. package/dist/chains/bitcoin.d.ts.map +1 -1
  16. package/dist/chains/bitcoin.js +14 -9
  17. package/dist/chains/bitcoin.js.map +1 -1
  18. package/dist/chains/cardano.d.ts +42 -0
  19. package/dist/chains/cardano.d.ts.map +1 -0
  20. package/dist/chains/cardano.js +188 -0
  21. package/dist/chains/cardano.js.map +1 -0
  22. package/dist/chains/cosmos.d.ts +42 -0
  23. package/dist/chains/cosmos.d.ts.map +1 -0
  24. package/dist/chains/cosmos.js +216 -0
  25. package/dist/chains/cosmos.js.map +1 -0
  26. package/dist/chains/dogecoin-litecoin.d.ts +57 -0
  27. package/dist/chains/dogecoin-litecoin.d.ts.map +1 -0
  28. package/dist/chains/dogecoin-litecoin.js +521 -0
  29. package/dist/chains/dogecoin-litecoin.js.map +1 -0
  30. package/dist/chains/ethereum.d.ts.map +1 -1
  31. package/dist/chains/ethereum.js +16 -0
  32. package/dist/chains/ethereum.js.map +1 -1
  33. package/dist/chains/hedera.d.ts +113 -0
  34. package/dist/chains/hedera.d.ts.map +1 -0
  35. package/dist/chains/hedera.js +302 -0
  36. package/dist/chains/hedera.js.map +1 -0
  37. package/dist/chains/icp.d.ts +95 -0
  38. package/dist/chains/icp.d.ts.map +1 -0
  39. package/dist/chains/icp.js +520 -0
  40. package/dist/chains/icp.js.map +1 -0
  41. package/dist/chains/kaspa.d.ts +152 -0
  42. package/dist/chains/kaspa.d.ts.map +1 -0
  43. package/dist/chains/kaspa.js +790 -0
  44. package/dist/chains/kaspa.js.map +1 -0
  45. package/dist/chains/multiversx.d.ts +143 -0
  46. package/dist/chains/multiversx.d.ts.map +1 -0
  47. package/dist/chains/multiversx.js +524 -0
  48. package/dist/chains/multiversx.js.map +1 -0
  49. package/dist/chains/near.d.ts +40 -0
  50. package/dist/chains/near.d.ts.map +1 -0
  51. package/dist/chains/near.js +170 -0
  52. package/dist/chains/near.js.map +1 -0
  53. package/dist/chains/polkadot.d.ts +43 -0
  54. package/dist/chains/polkadot.d.ts.map +1 -0
  55. package/dist/chains/polkadot.js +179 -0
  56. package/dist/chains/polkadot.js.map +1 -0
  57. package/dist/chains/ripple.d.ts +41 -0
  58. package/dist/chains/ripple.d.ts.map +1 -0
  59. package/dist/chains/ripple.js +190 -0
  60. package/dist/chains/ripple.js.map +1 -0
  61. package/dist/chains/stellar.d.ts +40 -0
  62. package/dist/chains/stellar.d.ts.map +1 -0
  63. package/dist/chains/stellar.js +156 -0
  64. package/dist/chains/stellar.js.map +1 -0
  65. package/dist/chains/sui.d.ts +44 -0
  66. package/dist/chains/sui.d.ts.map +1 -0
  67. package/dist/chains/sui.js +157 -0
  68. package/dist/chains/sui.js.map +1 -0
  69. package/dist/chains/tezos.d.ts +43 -0
  70. package/dist/chains/tezos.d.ts.map +1 -0
  71. package/dist/chains/tezos.js +162 -0
  72. package/dist/chains/tezos.js.map +1 -0
  73. package/dist/chains/ton.d.ts +40 -0
  74. package/dist/chains/ton.d.ts.map +1 -0
  75. package/dist/chains/ton.js +168 -0
  76. package/dist/chains/ton.js.map +1 -0
  77. package/dist/chains/tron.d.ts +41 -0
  78. package/dist/chains/tron.d.ts.map +1 -0
  79. package/dist/chains/tron.js +124 -0
  80. package/dist/chains/tron.js.map +1 -0
  81. package/dist/core/client.d.ts +4 -5
  82. package/dist/core/client.d.ts.map +1 -1
  83. package/dist/core/client.js +54 -29
  84. package/dist/core/client.js.map +1 -1
  85. package/dist/core/types.d.ts +161 -1
  86. package/dist/core/types.d.ts.map +1 -1
  87. package/dist/erc4337/types.js +2 -2
  88. package/dist/index.d.ts +21 -3
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +85 -4
  91. package/dist/index.js.map +1 -1
  92. package/dist/utils/discovery.d.ts.map +1 -1
  93. package/dist/utils/discovery.js +56 -1
  94. package/dist/utils/discovery.js.map +1 -1
  95. package/dist/utils/eip712.d.ts +36 -0
  96. package/dist/utils/eip712.d.ts.map +1 -0
  97. package/dist/utils/eip712.js +80 -0
  98. package/dist/utils/eip712.js.map +1 -0
  99. package/dist/utils/fee.d.ts +2 -2
  100. package/dist/utils/fee.js +2 -2
  101. package/dist/utils/optional-deps.d.ts +9 -0
  102. package/dist/utils/optional-deps.d.ts.map +1 -0
  103. package/dist/utils/optional-deps.js +21 -0
  104. package/dist/utils/optional-deps.js.map +1 -0
  105. package/dist/utils/validation.d.ts +8 -0
  106. package/dist/utils/validation.d.ts.map +1 -1
  107. package/dist/utils/validation.js +24 -1
  108. package/dist/utils/validation.js.map +1 -1
  109. package/dist/utils/websocket.js +1 -1
  110. package/dist/utils/websocket.js.map +1 -1
  111. package/dist/wallet/wallet.d.ts +16 -2
  112. package/dist/wallet/wallet.d.ts.map +1 -1
  113. package/dist/wallet/wallet.js +131 -58
  114. package/dist/wallet/wallet.js.map +1 -1
  115. package/package.json +35 -1
package/README.md CHANGED
@@ -30,7 +30,7 @@ const txHash = await wallet.sendTransaction({
30
30
  console.log('TX Hash:', txHash);
31
31
  ```
32
32
 
33
- ## What's New in v1.1.0
33
+ ## What's New in v1.1.2
34
34
 
35
35
  ### Bitcoin Taproot (P2TR) Support
36
36
 
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Algorand Chain Adapter
3
+ *
4
+ * Builds Algorand transactions using MessagePack serialization,
5
+ * attaches Ed25519 signatures from the FROST threshold signing
6
+ * network, and broadcasts via Algod API.
7
+ *
8
+ * Note: Algorand Ed25519 signs the raw bytes ("TX" prefix + msgpack),
9
+ * NOT a hash of them.
10
+ *
11
+ * Requires: npm install algosdk
12
+ */
13
+ import { ChainAdapter, AlgorandTransaction } from '../core/types';
14
+ export declare class AlgorandAdapter implements ChainAdapter {
15
+ private rpcUrl;
16
+ private network;
17
+ private algosdk;
18
+ private client;
19
+ constructor(network?: 'mainnet' | 'testnet', rpcUrl?: string);
20
+ getRpcUrl(): string;
21
+ /**
22
+ * Build an unsigned Algorand payment transaction.
23
+ *
24
+ * The signing payload is "TX" + MessagePack-encoded transaction.
25
+ * Algorand signs the RAW BYTES directly (not a hash).
26
+ */
27
+ buildTransaction(tx: AlgorandTransaction, fromAddress: string): Promise<string>;
28
+ getSigningPayload(unsignedTx: string): string;
29
+ /**
30
+ * Attach an Ed25519 signature to the Algorand transaction
31
+ */
32
+ attachSignature(unsignedTx: string, signature: string): Promise<string>;
33
+ /**
34
+ * Broadcast a signed Algorand transaction
35
+ */
36
+ broadcast(signedTx: string): Promise<string>;
37
+ /**
38
+ * Get ALGO balance in microAlgos
39
+ */
40
+ getBalance(address: string): Promise<string>;
41
+ }
42
+ export declare function createAlgorandAdapter(rpcUrl?: string): AlgorandAdapter;
43
+ export declare function createAlgorandTestnetAdapter(rpcUrl?: string): AlgorandAdapter;
44
+ //# sourceMappingURL=algorand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algorand.d.ts","sourceRoot":"","sources":["../../src/chains/algorand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAiBlE,qBAAa,eAAgB,YAAW,YAAY;IAChD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,MAAM,CAAM;gBAER,OAAO,GAAE,SAAS,GAAG,SAAqB,EAAE,MAAM,CAAC,EAAE,MAAM;IAQvE,SAAS,IAAI,MAAM;IAInB;;;;;OAKG;IACG,gBAAgB,CAAC,EAAE,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkCrF,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAS7C;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB7E;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4BlD;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAQrD;AAED,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAEtE;AAED,wBAAgB,4BAA4B,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAE7E"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ /**
3
+ * Algorand Chain Adapter
4
+ *
5
+ * Builds Algorand transactions using MessagePack serialization,
6
+ * attaches Ed25519 signatures from the FROST threshold signing
7
+ * network, and broadcasts via Algod API.
8
+ *
9
+ * Note: Algorand Ed25519 signs the raw bytes ("TX" prefix + msgpack),
10
+ * NOT a hash of them.
11
+ *
12
+ * Requires: npm install algosdk
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.AlgorandAdapter = void 0;
16
+ exports.createAlgorandAdapter = createAlgorandAdapter;
17
+ exports.createAlgorandTestnetAdapter = createAlgorandTestnetAdapter;
18
+ const errors_1 = require("../utils/errors");
19
+ const optional_deps_1 = require("../utils/optional-deps");
20
+ const DEFAULT_RPCS = {
21
+ 'mainnet': {
22
+ server: 'https://mainnet-api.algonode.cloud',
23
+ token: '',
24
+ port: '',
25
+ },
26
+ 'testnet': {
27
+ server: 'https://testnet-api.algonode.cloud',
28
+ token: '',
29
+ port: '',
30
+ },
31
+ };
32
+ class AlgorandAdapter {
33
+ constructor(network = 'mainnet', rpcUrl) {
34
+ this.network = network;
35
+ const config = DEFAULT_RPCS[network];
36
+ this.rpcUrl = rpcUrl || config.server;
37
+ this.algosdk = (0, optional_deps_1.requireOptionalDependency)('algosdk', 'algorand');
38
+ this.client = new this.algosdk.Algodv2(config.token, this.rpcUrl, config.port);
39
+ }
40
+ getRpcUrl() {
41
+ return this.rpcUrl;
42
+ }
43
+ /**
44
+ * Build an unsigned Algorand payment transaction.
45
+ *
46
+ * The signing payload is "TX" + MessagePack-encoded transaction.
47
+ * Algorand signs the RAW BYTES directly (not a hash).
48
+ */
49
+ async buildTransaction(tx, fromAddress) {
50
+ try {
51
+ const params = await this.client.getTransactionParams().do();
52
+ const txn = this.algosdk.makePaymentTxnWithSuggestedParamsFromObject({
53
+ from: fromAddress,
54
+ to: tx.to,
55
+ amount: tx.amount,
56
+ suggestedParams: params,
57
+ note: tx.note ? new TextEncoder().encode(tx.note) : undefined,
58
+ });
59
+ // bytesToSign() returns "TX" prefix + msgpack-encoded TX
60
+ // Algorand signs this directly with Ed25519 (no hashing)
61
+ const bytesToSign = txn.bytesToSign();
62
+ const payload = {
63
+ signingPayload: Buffer.from(bytesToSign).toString('hex'),
64
+ txnBytes: Buffer.from(this.algosdk.encodeUnsignedTransaction(txn)).toString('hex'),
65
+ fromAddress,
66
+ toAddress: tx.to,
67
+ amount: tx.amount,
68
+ };
69
+ return Buffer.from(JSON.stringify(payload)).toString('hex');
70
+ }
71
+ catch (e) {
72
+ if (e instanceof errors_1.ChainError)
73
+ throw e;
74
+ throw new errors_1.ChainError(`Failed to build Algorand transaction: ${e.message}`, 'algorand');
75
+ }
76
+ }
77
+ getSigningPayload(unsignedTx) {
78
+ try {
79
+ const payload = JSON.parse(Buffer.from(unsignedTx, 'hex').toString());
80
+ return payload.signingPayload;
81
+ }
82
+ catch {
83
+ return unsignedTx;
84
+ }
85
+ }
86
+ /**
87
+ * Attach an Ed25519 signature to the Algorand transaction
88
+ */
89
+ async attachSignature(unsignedTx, signature) {
90
+ try {
91
+ const payload = JSON.parse(Buffer.from(unsignedTx, 'hex').toString());
92
+ const sig = signature.startsWith('0x') ? signature.slice(2) : signature;
93
+ const signedPayload = {
94
+ ...payload,
95
+ signature: sig,
96
+ };
97
+ return Buffer.from(JSON.stringify(signedPayload)).toString('hex');
98
+ }
99
+ catch (e) {
100
+ throw new errors_1.ChainError(`Failed to attach Algorand signature: ${e.message}`, 'algorand');
101
+ }
102
+ }
103
+ /**
104
+ * Broadcast a signed Algorand transaction
105
+ */
106
+ async broadcast(signedTx) {
107
+ try {
108
+ const payload = JSON.parse(Buffer.from(signedTx, 'hex').toString());
109
+ // Reconstruct the unsigned transaction
110
+ const txnBytes = Buffer.from(payload.txnBytes, 'hex');
111
+ const txn = this.algosdk.decodeUnsignedTransaction(txnBytes);
112
+ // Create the signed transaction object
113
+ const sigBytes = Buffer.from(payload.signature, 'hex');
114
+ const signedTxn = {
115
+ txn: txn.get_obj_for_encoding(),
116
+ sig: sigBytes,
117
+ };
118
+ const signedBytes = this.algosdk.encodeObj(signedTxn);
119
+ const result = await this.client.sendRawTransaction(signedBytes).do();
120
+ return result.txId;
121
+ }
122
+ catch (e) {
123
+ if (e instanceof errors_1.ChainError)
124
+ throw e;
125
+ throw new errors_1.ChainError(`Failed to broadcast Algorand tx: ${e.message}`, 'algorand');
126
+ }
127
+ }
128
+ /**
129
+ * Get ALGO balance in microAlgos
130
+ */
131
+ async getBalance(address) {
132
+ try {
133
+ const info = await this.client.accountInformation(address).do();
134
+ return info.amount.toString();
135
+ }
136
+ catch {
137
+ return '0';
138
+ }
139
+ }
140
+ }
141
+ exports.AlgorandAdapter = AlgorandAdapter;
142
+ function createAlgorandAdapter(rpcUrl) {
143
+ return new AlgorandAdapter('mainnet', rpcUrl);
144
+ }
145
+ function createAlgorandTestnetAdapter(rpcUrl) {
146
+ return new AlgorandAdapter('testnet', rpcUrl);
147
+ }
148
+ //# sourceMappingURL=algorand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algorand.js","sourceRoot":"","sources":["../../src/chains/algorand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Aptos Chain Adapter
3
+ *
4
+ * Builds Aptos Move transactions using BCS serialization,
5
+ * attaches Ed25519 signatures from the FROST threshold signing
6
+ * network, and broadcasts via Aptos REST API.
7
+ *
8
+ * Requires: npm install @aptos-labs/ts-sdk
9
+ */
10
+ import { ChainAdapter, AptosTransaction } from '../core/types';
11
+ export declare class AptosAdapter implements ChainAdapter {
12
+ private rpcUrl;
13
+ private network;
14
+ private aptosSdk;
15
+ constructor(network?: 'mainnet' | 'testnet' | 'devnet', rpcUrl?: string);
16
+ getRpcUrl(): string;
17
+ /**
18
+ * Build an unsigned Aptos transaction.
19
+ *
20
+ * The signing payload is SHA3-256("APTOS::RawTransaction" prefix hash + BCS-serialized RawTransaction).
21
+ */
22
+ buildTransaction(tx: AptosTransaction, fromAddress: string): Promise<string>;
23
+ getSigningPayload(unsignedTx: string): string;
24
+ /**
25
+ * Attach an Ed25519 signature to the Aptos transaction
26
+ */
27
+ attachSignature(unsignedTx: string, signature: string): Promise<string>;
28
+ /**
29
+ * Broadcast a signed Aptos transaction
30
+ */
31
+ broadcast(signedTx: string): Promise<string>;
32
+ /**
33
+ * Get APT balance in Octas
34
+ */
35
+ getBalance(address: string): Promise<string>;
36
+ }
37
+ export declare function createAptosAdapter(rpcUrl?: string): AptosAdapter;
38
+ export declare function createAptosTestnetAdapter(rpcUrl?: string): AptosAdapter;
39
+ //# sourceMappingURL=aptos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aptos.d.ts","sourceRoot":"","sources":["../../src/chains/aptos.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAU/D,qBAAa,YAAa,YAAW,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAM;gBAEV,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,QAAoB,EAAE,MAAM,CAAC,EAAE,MAAM;IAMlF,SAAS,IAAI,MAAM;IAInB;;;;OAIG;IACG,gBAAgB,CAAC,EAAE,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmDlF,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAS7C;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB7E;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsClD;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAqBrD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAEhE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAEvE"}
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ /**
3
+ * Aptos Chain Adapter
4
+ *
5
+ * Builds Aptos Move transactions using BCS serialization,
6
+ * attaches Ed25519 signatures from the FROST threshold signing
7
+ * network, and broadcasts via Aptos REST API.
8
+ *
9
+ * Requires: npm install @aptos-labs/ts-sdk
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AptosAdapter = void 0;
13
+ exports.createAptosAdapter = createAptosAdapter;
14
+ exports.createAptosTestnetAdapter = createAptosTestnetAdapter;
15
+ const errors_1 = require("../utils/errors");
16
+ const optional_deps_1 = require("../utils/optional-deps");
17
+ const DEFAULT_RPCS = {
18
+ 'mainnet': 'https://fullnode.mainnet.aptoslabs.com/v1',
19
+ 'testnet': 'https://fullnode.testnet.aptoslabs.com/v1',
20
+ 'devnet': 'https://fullnode.devnet.aptoslabs.com/v1',
21
+ };
22
+ class AptosAdapter {
23
+ constructor(network = 'mainnet', rpcUrl) {
24
+ this.network = network;
25
+ this.rpcUrl = rpcUrl || DEFAULT_RPCS[network];
26
+ this.aptosSdk = (0, optional_deps_1.requireOptionalDependency)('@aptos-labs/ts-sdk', 'aptos');
27
+ }
28
+ getRpcUrl() {
29
+ return this.rpcUrl;
30
+ }
31
+ /**
32
+ * Build an unsigned Aptos transaction.
33
+ *
34
+ * The signing payload is SHA3-256("APTOS::RawTransaction" prefix hash + BCS-serialized RawTransaction).
35
+ */
36
+ async buildTransaction(tx, fromAddress) {
37
+ try {
38
+ const { Aptos, AptosConfig, Network, AccountAddress } = this.aptosSdk;
39
+ const networkMap = {
40
+ 'mainnet': Network.MAINNET,
41
+ 'testnet': Network.TESTNET,
42
+ 'devnet': Network.DEVNET,
43
+ };
44
+ const config = new AptosConfig({
45
+ network: networkMap[this.network] || Network.MAINNET,
46
+ });
47
+ const aptos = new Aptos(config);
48
+ // Build a coin transfer transaction
49
+ const rawTx = await aptos.transaction.build.simple({
50
+ sender: AccountAddress.from(fromAddress),
51
+ data: {
52
+ function: '0x1::aptos_account::transfer',
53
+ functionArguments: [AccountAddress.from(tx.to), BigInt(tx.amount)],
54
+ },
55
+ });
56
+ // Get the signing message (prefix hash + BCS bytes)
57
+ const signingMessage = rawTx.bcsToBytes();
58
+ // SHA3-256 of the signing message
59
+ const crypto = require('crypto');
60
+ const signingHash = crypto.createHash('sha3-256')
61
+ .update(Buffer.from(signingMessage))
62
+ .digest();
63
+ const payload = {
64
+ signingHash: Buffer.from(signingHash).toString('hex'),
65
+ signingMessage: Buffer.from(signingMessage).toString('hex'),
66
+ fromAddress,
67
+ toAddress: tx.to,
68
+ amount: tx.amount,
69
+ };
70
+ return Buffer.from(JSON.stringify(payload)).toString('hex');
71
+ }
72
+ catch (e) {
73
+ if (e instanceof errors_1.ChainError)
74
+ throw e;
75
+ throw new errors_1.ChainError(`Failed to build Aptos transaction: ${e.message}`, 'aptos');
76
+ }
77
+ }
78
+ getSigningPayload(unsignedTx) {
79
+ try {
80
+ const payload = JSON.parse(Buffer.from(unsignedTx, 'hex').toString());
81
+ return payload.signingHash;
82
+ }
83
+ catch {
84
+ return unsignedTx;
85
+ }
86
+ }
87
+ /**
88
+ * Attach an Ed25519 signature to the Aptos transaction
89
+ */
90
+ async attachSignature(unsignedTx, signature) {
91
+ try {
92
+ const payload = JSON.parse(Buffer.from(unsignedTx, 'hex').toString());
93
+ const sig = signature.startsWith('0x') ? signature.slice(2) : signature;
94
+ const signedPayload = {
95
+ ...payload,
96
+ signature: sig,
97
+ };
98
+ return Buffer.from(JSON.stringify(signedPayload)).toString('hex');
99
+ }
100
+ catch (e) {
101
+ throw new errors_1.ChainError(`Failed to attach Aptos signature: ${e.message}`, 'aptos');
102
+ }
103
+ }
104
+ /**
105
+ * Broadcast a signed Aptos transaction
106
+ */
107
+ async broadcast(signedTx) {
108
+ try {
109
+ const { Aptos, AptosConfig, Network } = this.aptosSdk;
110
+ const payload = JSON.parse(Buffer.from(signedTx, 'hex').toString());
111
+ const networkMap = {
112
+ 'mainnet': Network.MAINNET,
113
+ 'testnet': Network.TESTNET,
114
+ 'devnet': Network.DEVNET,
115
+ };
116
+ const config = new AptosConfig({
117
+ network: networkMap[this.network] || Network.MAINNET,
118
+ });
119
+ const aptos = new Aptos(config);
120
+ // Submit the signed BCS transaction
121
+ const signingMessage = Buffer.from(payload.signingMessage, 'hex');
122
+ const sigBytes = Buffer.from(payload.signature, 'hex');
123
+ const result = await aptos.transaction.submit.simple({
124
+ transaction: signingMessage,
125
+ senderAuthenticator: {
126
+ type: 'ed25519',
127
+ signature: sigBytes,
128
+ },
129
+ });
130
+ return result.hash;
131
+ }
132
+ catch (e) {
133
+ if (e instanceof errors_1.ChainError)
134
+ throw e;
135
+ throw new errors_1.ChainError(`Failed to broadcast Aptos tx: ${e.message}`, 'aptos');
136
+ }
137
+ }
138
+ /**
139
+ * Get APT balance in Octas
140
+ */
141
+ async getBalance(address) {
142
+ try {
143
+ const { Aptos, AptosConfig, Network } = this.aptosSdk;
144
+ const networkMap = {
145
+ 'mainnet': Network.MAINNET,
146
+ 'testnet': Network.TESTNET,
147
+ 'devnet': Network.DEVNET,
148
+ };
149
+ const config = new AptosConfig({
150
+ network: networkMap[this.network] || Network.MAINNET,
151
+ });
152
+ const aptos = new Aptos(config);
153
+ const balance = await aptos.getAccountAPTAmount({ accountAddress: address });
154
+ return balance.toString();
155
+ }
156
+ catch {
157
+ return '0';
158
+ }
159
+ }
160
+ }
161
+ exports.AptosAdapter = AptosAdapter;
162
+ function createAptosAdapter(rpcUrl) {
163
+ return new AptosAdapter('mainnet', rpcUrl);
164
+ }
165
+ function createAptosTestnetAdapter(rpcUrl) {
166
+ return new AptosAdapter('testnet', rpcUrl);
167
+ }
168
+ //# sourceMappingURL=aptos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aptos.js","sourceRoot":"","sources":["../../src/chains/aptos.ts"],"names":[],"mappings":"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"}
@@ -7,10 +7,15 @@
7
7
  * FROST-secp256k1 produces BIP-340 compatible Schnorr signatures that are
8
8
  * NATIVE to Taproot key-path spends -- no signature format conversion needed.
9
9
  *
10
- * Depends on the WASM crate's bitcoin.rs for:
11
- * - Address derivation (group pubkey -> bc1p... P2TR address)
12
- * - Transaction construction (inputs/outputs -> unsigned TX + sighash)
13
- * - Signature attachment (FROST sig -> witness data)
10
+ * Key features:
11
+ * - **Real secp256k1 EC point arithmetic** for BIP-341 key tweaking
12
+ * (lift_x, point_add, scalar_mul -- no external crypto dependencies)
13
+ * - **Per-input sighash computation** for multi-input transactions
14
+ * (each input gets its own BIP-341 sighash for independent FROST signing)
15
+ * - **Full transaction serialization** with proper segwit witness structure
16
+ * - **Broadcast via Mempool.space API** (mainnet, testnet, signet, regtest)
17
+ *
18
+ * No external dependencies beyond Node.js crypto (SHA-256).
14
19
  *
15
20
  * @example
16
21
  * ```typescript
@@ -66,13 +71,32 @@ export interface TaprootAddressInfo {
66
71
  outputKey: string;
67
72
  /** ScriptPubKey (hex-encoded, OP_1 <32-byte output key>) */
68
73
  scriptPubkey: string;
74
+ /**
75
+ * Taproot tweak scalar (64-char hex).
76
+ * This must be applied to the FROST group private key during signing:
77
+ * tweaked_privkey = privkey + tweak (mod n)
78
+ * The FROST signing request should include this tweak so agents can
79
+ * adjust their secret shares before producing partial signatures.
80
+ */
81
+ tapTweak: string;
69
82
  /** Network */
70
83
  network: BitcoinNetwork;
71
84
  }
72
85
  /** Unsigned Taproot transaction ready for FROST signing */
73
86
  export interface UnsignedTaprootTx {
74
- /** Sighash to sign via FROST (32 bytes, hex-encoded) */
87
+ /**
88
+ * Sighash for the first input (32 bytes, hex-encoded).
89
+ * For single-input transactions this is all you need.
90
+ * For multi-input transactions, use `sighashes` instead.
91
+ */
75
92
  sighash: string;
93
+ /**
94
+ * Per-input sighashes (32 bytes each, hex-encoded).
95
+ * Each input has its own BIP-341 sighash that must be independently
96
+ * signed via FROST. The same key signs all inputs, but each sighash
97
+ * includes the input index and produces a different message.
98
+ */
99
+ sighashes: string[];
76
100
  /** Serialized unsigned transaction (hex-encoded) */
77
101
  rawUnsigned: string;
78
102
  /** Transaction inputs */
@@ -145,6 +169,21 @@ export declare class BitcoinTaprootAdapter implements ChainAdapter {
145
169
  * @returns TaprootAddressInfo with address, keys, and scriptPubkey
146
170
  */
147
171
  deriveAddress(groupPubkeyHex: string): TaprootAddressInfo;
172
+ /**
173
+ * Compute the Taproot tweak for a FROST group public key.
174
+ *
175
+ * The FROST signing protocol must apply this tweak to the group private key
176
+ * before signing. This ensures the Schnorr signature verifies against the
177
+ * tweaked output key (which is what the scriptPubKey commits to).
178
+ *
179
+ * The tweak scalar t = hash_TapTweak(internal_key) is returned as hex.
180
+ * During FROST signing, the group's secret share is tweaked:
181
+ * tweaked_share = share + t (mod n)
182
+ *
183
+ * @param groupPubkeyHex - Hex-encoded FROST group verifying key (33 or 32 bytes)
184
+ * @returns Hex-encoded 32-byte tweak scalar
185
+ */
186
+ getTapTweak(groupPubkeyHex: string): string;
148
187
  /**
149
188
  * Fetch unspent transaction outputs (UTXOs) for a Taproot address.
150
189
  *
@@ -212,24 +251,36 @@ export declare class BitcoinTaprootAdapter implements ChainAdapter {
212
251
  */
213
252
  buildUnsignedTx(inputs: TaprootTxInput[], outputs: TaprootTxOutput[], feeRate: number): UnsignedTaprootTx;
214
253
  /**
215
- * Attach a FROST Schnorr signature to an unsigned Taproot transaction.
254
+ * Attach FROST Schnorr signature(s) to an unsigned Taproot transaction.
255
+ *
256
+ * The FROST signing protocol produces 64-byte BIP-340 Schnorr signatures
257
+ * (R_x || s) that are directly used as Taproot witness for key-path spends.
216
258
  *
217
- * The FROST signing protocol produces a 64-byte BIP-340 Schnorr signature
218
- * (R_x || s) that is directly used as the Taproot witness for key-path spends.
259
+ * For single-input transactions: pass a single 128-char hex signature.
260
+ * For multi-input transactions: pass signatures separated by commas, or
261
+ * a single signature that will be applied to all inputs (if all inputs
262
+ * share the same signing key and the caller signs each sighash separately).
219
263
  *
220
264
  * @param unsignedTxHex - Hex-encoded unsigned transaction (from buildTransaction)
221
- * @param signatureHex - 64-byte FROST Schnorr signature (hex-encoded, 128 chars)
265
+ * @param signatureHex - 64-byte FROST Schnorr signature(s). For multi-input
266
+ * transactions, separate per-input signatures with commas.
222
267
  * @returns Hex-encoded signed transaction ready for broadcast
223
268
  */
224
269
  attachSignature(unsignedTxHex: string, signatureHex: string): Promise<string>;
225
270
  /**
226
- * Attach a FROST Schnorr signature with full output (returns structured data).
271
+ * Attach FROST Schnorr signature(s) with full output (returns structured data).
227
272
  *
228
273
  * @param unsignedTx - The UnsignedTaprootTx from buildUnsignedTx
229
- * @param signatureHex - 64-byte FROST Schnorr signature (hex, 128 chars)
274
+ * @param signatureHex - 64-byte FROST Schnorr signature(s) (hex). For multi-input
275
+ * transactions, pass an array of per-input signatures or a comma-separated string.
230
276
  * @returns SignedTaprootTx with raw_signed, txid, and vsize
231
277
  */
232
- attachSignatureToTx(unsignedTx: UnsignedTaprootTx, signatureHex: string): SignedTaprootTx;
278
+ attachSignatureToTx(unsignedTx: UnsignedTaprootTx, signatureHex: string | string[]): SignedTaprootTx;
279
+ /**
280
+ * Parse signature hex into per-input signatures.
281
+ * Supports: single sig (applied to all inputs), comma-separated, or concatenated.
282
+ */
283
+ private parseSignatures;
233
284
  /**
234
285
  * Broadcast a signed Taproot transaction to the Bitcoin network.
235
286
  *
@@ -276,7 +327,10 @@ export declare class BitcoinTaprootAdapter implements ChainAdapter {
276
327
  */
277
328
  private serializeUnsignedTx;
278
329
  /**
279
- * Serialize a signed Taproot transaction.
330
+ * Serialize a signed Taproot transaction with per-input signatures.
331
+ *
332
+ * @param unsignedTx - The unsigned transaction data
333
+ * @param signatures - Array of per-input signature hex strings (128 chars each)
280
334
  */
281
335
  private serializeSignedTx;
282
336
  /**
@@ -295,7 +349,16 @@ export declare class BitcoinTaprootAdapter implements ChainAdapter {
295
349
  * - Spend type (0x00 for key-path, no annex)
296
350
  * - Input index (4 bytes LE)
297
351
  */
298
- private computeSighash;
352
+ /**
353
+ * Compute all per-input BIP-341 sighashes for the transaction.
354
+ *
355
+ * Each input has its own sighash because the input_index field differs.
356
+ * The common transaction-level hashes (prevouts, amounts, scripts, sequences,
357
+ * outputs) are precomputed once and reused across all inputs.
358
+ *
359
+ * @returns Array of hex-encoded sighashes, one per input
360
+ */
361
+ private computeAllSighashes;
299
362
  }
300
363
  /**
301
364
  * Create a Bitcoin Taproot adapter for mainnet.
@@ -1 +1 @@
1
- {"version":3,"file":"bitcoin-taproot.d.ts","sourceRoot":"","sources":["../../src/chains/bitcoin-taproot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bitcoin-taproot.d.ts","sourceRoot":"","sources":["../../src/chains/bitcoin-taproot.ts"],"names":[],"mappings":"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"}