@sequence0/sdk 1.1.2 → 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.
- package/README.md +1 -1
- package/dist/chains/algorand.d.ts +44 -0
- package/dist/chains/algorand.d.ts.map +1 -0
- package/dist/chains/algorand.js +148 -0
- package/dist/chains/algorand.js.map +1 -0
- package/dist/chains/aptos.d.ts +39 -0
- package/dist/chains/aptos.d.ts.map +1 -0
- package/dist/chains/aptos.js +168 -0
- package/dist/chains/aptos.js.map +1 -0
- package/dist/chains/cardano.d.ts +42 -0
- package/dist/chains/cardano.d.ts.map +1 -0
- package/dist/chains/cardano.js +188 -0
- package/dist/chains/cardano.js.map +1 -0
- package/dist/chains/cosmos.d.ts +42 -0
- package/dist/chains/cosmos.d.ts.map +1 -0
- package/dist/chains/cosmos.js +216 -0
- package/dist/chains/cosmos.js.map +1 -0
- package/dist/chains/dogecoin-litecoin.d.ts +57 -0
- package/dist/chains/dogecoin-litecoin.d.ts.map +1 -0
- package/dist/chains/dogecoin-litecoin.js +521 -0
- package/dist/chains/dogecoin-litecoin.js.map +1 -0
- package/dist/chains/ethereum.d.ts.map +1 -1
- package/dist/chains/ethereum.js +16 -0
- package/dist/chains/ethereum.js.map +1 -1
- package/dist/chains/hedera.d.ts +113 -0
- package/dist/chains/hedera.d.ts.map +1 -0
- package/dist/chains/hedera.js +302 -0
- package/dist/chains/hedera.js.map +1 -0
- package/dist/chains/icp.d.ts +95 -0
- package/dist/chains/icp.d.ts.map +1 -0
- package/dist/chains/icp.js +520 -0
- package/dist/chains/icp.js.map +1 -0
- package/dist/chains/kaspa.d.ts +152 -0
- package/dist/chains/kaspa.d.ts.map +1 -0
- package/dist/chains/kaspa.js +790 -0
- package/dist/chains/kaspa.js.map +1 -0
- package/dist/chains/multiversx.d.ts +143 -0
- package/dist/chains/multiversx.d.ts.map +1 -0
- package/dist/chains/multiversx.js +524 -0
- package/dist/chains/multiversx.js.map +1 -0
- package/dist/chains/near.d.ts +40 -0
- package/dist/chains/near.d.ts.map +1 -0
- package/dist/chains/near.js +170 -0
- package/dist/chains/near.js.map +1 -0
- package/dist/chains/polkadot.d.ts +43 -0
- package/dist/chains/polkadot.d.ts.map +1 -0
- package/dist/chains/polkadot.js +179 -0
- package/dist/chains/polkadot.js.map +1 -0
- package/dist/chains/ripple.d.ts +41 -0
- package/dist/chains/ripple.d.ts.map +1 -0
- package/dist/chains/ripple.js +190 -0
- package/dist/chains/ripple.js.map +1 -0
- package/dist/chains/stellar.d.ts +40 -0
- package/dist/chains/stellar.d.ts.map +1 -0
- package/dist/chains/stellar.js +156 -0
- package/dist/chains/stellar.js.map +1 -0
- package/dist/chains/sui.d.ts +44 -0
- package/dist/chains/sui.d.ts.map +1 -0
- package/dist/chains/sui.js +157 -0
- package/dist/chains/sui.js.map +1 -0
- package/dist/chains/tezos.d.ts +43 -0
- package/dist/chains/tezos.d.ts.map +1 -0
- package/dist/chains/tezos.js +162 -0
- package/dist/chains/tezos.js.map +1 -0
- package/dist/chains/ton.d.ts +40 -0
- package/dist/chains/ton.d.ts.map +1 -0
- package/dist/chains/ton.js +168 -0
- package/dist/chains/ton.js.map +1 -0
- package/dist/chains/tron.d.ts +41 -0
- package/dist/chains/tron.d.ts.map +1 -0
- package/dist/chains/tron.js +124 -0
- package/dist/chains/tron.js.map +1 -0
- package/dist/core/types.d.ts +161 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +19 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +79 -4
- package/dist/index.js.map +1 -1
- package/dist/utils/optional-deps.d.ts +9 -0
- package/dist/utils/optional-deps.d.ts.map +1 -0
- package/dist/utils/optional-deps.js +21 -0
- package/dist/utils/optional-deps.js.map +1 -0
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +6 -1
- package/dist/utils/validation.js.map +1 -1
- package/dist/wallet/wallet.d.ts.map +1 -1
- package/dist/wallet/wallet.js +61 -33
- package/dist/wallet/wallet.js.map +1 -1
- package/package.json +35 -1
package/README.md
CHANGED
|
@@ -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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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cardano Chain Adapter
|
|
3
|
+
*
|
|
4
|
+
* Builds Cardano transactions using CBOR serialization, attaches
|
|
5
|
+
* Ed25519 signatures from the FROST threshold signing network,
|
|
6
|
+
* and broadcasts via Blockfrost API.
|
|
7
|
+
*
|
|
8
|
+
* Requires: npm install @emurgo/cardano-serialization-lib-nodejs
|
|
9
|
+
*/
|
|
10
|
+
import { ChainAdapter, CardanoTransaction } from '../core/types';
|
|
11
|
+
export declare class CardanoAdapter implements ChainAdapter {
|
|
12
|
+
private rpcUrl;
|
|
13
|
+
private network;
|
|
14
|
+
private cardanoWasm;
|
|
15
|
+
private apiKey;
|
|
16
|
+
constructor(network?: 'mainnet' | 'preprod' | 'preview', rpcUrl?: string, apiKey?: string);
|
|
17
|
+
getRpcUrl(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Build an unsigned Cardano transaction.
|
|
20
|
+
*
|
|
21
|
+
* Cardano is UTXO-based. The signing payload is
|
|
22
|
+
* Blake2b-256(transaction_body_cbor).
|
|
23
|
+
*/
|
|
24
|
+
buildTransaction(tx: CardanoTransaction, fromAddress: string): Promise<string>;
|
|
25
|
+
getSigningPayload(unsignedTx: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Attach an Ed25519 signature to the Cardano transaction
|
|
28
|
+
*/
|
|
29
|
+
attachSignature(unsignedTx: string, signature: string): Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Broadcast a signed Cardano transaction
|
|
32
|
+
*/
|
|
33
|
+
broadcast(signedTx: string): Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* Get ADA balance in lovelace
|
|
36
|
+
*/
|
|
37
|
+
getBalance(address: string): Promise<string>;
|
|
38
|
+
private fetchUtxos;
|
|
39
|
+
}
|
|
40
|
+
export declare function createCardanoAdapter(apiKey?: string): CardanoAdapter;
|
|
41
|
+
export declare function createCardanoPreprodAdapter(apiKey?: string): CardanoAdapter;
|
|
42
|
+
//# sourceMappingURL=cardano.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cardano.d.ts","sourceRoot":"","sources":["../../src/chains/cardano.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAUjE,qBAAa,cAAe,YAAW,YAAY;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,MAAM,CAAS;gBAGnB,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,EACtD,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,SAAK;IAWf,SAAS,IAAI,MAAM;IAInB;;;;;OAKG;IACG,gBAAgB,CAAC,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAwEpF,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;IAoDlD;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAcpC,UAAU;CAY3B;AAED,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CAEpE;AAED,wBAAgB,2BAA2B,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CAE3E"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cardano Chain Adapter
|
|
4
|
+
*
|
|
5
|
+
* Builds Cardano transactions using CBOR serialization, attaches
|
|
6
|
+
* Ed25519 signatures from the FROST threshold signing network,
|
|
7
|
+
* and broadcasts via Blockfrost API.
|
|
8
|
+
*
|
|
9
|
+
* Requires: npm install @emurgo/cardano-serialization-lib-nodejs
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CardanoAdapter = void 0;
|
|
13
|
+
exports.createCardanoAdapter = createCardanoAdapter;
|
|
14
|
+
exports.createCardanoPreprodAdapter = createCardanoPreprodAdapter;
|
|
15
|
+
const errors_1 = require("../utils/errors");
|
|
16
|
+
const optional_deps_1 = require("../utils/optional-deps");
|
|
17
|
+
const BLOCKFROST_URLS = {
|
|
18
|
+
'mainnet': 'https://cardano-mainnet.blockfrost.io/api/v0',
|
|
19
|
+
'preprod': 'https://cardano-preprod.blockfrost.io/api/v0',
|
|
20
|
+
'preview': 'https://cardano-preview.blockfrost.io/api/v0',
|
|
21
|
+
};
|
|
22
|
+
class CardanoAdapter {
|
|
23
|
+
constructor(network = 'mainnet', rpcUrl, apiKey = '') {
|
|
24
|
+
this.network = network;
|
|
25
|
+
this.rpcUrl = rpcUrl || BLOCKFROST_URLS[network];
|
|
26
|
+
this.apiKey = apiKey;
|
|
27
|
+
this.cardanoWasm = (0, optional_deps_1.requireOptionalDependency)('@emurgo/cardano-serialization-lib-nodejs', 'cardano');
|
|
28
|
+
}
|
|
29
|
+
getRpcUrl() {
|
|
30
|
+
return this.rpcUrl;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Build an unsigned Cardano transaction.
|
|
34
|
+
*
|
|
35
|
+
* Cardano is UTXO-based. The signing payload is
|
|
36
|
+
* Blake2b-256(transaction_body_cbor).
|
|
37
|
+
*/
|
|
38
|
+
async buildTransaction(tx, fromAddress) {
|
|
39
|
+
try {
|
|
40
|
+
const CSL = this.cardanoWasm;
|
|
41
|
+
// Fetch UTXOs from Blockfrost
|
|
42
|
+
const utxos = await this.fetchUtxos(fromAddress);
|
|
43
|
+
if (!utxos || utxos.length === 0) {
|
|
44
|
+
throw new Error('No UTXOs found for address');
|
|
45
|
+
}
|
|
46
|
+
// Build transaction
|
|
47
|
+
const txBuilder = CSL.TransactionBuilder.new(CSL.TransactionBuilderConfigBuilder.new()
|
|
48
|
+
.fee_algo(CSL.LinearFee.new(CSL.BigNum.from_str('44'), CSL.BigNum.from_str('155381')))
|
|
49
|
+
.pool_deposit(CSL.BigNum.from_str('500000000'))
|
|
50
|
+
.key_deposit(CSL.BigNum.from_str('2000000'))
|
|
51
|
+
.max_value_size(5000)
|
|
52
|
+
.max_tx_size(16384)
|
|
53
|
+
.coins_per_utxo_byte(CSL.BigNum.from_str('4310'))
|
|
54
|
+
.build());
|
|
55
|
+
// Add inputs
|
|
56
|
+
for (const utxo of utxos) {
|
|
57
|
+
const txInput = CSL.TransactionInput.new(CSL.TransactionHash.from_bytes(Buffer.from(utxo.tx_hash, 'hex')), utxo.output_index);
|
|
58
|
+
const amount = CSL.Value.new(CSL.BigNum.from_str(utxo.amount));
|
|
59
|
+
txBuilder.add_input(CSL.Address.from_bech32(fromAddress), txInput, amount);
|
|
60
|
+
}
|
|
61
|
+
// Add output
|
|
62
|
+
txBuilder.add_output(CSL.TransactionOutput.new(CSL.Address.from_bech32(tx.to), CSL.Value.new(CSL.BigNum.from_str(tx.amount))));
|
|
63
|
+
// Set change address
|
|
64
|
+
txBuilder.add_change_if_needed(CSL.Address.from_bech32(fromAddress));
|
|
65
|
+
// Build the transaction body
|
|
66
|
+
const txBody = txBuilder.build();
|
|
67
|
+
const txHash = CSL.hash_transaction(txBody);
|
|
68
|
+
const payload = {
|
|
69
|
+
signingHash: Buffer.from(txHash.to_bytes()).toString('hex'),
|
|
70
|
+
txBodyBytes: Buffer.from(txBody.to_bytes()).toString('hex'),
|
|
71
|
+
fromAddress,
|
|
72
|
+
toAddress: tx.to,
|
|
73
|
+
amount: tx.amount,
|
|
74
|
+
};
|
|
75
|
+
return Buffer.from(JSON.stringify(payload)).toString('hex');
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
if (e instanceof errors_1.ChainError)
|
|
79
|
+
throw e;
|
|
80
|
+
throw new errors_1.ChainError(`Failed to build Cardano transaction: ${e.message}`, 'cardano');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
getSigningPayload(unsignedTx) {
|
|
84
|
+
try {
|
|
85
|
+
const payload = JSON.parse(Buffer.from(unsignedTx, 'hex').toString());
|
|
86
|
+
return payload.signingHash;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return unsignedTx;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Attach an Ed25519 signature to the Cardano transaction
|
|
94
|
+
*/
|
|
95
|
+
async attachSignature(unsignedTx, signature) {
|
|
96
|
+
try {
|
|
97
|
+
const payload = JSON.parse(Buffer.from(unsignedTx, 'hex').toString());
|
|
98
|
+
const sig = signature.startsWith('0x') ? signature.slice(2) : signature;
|
|
99
|
+
const signedPayload = {
|
|
100
|
+
...payload,
|
|
101
|
+
signature: sig,
|
|
102
|
+
};
|
|
103
|
+
return Buffer.from(JSON.stringify(signedPayload)).toString('hex');
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
throw new errors_1.ChainError(`Failed to attach Cardano signature: ${e.message}`, 'cardano');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Broadcast a signed Cardano transaction
|
|
111
|
+
*/
|
|
112
|
+
async broadcast(signedTx) {
|
|
113
|
+
try {
|
|
114
|
+
const CSL = this.cardanoWasm;
|
|
115
|
+
const payload = JSON.parse(Buffer.from(signedTx, 'hex').toString());
|
|
116
|
+
// Reconstruct the signed transaction
|
|
117
|
+
const txBody = CSL.TransactionBody.from_bytes(Buffer.from(payload.txBodyBytes, 'hex'));
|
|
118
|
+
const sigBytes = Buffer.from(payload.signature, 'hex');
|
|
119
|
+
// Create witness set with the Ed25519 signature
|
|
120
|
+
const witnesses = CSL.TransactionWitnessSet.new();
|
|
121
|
+
const vkeyWitnesses = CSL.Vkeywitnesses.new();
|
|
122
|
+
vkeyWitnesses.add(CSL.Vkeywitness.new(CSL.Vkey.new(CSL.PublicKey.from_bytes(Buffer.alloc(32))), // placeholder
|
|
123
|
+
CSL.Ed25519Signature.from_bytes(sigBytes)));
|
|
124
|
+
witnesses.set_vkeys(vkeyWitnesses);
|
|
125
|
+
const signedTransaction = CSL.Transaction.new(txBody, witnesses);
|
|
126
|
+
const txBytes = signedTransaction.to_bytes();
|
|
127
|
+
// Submit via Blockfrost
|
|
128
|
+
const response = await fetch(`${this.rpcUrl}/tx/submit`, {
|
|
129
|
+
method: 'POST',
|
|
130
|
+
headers: {
|
|
131
|
+
'Content-Type': 'application/cbor',
|
|
132
|
+
'project_id': this.apiKey,
|
|
133
|
+
},
|
|
134
|
+
body: txBytes,
|
|
135
|
+
});
|
|
136
|
+
if (!response.ok) {
|
|
137
|
+
const error = await response.text();
|
|
138
|
+
throw new Error(`Blockfrost error: ${error}`);
|
|
139
|
+
}
|
|
140
|
+
const txHash = await response.text();
|
|
141
|
+
return txHash.replace(/"/g, '');
|
|
142
|
+
}
|
|
143
|
+
catch (e) {
|
|
144
|
+
if (e instanceof errors_1.ChainError)
|
|
145
|
+
throw e;
|
|
146
|
+
throw new errors_1.ChainError(`Failed to broadcast Cardano tx: ${e.message}`, 'cardano');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get ADA balance in lovelace
|
|
151
|
+
*/
|
|
152
|
+
async getBalance(address) {
|
|
153
|
+
try {
|
|
154
|
+
const response = await fetch(`${this.rpcUrl}/addresses/${address}`, {
|
|
155
|
+
headers: { 'project_id': this.apiKey },
|
|
156
|
+
});
|
|
157
|
+
if (!response.ok)
|
|
158
|
+
return '0';
|
|
159
|
+
const data = await response.json();
|
|
160
|
+
const lovelace = data.amount?.find((a) => a.unit === 'lovelace');
|
|
161
|
+
return lovelace?.quantity || '0';
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return '0';
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async fetchUtxos(address) {
|
|
168
|
+
const response = await fetch(`${this.rpcUrl}/addresses/${address}/utxos`, {
|
|
169
|
+
headers: { 'project_id': this.apiKey },
|
|
170
|
+
});
|
|
171
|
+
if (!response.ok)
|
|
172
|
+
return [];
|
|
173
|
+
const utxos = await response.json();
|
|
174
|
+
return utxos.map((u) => ({
|
|
175
|
+
tx_hash: u.tx_hash,
|
|
176
|
+
output_index: u.output_index,
|
|
177
|
+
amount: u.amount.find((a) => a.unit === 'lovelace')?.quantity || '0',
|
|
178
|
+
}));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.CardanoAdapter = CardanoAdapter;
|
|
182
|
+
function createCardanoAdapter(apiKey) {
|
|
183
|
+
return new CardanoAdapter('mainnet', undefined, apiKey);
|
|
184
|
+
}
|
|
185
|
+
function createCardanoPreprodAdapter(apiKey) {
|
|
186
|
+
return new CardanoAdapter('preprod', undefined, apiKey);
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=cardano.js.map
|