@sequence0/sdk 1.1.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/atomic.d.ts +76 -0
- package/dist/core/atomic.d.ts.map +1 -0
- package/dist/core/atomic.js +39 -0
- package/dist/core/atomic.js.map +1 -0
- package/dist/core/client.d.ts +238 -0
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +536 -4
- package/dist/core/client.js.map +1 -1
- package/dist/core/delegation.d.ts +184 -0
- package/dist/core/delegation.d.ts.map +1 -0
- package/dist/core/delegation.js +37 -0
- package/dist/core/delegation.js.map +1 -0
- package/dist/core/programmable.d.ts +66 -0
- package/dist/core/programmable.d.ts.map +1 -0
- package/dist/core/programmable.js +36 -0
- package/dist/core/programmable.js.map +1 -0
- package/dist/core/solvency.d.ts +223 -0
- package/dist/core/solvency.d.ts.map +1 -0
- package/dist/core/solvency.js +267 -0
- package/dist/core/solvency.js.map +1 -0
- package/dist/core/types.d.ts +172 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/universal-account.d.ts +438 -0
- package/dist/core/universal-account.d.ts.map +1 -0
- package/dist/core/universal-account.js +597 -0
- package/dist/core/universal-account.js.map +1 -0
- package/dist/core/witness.d.ts +197 -0
- package/dist/core/witness.d.ts.map +1 -0
- package/dist/core/witness.js +298 -0
- package/dist/core/witness.js.map +1 -0
- package/dist/erc4337/types.js +2 -2
- package/dist/index.d.ts +30 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +91 -4
- package/dist/index.js.map +1 -1
- package/dist/settlement/settlement.d.ts +152 -0
- package/dist/settlement/settlement.d.ts.map +1 -0
- package/dist/settlement/settlement.js +172 -0
- package/dist/settlement/settlement.js.map +1 -0
- package/dist/utils/eip712.js +2 -2
- package/dist/utils/fee.d.ts +2 -2
- package/dist/utils/fee.js +2 -2
- 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 +52 -0
- package/dist/wallet/wallet.d.ts.map +1 -1
- package/dist/wallet/wallet.js +265 -33
- package/dist/wallet/wallet.js.map +1 -1
- package/package.json +35 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Near Chain Adapter
|
|
4
|
+
*
|
|
5
|
+
* Builds Near Protocol transactions using Borsh serialization,
|
|
6
|
+
* attaches Ed25519 signatures from the FROST threshold signing
|
|
7
|
+
* network, and broadcasts via Near JSON RPC.
|
|
8
|
+
*
|
|
9
|
+
* Requires: npm install near-api-js
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.NearAdapter = void 0;
|
|
13
|
+
exports.createNearAdapter = createNearAdapter;
|
|
14
|
+
exports.createNearTestnetAdapter = createNearTestnetAdapter;
|
|
15
|
+
const errors_1 = require("../utils/errors");
|
|
16
|
+
const optional_deps_1 = require("../utils/optional-deps");
|
|
17
|
+
const DEFAULT_RPCS = {
|
|
18
|
+
'mainnet': 'https://rpc.mainnet.near.org',
|
|
19
|
+
'testnet': 'https://rpc.testnet.near.org',
|
|
20
|
+
};
|
|
21
|
+
class NearAdapter {
|
|
22
|
+
constructor(network = 'mainnet', rpcUrl) {
|
|
23
|
+
this.network = network;
|
|
24
|
+
this.rpcUrl = rpcUrl || DEFAULT_RPCS[network];
|
|
25
|
+
this.nearApi = (0, optional_deps_1.requireOptionalDependency)('near-api-js', 'near');
|
|
26
|
+
}
|
|
27
|
+
getRpcUrl() {
|
|
28
|
+
return this.rpcUrl;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build an unsigned Near transaction.
|
|
32
|
+
*
|
|
33
|
+
* Near uses Borsh serialization. The signing payload is
|
|
34
|
+
* SHA-256 of the Borsh-serialized Transaction object.
|
|
35
|
+
*/
|
|
36
|
+
async buildTransaction(tx, fromAddress) {
|
|
37
|
+
try {
|
|
38
|
+
const { connect, keyStores, transactions, utils } = this.nearApi;
|
|
39
|
+
// Connect to get access key info (nonce, block hash)
|
|
40
|
+
const near = await connect({
|
|
41
|
+
networkId: this.network,
|
|
42
|
+
nodeUrl: this.rpcUrl,
|
|
43
|
+
keyStore: new keyStores.InMemoryKeyStore(),
|
|
44
|
+
});
|
|
45
|
+
const provider = near.connection.provider;
|
|
46
|
+
// Get access key for nonce
|
|
47
|
+
const accessKeyInfo = await provider.query({
|
|
48
|
+
request_type: 'view_access_key',
|
|
49
|
+
account_id: fromAddress,
|
|
50
|
+
public_key: '', // Will use the wallet's public key
|
|
51
|
+
finality: 'final',
|
|
52
|
+
}).catch(() => ({ nonce: 0 }));
|
|
53
|
+
const nonce = accessKeyInfo.nonce + 1;
|
|
54
|
+
// Get recent block hash for replay protection
|
|
55
|
+
const block = await provider.block({ finality: 'final' });
|
|
56
|
+
const blockHash = utils.serialize.base_decode(block.header.hash);
|
|
57
|
+
// Build transfer action
|
|
58
|
+
const actions = [transactions.transfer(BigInt(tx.amount))];
|
|
59
|
+
// Create the transaction
|
|
60
|
+
const transaction = transactions.createTransaction(fromAddress, utils.PublicKey.from('ed25519:' + '0'.repeat(64)), // placeholder
|
|
61
|
+
tx.to, nonce, actions, blockHash);
|
|
62
|
+
// Serialize and hash
|
|
63
|
+
const serialized = utils.serialize.serialize(transactions.SCHEMA.Transaction ?? transactions.SCHEMA, transaction);
|
|
64
|
+
const crypto = require('crypto');
|
|
65
|
+
const signingHash = crypto.createHash('sha256').update(Buffer.from(serialized)).digest();
|
|
66
|
+
const payload = {
|
|
67
|
+
signingHash: Buffer.from(signingHash).toString('hex'),
|
|
68
|
+
serialized: Buffer.from(serialized).toString('hex'),
|
|
69
|
+
fromAddress,
|
|
70
|
+
toAddress: tx.to,
|
|
71
|
+
amount: tx.amount,
|
|
72
|
+
nonce,
|
|
73
|
+
blockHash: Buffer.from(blockHash).toString('hex'),
|
|
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 Near transaction: ${e.message}`, 'near');
|
|
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 Near 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, // 64-byte Ed25519 signature
|
|
102
|
+
};
|
|
103
|
+
return Buffer.from(JSON.stringify(signedPayload)).toString('hex');
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
throw new errors_1.ChainError(`Failed to attach Near signature: ${e.message}`, 'near');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Broadcast a signed Near transaction
|
|
111
|
+
*/
|
|
112
|
+
async broadcast(signedTx) {
|
|
113
|
+
try {
|
|
114
|
+
const { connect, keyStores, transactions, utils } = this.nearApi;
|
|
115
|
+
const payload = JSON.parse(Buffer.from(signedTx, 'hex').toString());
|
|
116
|
+
const near = await connect({
|
|
117
|
+
networkId: this.network,
|
|
118
|
+
nodeUrl: this.rpcUrl,
|
|
119
|
+
keyStore: new keyStores.InMemoryKeyStore(),
|
|
120
|
+
});
|
|
121
|
+
const provider = near.connection.provider;
|
|
122
|
+
// Reconstruct signed transaction
|
|
123
|
+
const serializedTx = Buffer.from(payload.serialized, 'hex');
|
|
124
|
+
const sigBytes = Buffer.from(payload.signature, 'hex');
|
|
125
|
+
// Build the signed transaction bytes (transaction + signature)
|
|
126
|
+
const signedTxBytes = Buffer.concat([
|
|
127
|
+
serializedTx,
|
|
128
|
+
Buffer.from([0]), // Ed25519 key type
|
|
129
|
+
sigBytes,
|
|
130
|
+
]);
|
|
131
|
+
// Send via RPC
|
|
132
|
+
const result = await provider.sendJsonRpc('broadcast_tx_commit', [
|
|
133
|
+
Buffer.from(signedTxBytes).toString('base64'),
|
|
134
|
+
]);
|
|
135
|
+
return result.transaction?.hash || '';
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
if (e instanceof errors_1.ChainError)
|
|
139
|
+
throw e;
|
|
140
|
+
throw new errors_1.ChainError(`Failed to broadcast Near tx: ${e.message}`, 'near');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get NEAR balance in yoctoNEAR
|
|
145
|
+
*/
|
|
146
|
+
async getBalance(address) {
|
|
147
|
+
try {
|
|
148
|
+
const { connect, keyStores } = this.nearApi;
|
|
149
|
+
const near = await connect({
|
|
150
|
+
networkId: this.network,
|
|
151
|
+
nodeUrl: this.rpcUrl,
|
|
152
|
+
keyStore: new keyStores.InMemoryKeyStore(),
|
|
153
|
+
});
|
|
154
|
+
const account = await near.account(address);
|
|
155
|
+
const balance = await account.getAccountBalance();
|
|
156
|
+
return balance.available;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return '0';
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.NearAdapter = NearAdapter;
|
|
164
|
+
function createNearAdapter(rpcUrl) {
|
|
165
|
+
return new NearAdapter('mainnet', rpcUrl);
|
|
166
|
+
}
|
|
167
|
+
function createNearTestnetAdapter(rpcUrl) {
|
|
168
|
+
return new NearAdapter('testnet', rpcUrl);
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=near.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"near.js","sourceRoot":"","sources":["../../src/chains/near.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAmMH,8CAEC;AAED,4DAEC;AAtMD,4CAA6C;AAC7C,0DAAmE;AAEnE,MAAM,YAAY,GAA2B;IACzC,SAAS,EAAE,8BAA8B;IACzC,SAAS,EAAE,8BAA8B;CAC5C,CAAC;AAEF,MAAa,WAAW;IAKpB,YAAY,UAAiC,SAAS,EAAE,MAAe;QACnE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,IAAA,yCAAyB,EAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,gBAAgB,CAAC,EAAmB,EAAE,WAAmB;QAC3D,IAAI,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAEjE,qDAAqD;YACrD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;gBACvB,SAAS,EAAE,IAAI,CAAC,OAAO;gBACvB,OAAO,EAAE,IAAI,CAAC,MAAM;gBACpB,QAAQ,EAAE,IAAI,SAAS,CAAC,gBAAgB,EAAE;aAC7C,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAE1C,2BAA2B;YAC3B,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC;gBACvC,YAAY,EAAE,iBAAiB;gBAC/B,UAAU,EAAE,WAAW;gBACvB,UAAU,EAAE,EAAE,EAAE,mCAAmC;gBACnD,QAAQ,EAAE,OAAO;aACpB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAE/B,MAAM,KAAK,GAAI,aAAqB,CAAC,KAAK,GAAG,CAAC,CAAC;YAE/C,8CAA8C;YAC9C,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEjE,wBAAwB;YACxB,MAAM,OAAO,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAE3D,yBAAyB;YACzB,MAAM,WAAW,GAAG,YAAY,CAAC,iBAAiB,CAC9C,WAAW,EACX,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc;YACjE,EAAE,CAAC,EAAE,EACL,KAAK,EACL,OAAO,EACP,SAAS,CACZ,CAAC;YAEF,qBAAqB;YACrB,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CACxC,YAAY,CAAC,MAAM,CAAC,WAAW,IAAI,YAAY,CAAC,MAAM,EACtD,WAAW,CACd,CAAC;YAEF,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjC,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAEzF,MAAM,OAAO,GAAG;gBACZ,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACrD,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACnD,WAAW;gBACX,SAAS,EAAE,EAAE,CAAC,EAAE;gBAChB,MAAM,EAAE,EAAE,CAAC,MAAM;gBACjB,KAAK;gBACL,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;aACpD,CAAC;YAEF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,YAAY,mBAAU;gBAAE,MAAM,CAAC,CAAC;YACrC,MAAM,IAAI,mBAAU,CAChB,qCAAsC,CAAW,CAAC,OAAO,EAAE,EAC3D,MAAM,CACT,CAAC;QACN,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,UAAkB;QAChC,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtE,OAAO,OAAO,CAAC,WAAW,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,UAAU,CAAC;QACtB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,UAAkB,EAAE,SAAiB;QACvD,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtE,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAExE,MAAM,aAAa,GAAG;gBAClB,GAAG,OAAO;gBACV,SAAS,EAAE,GAAG,EAAE,4BAA4B;aAC/C,CAAC;YAEF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,MAAM,IAAI,mBAAU,CAChB,oCAAqC,CAAW,CAAC,OAAO,EAAE,EAC1D,MAAM,CACT,CAAC;QACN,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC5B,IAAI,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACjE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAEpE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;gBACvB,SAAS,EAAE,IAAI,CAAC,OAAO;gBACvB,OAAO,EAAE,IAAI,CAAC,MAAM;gBACpB,QAAQ,EAAE,IAAI,SAAS,CAAC,gBAAgB,EAAE;aAC7C,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAE1C,iCAAiC;YACjC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAEvD,+DAA+D;YAC/D,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;gBAChC,YAAY;gBACZ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB;gBACrC,QAAQ;aACX,CAAC,CAAC;YAEH,eAAe;YACf,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,qBAAqB,EAAE;gBAC7D,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;aAChD,CAAC,CAAC;YAEH,OAAQ,MAAc,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;QACnD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,YAAY,mBAAU;gBAAE,MAAM,CAAC,CAAC;YACrC,MAAM,IAAI,mBAAU,CAChB,gCAAiC,CAAW,CAAC,OAAO,EAAE,EACtD,MAAM,CACT,CAAC;QACN,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,OAAe;QAC5B,IAAI,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAC5C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;gBACvB,SAAS,EAAE,IAAI,CAAC,OAAO;gBACvB,OAAO,EAAE,IAAI,CAAC,MAAM;gBACpB,QAAQ,EAAE,IAAI,SAAS,CAAC,gBAAgB,EAAE;aAC7C,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAClD,OAAO,OAAO,CAAC,SAAS,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,GAAG,CAAC;QACf,CAAC;IACL,CAAC;CACJ;AAtLD,kCAsLC;AAED,SAAgB,iBAAiB,CAAC,MAAe;IAC7C,OAAO,IAAI,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,SAAgB,wBAAwB,CAAC,MAAe;IACpD,OAAO,IAAI,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polkadot Chain Adapter
|
|
3
|
+
*
|
|
4
|
+
* Builds Polkadot extrinsics using SCALE codec, attaches Ed25519
|
|
5
|
+
* signatures from the FROST threshold signing network, and broadcasts
|
|
6
|
+
* via Polkadot JSON RPC.
|
|
7
|
+
*
|
|
8
|
+
* Uses Ed25519 key type (not sr25519) for FROST compatibility.
|
|
9
|
+
*
|
|
10
|
+
* Requires: npm install @polkadot/api
|
|
11
|
+
*/
|
|
12
|
+
import { ChainAdapter, PolkadotTransaction } from '../core/types';
|
|
13
|
+
export declare class PolkadotAdapter implements ChainAdapter {
|
|
14
|
+
private rpcUrl;
|
|
15
|
+
private network;
|
|
16
|
+
private polkadotApi;
|
|
17
|
+
constructor(network?: 'mainnet' | 'westend' | 'kusama', rpcUrl?: string);
|
|
18
|
+
getRpcUrl(): string;
|
|
19
|
+
/**
|
|
20
|
+
* Build an unsigned Polkadot balance transfer extrinsic.
|
|
21
|
+
*
|
|
22
|
+
* The signing payload is SCALE-encoded ExtrinsicPayload.
|
|
23
|
+
* If payload > 256 bytes, it's hashed with Blake2b-256 before signing.
|
|
24
|
+
*/
|
|
25
|
+
buildTransaction(tx: PolkadotTransaction, fromAddress: string): Promise<string>;
|
|
26
|
+
getSigningPayload(unsignedTx: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Attach an Ed25519 signature to the Polkadot extrinsic
|
|
29
|
+
*/
|
|
30
|
+
attachSignature(unsignedTx: string, signature: string): Promise<string>;
|
|
31
|
+
/**
|
|
32
|
+
* Broadcast a signed Polkadot extrinsic
|
|
33
|
+
*/
|
|
34
|
+
broadcast(signedTx: string): Promise<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Get DOT balance in planck
|
|
37
|
+
*/
|
|
38
|
+
getBalance(address: string): Promise<string>;
|
|
39
|
+
}
|
|
40
|
+
export declare function createPolkadotAdapter(rpcUrl?: string): PolkadotAdapter;
|
|
41
|
+
export declare function createKusamaAdapter(rpcUrl?: string): PolkadotAdapter;
|
|
42
|
+
export declare function createPolkadotWestendAdapter(rpcUrl?: string): PolkadotAdapter;
|
|
43
|
+
//# sourceMappingURL=polkadot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polkadot.d.ts","sourceRoot":"","sources":["../../src/chains/polkadot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAUlE,qBAAa,eAAgB,YAAW,YAAY;IAChD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAM;gBAEb,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,QAAoB,EAAE,MAAM,CAAC,EAAE,MAAM;IAMlF,SAAS,IAAI,MAAM;IAInB;;;;;OAKG;IACG,gBAAgB,CAAC,EAAE,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+DrF,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;IAuClD;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAYrD;AAED,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAEtE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAEpE;AAED,wBAAgB,4BAA4B,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAE7E"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Polkadot Chain Adapter
|
|
4
|
+
*
|
|
5
|
+
* Builds Polkadot extrinsics using SCALE codec, attaches Ed25519
|
|
6
|
+
* signatures from the FROST threshold signing network, and broadcasts
|
|
7
|
+
* via Polkadot JSON RPC.
|
|
8
|
+
*
|
|
9
|
+
* Uses Ed25519 key type (not sr25519) for FROST compatibility.
|
|
10
|
+
*
|
|
11
|
+
* Requires: npm install @polkadot/api
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.PolkadotAdapter = void 0;
|
|
15
|
+
exports.createPolkadotAdapter = createPolkadotAdapter;
|
|
16
|
+
exports.createKusamaAdapter = createKusamaAdapter;
|
|
17
|
+
exports.createPolkadotWestendAdapter = createPolkadotWestendAdapter;
|
|
18
|
+
const errors_1 = require("../utils/errors");
|
|
19
|
+
const optional_deps_1 = require("../utils/optional-deps");
|
|
20
|
+
const DEFAULT_RPCS = {
|
|
21
|
+
'mainnet': 'wss://rpc.polkadot.io',
|
|
22
|
+
'westend': 'wss://westend-rpc.polkadot.io',
|
|
23
|
+
'kusama': 'wss://kusama-rpc.polkadot.io',
|
|
24
|
+
};
|
|
25
|
+
class PolkadotAdapter {
|
|
26
|
+
constructor(network = 'mainnet', rpcUrl) {
|
|
27
|
+
this.network = network;
|
|
28
|
+
this.rpcUrl = rpcUrl || DEFAULT_RPCS[network];
|
|
29
|
+
this.polkadotApi = (0, optional_deps_1.requireOptionalDependency)('@polkadot/api', 'polkadot');
|
|
30
|
+
}
|
|
31
|
+
getRpcUrl() {
|
|
32
|
+
return this.rpcUrl;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Build an unsigned Polkadot balance transfer extrinsic.
|
|
36
|
+
*
|
|
37
|
+
* The signing payload is SCALE-encoded ExtrinsicPayload.
|
|
38
|
+
* If payload > 256 bytes, it's hashed with Blake2b-256 before signing.
|
|
39
|
+
*/
|
|
40
|
+
async buildTransaction(tx, fromAddress) {
|
|
41
|
+
try {
|
|
42
|
+
const { ApiPromise, WsProvider } = this.polkadotApi;
|
|
43
|
+
const provider = new WsProvider(this.rpcUrl);
|
|
44
|
+
const api = await ApiPromise.create({ provider });
|
|
45
|
+
// Create the transfer extrinsic
|
|
46
|
+
const transfer = api.tx.balances.transferKeepAlive(tx.to, BigInt(tx.amount));
|
|
47
|
+
// Get signing parameters
|
|
48
|
+
const nonce = await api.rpc.system.accountNextIndex(fromAddress);
|
|
49
|
+
const blockHash = await api.rpc.chain.getBlockHash();
|
|
50
|
+
const genesisHash = api.genesisHash;
|
|
51
|
+
const runtimeVersion = api.runtimeVersion;
|
|
52
|
+
// Create the signing payload
|
|
53
|
+
const signingPayload = api.createType('ExtrinsicPayload', {
|
|
54
|
+
method: transfer.method,
|
|
55
|
+
nonce: nonce.toNumber(),
|
|
56
|
+
specVersion: runtimeVersion.specVersion,
|
|
57
|
+
transactionVersion: runtimeVersion.transactionVersion,
|
|
58
|
+
genesisHash,
|
|
59
|
+
blockHash,
|
|
60
|
+
era: api.createType('ExtrinsicEra', { current: 0, period: 64 }),
|
|
61
|
+
tip: 0,
|
|
62
|
+
});
|
|
63
|
+
const payloadU8a = signingPayload.toU8a({ method: true });
|
|
64
|
+
// If payload > 256 bytes, hash with Blake2b-256
|
|
65
|
+
let signingHash;
|
|
66
|
+
if (payloadU8a.length > 256) {
|
|
67
|
+
const crypto = require('crypto');
|
|
68
|
+
signingHash = crypto.createHash('sha256').update(Buffer.from(payloadU8a)).digest();
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
signingHash = Buffer.from(payloadU8a);
|
|
72
|
+
}
|
|
73
|
+
const payload = {
|
|
74
|
+
signingHash: signingHash.toString('hex'),
|
|
75
|
+
method: transfer.method.toHex(),
|
|
76
|
+
nonce: nonce.toNumber(),
|
|
77
|
+
specVersion: runtimeVersion.specVersion.toNumber(),
|
|
78
|
+
transactionVersion: runtimeVersion.transactionVersion.toNumber(),
|
|
79
|
+
genesisHash: genesisHash.toHex(),
|
|
80
|
+
blockHash: blockHash.toHex(),
|
|
81
|
+
fromAddress,
|
|
82
|
+
toAddress: tx.to,
|
|
83
|
+
amount: tx.amount,
|
|
84
|
+
};
|
|
85
|
+
await api.disconnect();
|
|
86
|
+
return Buffer.from(JSON.stringify(payload)).toString('hex');
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
if (e instanceof errors_1.ChainError)
|
|
90
|
+
throw e;
|
|
91
|
+
throw new errors_1.ChainError(`Failed to build Polkadot transaction: ${e.message}`, 'polkadot');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
getSigningPayload(unsignedTx) {
|
|
95
|
+
try {
|
|
96
|
+
const payload = JSON.parse(Buffer.from(unsignedTx, 'hex').toString());
|
|
97
|
+
return payload.signingHash;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return unsignedTx;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Attach an Ed25519 signature to the Polkadot extrinsic
|
|
105
|
+
*/
|
|
106
|
+
async attachSignature(unsignedTx, signature) {
|
|
107
|
+
try {
|
|
108
|
+
const payload = JSON.parse(Buffer.from(unsignedTx, 'hex').toString());
|
|
109
|
+
const sig = signature.startsWith('0x') ? signature.slice(2) : signature;
|
|
110
|
+
const signedPayload = {
|
|
111
|
+
...payload,
|
|
112
|
+
signature: sig,
|
|
113
|
+
};
|
|
114
|
+
return Buffer.from(JSON.stringify(signedPayload)).toString('hex');
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
throw new errors_1.ChainError(`Failed to attach Polkadot signature: ${e.message}`, 'polkadot');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Broadcast a signed Polkadot extrinsic
|
|
122
|
+
*/
|
|
123
|
+
async broadcast(signedTx) {
|
|
124
|
+
try {
|
|
125
|
+
const { ApiPromise, WsProvider } = this.polkadotApi;
|
|
126
|
+
const payload = JSON.parse(Buffer.from(signedTx, 'hex').toString());
|
|
127
|
+
const provider = new WsProvider(this.rpcUrl);
|
|
128
|
+
const api = await ApiPromise.create({ provider });
|
|
129
|
+
// Reconstruct the extrinsic with signature
|
|
130
|
+
const transfer = api.tx(payload.method);
|
|
131
|
+
// Add the Ed25519 signature (type 0x00 = Ed25519 in Polkadot)
|
|
132
|
+
transfer.addSignature(payload.fromAddress, '0x00' + payload.signature, // 0x00 prefix = Ed25519
|
|
133
|
+
{
|
|
134
|
+
nonce: payload.nonce,
|
|
135
|
+
era: api.createType('ExtrinsicEra', { current: 0, period: 64 }),
|
|
136
|
+
tip: 0,
|
|
137
|
+
blockHash: payload.blockHash,
|
|
138
|
+
genesisHash: payload.genesisHash,
|
|
139
|
+
specVersion: payload.specVersion,
|
|
140
|
+
transactionVersion: payload.transactionVersion,
|
|
141
|
+
});
|
|
142
|
+
const hash = await transfer.send();
|
|
143
|
+
await api.disconnect();
|
|
144
|
+
return hash.toHex();
|
|
145
|
+
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
if (e instanceof errors_1.ChainError)
|
|
148
|
+
throw e;
|
|
149
|
+
throw new errors_1.ChainError(`Failed to broadcast Polkadot tx: ${e.message}`, 'polkadot');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get DOT balance in planck
|
|
154
|
+
*/
|
|
155
|
+
async getBalance(address) {
|
|
156
|
+
try {
|
|
157
|
+
const { ApiPromise, WsProvider } = this.polkadotApi;
|
|
158
|
+
const provider = new WsProvider(this.rpcUrl);
|
|
159
|
+
const api = await ApiPromise.create({ provider });
|
|
160
|
+
const { data: { free } } = await api.query.system.account(address);
|
|
161
|
+
await api.disconnect();
|
|
162
|
+
return free.toString();
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return '0';
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.PolkadotAdapter = PolkadotAdapter;
|
|
170
|
+
function createPolkadotAdapter(rpcUrl) {
|
|
171
|
+
return new PolkadotAdapter('mainnet', rpcUrl);
|
|
172
|
+
}
|
|
173
|
+
function createKusamaAdapter(rpcUrl) {
|
|
174
|
+
return new PolkadotAdapter('kusama', rpcUrl);
|
|
175
|
+
}
|
|
176
|
+
function createPolkadotWestendAdapter(rpcUrl) {
|
|
177
|
+
return new PolkadotAdapter('westend', rpcUrl);
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=polkadot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polkadot.js","sourceRoot":"","sources":["../../src/chains/polkadot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ripple/XRP Chain Adapter
|
|
3
|
+
*
|
|
4
|
+
* Builds XRP Ledger transactions, attaches secp256k1 ECDSA signatures
|
|
5
|
+
* from the FROST threshold signing network, and broadcasts via XRPL API.
|
|
6
|
+
*
|
|
7
|
+
* Requires: npm install xrpl
|
|
8
|
+
*/
|
|
9
|
+
import { ChainAdapter, RippleTransaction } from '../core/types';
|
|
10
|
+
export declare class RippleAdapter implements ChainAdapter {
|
|
11
|
+
private rpcUrl;
|
|
12
|
+
private network;
|
|
13
|
+
private xrpl;
|
|
14
|
+
constructor(network?: 'mainnet' | 'testnet' | 'devnet', rpcUrl?: string);
|
|
15
|
+
getRpcUrl(): string;
|
|
16
|
+
/**
|
|
17
|
+
* Build an unsigned XRP payment transaction.
|
|
18
|
+
*
|
|
19
|
+
* XRP uses a custom binary format. The signing payload is computed
|
|
20
|
+
* via encodeForSigning() which prepends a hash prefix. FROST signs
|
|
21
|
+
* SHA-512Half (first 32 bytes of SHA-512) of the encoded bytes.
|
|
22
|
+
*/
|
|
23
|
+
buildTransaction(tx: RippleTransaction, fromAddress: string): Promise<string>;
|
|
24
|
+
getSigningPayload(unsignedTx: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Attach a secp256k1 ECDSA signature to the XRP transaction.
|
|
27
|
+
* XRP uses DER-encoded signatures in the TxnSignature field.
|
|
28
|
+
*/
|
|
29
|
+
attachSignature(unsignedTx: string, signature: string): Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Broadcast a signed XRP transaction
|
|
32
|
+
*/
|
|
33
|
+
broadcast(signedTx: string): Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* Get XRP balance in drops
|
|
36
|
+
*/
|
|
37
|
+
getBalance(address: string): Promise<string>;
|
|
38
|
+
}
|
|
39
|
+
export declare function createRippleAdapter(rpcUrl?: string): RippleAdapter;
|
|
40
|
+
export declare function createRippleTestnetAdapter(rpcUrl?: string): RippleAdapter;
|
|
41
|
+
//# sourceMappingURL=ripple.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../src/chains/ripple.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAUhE,qBAAa,aAAc,YAAW,YAAY;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,IAAI,CAAM;gBAEN,OAAO,GAAE,SAAS,GAAG,SAAS,GAAG,QAAoB,EAAE,MAAM,CAAC,EAAE,MAAM;IAMlF,SAAS,IAAI,MAAM;IAInB;;;;;;OAMG;IACG,gBAAgB,CAAC,EAAE,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoDnF,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAS7C;;;OAGG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA8B7E;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BlD;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAgBrD;AA8BD,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CAElE;AAED,wBAAgB,0BAA0B,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CAEzE"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Ripple/XRP Chain Adapter
|
|
4
|
+
*
|
|
5
|
+
* Builds XRP Ledger transactions, attaches secp256k1 ECDSA signatures
|
|
6
|
+
* from the FROST threshold signing network, and broadcasts via XRPL API.
|
|
7
|
+
*
|
|
8
|
+
* Requires: npm install xrpl
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.RippleAdapter = void 0;
|
|
12
|
+
exports.createRippleAdapter = createRippleAdapter;
|
|
13
|
+
exports.createRippleTestnetAdapter = createRippleTestnetAdapter;
|
|
14
|
+
const errors_1 = require("../utils/errors");
|
|
15
|
+
const optional_deps_1 = require("../utils/optional-deps");
|
|
16
|
+
const DEFAULT_RPCS = {
|
|
17
|
+
'mainnet': 'wss://xrplcluster.com',
|
|
18
|
+
'testnet': 'wss://s.altnet.rippletest.net:51233',
|
|
19
|
+
'devnet': 'wss://s.devnet.rippletest.net:51233',
|
|
20
|
+
};
|
|
21
|
+
class RippleAdapter {
|
|
22
|
+
constructor(network = 'mainnet', rpcUrl) {
|
|
23
|
+
this.network = network;
|
|
24
|
+
this.rpcUrl = rpcUrl || DEFAULT_RPCS[network];
|
|
25
|
+
this.xrpl = (0, optional_deps_1.requireOptionalDependency)('xrpl', 'ripple');
|
|
26
|
+
}
|
|
27
|
+
getRpcUrl() {
|
|
28
|
+
return this.rpcUrl;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build an unsigned XRP payment transaction.
|
|
32
|
+
*
|
|
33
|
+
* XRP uses a custom binary format. The signing payload is computed
|
|
34
|
+
* via encodeForSigning() which prepends a hash prefix. FROST signs
|
|
35
|
+
* SHA-512Half (first 32 bytes of SHA-512) of the encoded bytes.
|
|
36
|
+
*/
|
|
37
|
+
async buildTransaction(tx, fromAddress) {
|
|
38
|
+
try {
|
|
39
|
+
const { Client, encode, encodeForSigning } = this.xrpl;
|
|
40
|
+
const client = new Client(this.rpcUrl);
|
|
41
|
+
await client.connect();
|
|
42
|
+
const payment = {
|
|
43
|
+
TransactionType: 'Payment',
|
|
44
|
+
Account: fromAddress,
|
|
45
|
+
Destination: tx.to,
|
|
46
|
+
Amount: tx.amount, // drops
|
|
47
|
+
};
|
|
48
|
+
if (tx.tag !== undefined) {
|
|
49
|
+
payment.DestinationTag = tx.tag;
|
|
50
|
+
}
|
|
51
|
+
if (tx.fee) {
|
|
52
|
+
payment.Fee = tx.fee;
|
|
53
|
+
}
|
|
54
|
+
// Autofill sequence, fee, lastLedgerSequence
|
|
55
|
+
const prepared = await client.autofill(payment);
|
|
56
|
+
await client.disconnect();
|
|
57
|
+
// Get the bytes to sign
|
|
58
|
+
const encodedForSigning = encodeForSigning(prepared);
|
|
59
|
+
// SHA-512Half: first 32 bytes of SHA-512
|
|
60
|
+
const crypto = require('crypto');
|
|
61
|
+
const fullHash = crypto.createHash('sha512')
|
|
62
|
+
.update(Buffer.from(encodedForSigning, 'hex'))
|
|
63
|
+
.digest();
|
|
64
|
+
const signingHash = fullHash.subarray(0, 32);
|
|
65
|
+
const payload = {
|
|
66
|
+
signingHash: Buffer.from(signingHash).toString('hex'),
|
|
67
|
+
prepared,
|
|
68
|
+
encodedForSigning,
|
|
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 Ripple transaction: ${e.message}`, 'ripple');
|
|
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 a secp256k1 ECDSA signature to the XRP transaction.
|
|
89
|
+
* XRP uses DER-encoded signatures in the TxnSignature field.
|
|
90
|
+
*/
|
|
91
|
+
async attachSignature(unsignedTx, signature) {
|
|
92
|
+
try {
|
|
93
|
+
const payload = JSON.parse(Buffer.from(unsignedTx, 'hex').toString());
|
|
94
|
+
const sig = signature.startsWith('0x') ? signature.slice(2) : signature;
|
|
95
|
+
// Convert compact signature (r + s) to DER format for XRP
|
|
96
|
+
const r = Buffer.from(sig.slice(0, 64), 'hex');
|
|
97
|
+
const s = Buffer.from(sig.slice(64, 128), 'hex');
|
|
98
|
+
const derSig = encodeDER(r, s);
|
|
99
|
+
payload.prepared.TxnSignature = derSig.toString('hex').toUpperCase();
|
|
100
|
+
const { encode } = this.xrpl;
|
|
101
|
+
const signedBlob = encode(payload.prepared);
|
|
102
|
+
const signedPayload = {
|
|
103
|
+
...payload,
|
|
104
|
+
signedBlob,
|
|
105
|
+
signature: sig,
|
|
106
|
+
};
|
|
107
|
+
return Buffer.from(JSON.stringify(signedPayload)).toString('hex');
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
throw new errors_1.ChainError(`Failed to attach Ripple signature: ${e.message}`, 'ripple');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Broadcast a signed XRP transaction
|
|
115
|
+
*/
|
|
116
|
+
async broadcast(signedTx) {
|
|
117
|
+
try {
|
|
118
|
+
const { Client } = this.xrpl;
|
|
119
|
+
const payload = JSON.parse(Buffer.from(signedTx, 'hex').toString());
|
|
120
|
+
const client = new Client(this.rpcUrl);
|
|
121
|
+
await client.connect();
|
|
122
|
+
const result = await client.submit(payload.signedBlob);
|
|
123
|
+
await client.disconnect();
|
|
124
|
+
if (result.result.engine_result !== 'tesSUCCESS' &&
|
|
125
|
+
result.result.engine_result !== 'terQUEUED') {
|
|
126
|
+
throw new Error(`Submission failed: ${result.result.engine_result_message}`);
|
|
127
|
+
}
|
|
128
|
+
return result.result.tx_json?.hash || payload.prepared.hash || '';
|
|
129
|
+
}
|
|
130
|
+
catch (e) {
|
|
131
|
+
if (e instanceof errors_1.ChainError)
|
|
132
|
+
throw e;
|
|
133
|
+
throw new errors_1.ChainError(`Failed to broadcast Ripple tx: ${e.message}`, 'ripple');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get XRP balance in drops
|
|
138
|
+
*/
|
|
139
|
+
async getBalance(address) {
|
|
140
|
+
try {
|
|
141
|
+
const { Client } = this.xrpl;
|
|
142
|
+
const client = new Client(this.rpcUrl);
|
|
143
|
+
await client.connect();
|
|
144
|
+
const info = await client.request({
|
|
145
|
+
command: 'account_info',
|
|
146
|
+
account: address,
|
|
147
|
+
ledger_index: 'validated',
|
|
148
|
+
});
|
|
149
|
+
await client.disconnect();
|
|
150
|
+
return info.result.account_data.Balance;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return '0';
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.RippleAdapter = RippleAdapter;
|
|
158
|
+
/**
|
|
159
|
+
* Encode r,s signature components into DER format for XRP
|
|
160
|
+
*/
|
|
161
|
+
function encodeDER(r, s) {
|
|
162
|
+
// Strip leading zeros, but ensure high bit isn't set (add 0x00 prefix if needed)
|
|
163
|
+
let rBuf = stripLeadingZeros(r);
|
|
164
|
+
let sBuf = stripLeadingZeros(s);
|
|
165
|
+
if (rBuf[0] & 0x80)
|
|
166
|
+
rBuf = Buffer.concat([Buffer.from([0x00]), rBuf]);
|
|
167
|
+
if (sBuf[0] & 0x80)
|
|
168
|
+
sBuf = Buffer.concat([Buffer.from([0x00]), sBuf]);
|
|
169
|
+
const rLen = rBuf.length;
|
|
170
|
+
const sLen = sBuf.length;
|
|
171
|
+
const totalLen = 2 + rLen + 2 + sLen;
|
|
172
|
+
return Buffer.concat([
|
|
173
|
+
Buffer.from([0x30, totalLen]), // SEQUENCE
|
|
174
|
+
Buffer.from([0x02, rLen]), rBuf, // INTEGER r
|
|
175
|
+
Buffer.from([0x02, sLen]), sBuf, // INTEGER s
|
|
176
|
+
]);
|
|
177
|
+
}
|
|
178
|
+
function stripLeadingZeros(buf) {
|
|
179
|
+
let i = 0;
|
|
180
|
+
while (i < buf.length - 1 && buf[i] === 0)
|
|
181
|
+
i++;
|
|
182
|
+
return buf.subarray(i);
|
|
183
|
+
}
|
|
184
|
+
function createRippleAdapter(rpcUrl) {
|
|
185
|
+
return new RippleAdapter('mainnet', rpcUrl);
|
|
186
|
+
}
|
|
187
|
+
function createRippleTestnetAdapter(rpcUrl) {
|
|
188
|
+
return new RippleAdapter('testnet', rpcUrl);
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=ripple.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ripple.js","sourceRoot":"","sources":["../../src/chains/ripple.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AA+MH,kDAEC;AAED,gEAEC;AAlND,4CAA6C;AAC7C,0DAAmE;AAEnE,MAAM,YAAY,GAA2B;IACzC,SAAS,EAAE,uBAAuB;IAClC,SAAS,EAAE,qCAAqC;IAChD,QAAQ,EAAE,qCAAqC;CAClD,CAAC;AAEF,MAAa,aAAa;IAKtB,YAAY,UAA4C,SAAS,EAAE,MAAe;QAC9E,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAA,yCAAyB,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,gBAAgB,CAAC,EAAqB,EAAE,WAAmB;QAC7D,IAAI,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;YAEvD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YAEvB,MAAM,OAAO,GAA4B;gBACrC,eAAe,EAAE,SAAS;gBAC1B,OAAO,EAAE,WAAW;gBACpB,WAAW,EAAE,EAAE,CAAC,EAAE;gBAClB,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ;aAC9B,CAAC;YAEF,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,CAAC,cAAc,GAAG,EAAE,CAAC,GAAG,CAAC;YACpC,CAAC;YAED,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;YACzB,CAAC;YAED,6CAA6C;YAC7C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;YAE1B,wBAAwB;YACxB,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAErD,yCAAyC;YACzC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;iBACvC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;iBAC7C,MAAM,EAAE,CAAC;YACd,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAE7C,MAAM,OAAO,GAAG;gBACZ,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACrD,QAAQ;gBACR,iBAAiB;aACpB,CAAC;YAEF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,YAAY,mBAAU;gBAAE,MAAM,CAAC,CAAC;YACrC,MAAM,IAAI,mBAAU,CAChB,uCAAwC,CAAW,CAAC,OAAO,EAAE,EAC7D,QAAQ,CACX,CAAC;QACN,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,UAAkB;QAChC,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtE,OAAO,OAAO,CAAC,WAAW,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,UAAU,CAAC;QACtB,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAC,UAAkB,EAAE,SAAiB;QACvD,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtE,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAExE,0DAA0D;YAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAErE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;YAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAE5C,MAAM,aAAa,GAAG;gBAClB,GAAG,OAAO;gBACV,UAAU;gBACV,SAAS,EAAE,GAAG;aACjB,CAAC;YAEF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,MAAM,IAAI,mBAAU,CAChB,sCAAuC,CAAW,CAAC,OAAO,EAAE,EAC5D,QAAQ,CACX,CAAC;QACN,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC5B,IAAI,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAEpE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YAEvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACvD,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;YAE1B,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,KAAK,YAAY;gBAC5C,MAAM,CAAC,MAAM,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;gBAC9C,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC;YACjF,CAAC;YAED,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;QACtE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,YAAY,mBAAU;gBAAE,MAAM,CAAC,CAAC;YACrC,MAAM,IAAI,mBAAU,CAChB,kCAAmC,CAAW,CAAC,OAAO,EAAE,EACxD,QAAQ,CACX,CAAC;QACN,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,OAAe;QAC5B,IAAI,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;gBAC9B,OAAO,EAAE,cAAc;gBACvB,OAAO,EAAE,OAAO;gBAChB,YAAY,EAAE,WAAW;aAC5B,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,GAAG,CAAC;QACf,CAAC;IACL,CAAC;CACJ;AArKD,sCAqKC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS;IACnC,iFAAiF;IACjF,IAAI,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAEhC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI;QAAE,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACtE,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI;QAAE,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAEtE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IACzB,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;IAErC,OAAO,MAAM,CAAC,MAAM,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAQ,WAAW;QAChD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAM,YAAY;QACjD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAM,YAAY;KACpD,CAAC,CAAC;AACP,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IAClC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,CAAC,EAAE,CAAC;IAC/C,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,SAAgB,mBAAmB,CAAC,MAAe;IAC/C,OAAO,IAAI,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,SAAgB,0BAA0B,CAAC,MAAe;IACtD,OAAO,IAAI,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC"}
|