@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.
Files changed (89) 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/cardano.d.ts +42 -0
  11. package/dist/chains/cardano.d.ts.map +1 -0
  12. package/dist/chains/cardano.js +188 -0
  13. package/dist/chains/cardano.js.map +1 -0
  14. package/dist/chains/cosmos.d.ts +42 -0
  15. package/dist/chains/cosmos.d.ts.map +1 -0
  16. package/dist/chains/cosmos.js +216 -0
  17. package/dist/chains/cosmos.js.map +1 -0
  18. package/dist/chains/dogecoin-litecoin.d.ts +57 -0
  19. package/dist/chains/dogecoin-litecoin.d.ts.map +1 -0
  20. package/dist/chains/dogecoin-litecoin.js +521 -0
  21. package/dist/chains/dogecoin-litecoin.js.map +1 -0
  22. package/dist/chains/ethereum.d.ts.map +1 -1
  23. package/dist/chains/ethereum.js +16 -0
  24. package/dist/chains/ethereum.js.map +1 -1
  25. package/dist/chains/hedera.d.ts +113 -0
  26. package/dist/chains/hedera.d.ts.map +1 -0
  27. package/dist/chains/hedera.js +302 -0
  28. package/dist/chains/hedera.js.map +1 -0
  29. package/dist/chains/icp.d.ts +95 -0
  30. package/dist/chains/icp.d.ts.map +1 -0
  31. package/dist/chains/icp.js +520 -0
  32. package/dist/chains/icp.js.map +1 -0
  33. package/dist/chains/kaspa.d.ts +152 -0
  34. package/dist/chains/kaspa.d.ts.map +1 -0
  35. package/dist/chains/kaspa.js +790 -0
  36. package/dist/chains/kaspa.js.map +1 -0
  37. package/dist/chains/multiversx.d.ts +143 -0
  38. package/dist/chains/multiversx.d.ts.map +1 -0
  39. package/dist/chains/multiversx.js +524 -0
  40. package/dist/chains/multiversx.js.map +1 -0
  41. package/dist/chains/near.d.ts +40 -0
  42. package/dist/chains/near.d.ts.map +1 -0
  43. package/dist/chains/near.js +170 -0
  44. package/dist/chains/near.js.map +1 -0
  45. package/dist/chains/polkadot.d.ts +43 -0
  46. package/dist/chains/polkadot.d.ts.map +1 -0
  47. package/dist/chains/polkadot.js +179 -0
  48. package/dist/chains/polkadot.js.map +1 -0
  49. package/dist/chains/ripple.d.ts +41 -0
  50. package/dist/chains/ripple.d.ts.map +1 -0
  51. package/dist/chains/ripple.js +190 -0
  52. package/dist/chains/ripple.js.map +1 -0
  53. package/dist/chains/stellar.d.ts +40 -0
  54. package/dist/chains/stellar.d.ts.map +1 -0
  55. package/dist/chains/stellar.js +156 -0
  56. package/dist/chains/stellar.js.map +1 -0
  57. package/dist/chains/sui.d.ts +44 -0
  58. package/dist/chains/sui.d.ts.map +1 -0
  59. package/dist/chains/sui.js +157 -0
  60. package/dist/chains/sui.js.map +1 -0
  61. package/dist/chains/tezos.d.ts +43 -0
  62. package/dist/chains/tezos.d.ts.map +1 -0
  63. package/dist/chains/tezos.js +162 -0
  64. package/dist/chains/tezos.js.map +1 -0
  65. package/dist/chains/ton.d.ts +40 -0
  66. package/dist/chains/ton.d.ts.map +1 -0
  67. package/dist/chains/ton.js +168 -0
  68. package/dist/chains/ton.js.map +1 -0
  69. package/dist/chains/tron.d.ts +41 -0
  70. package/dist/chains/tron.d.ts.map +1 -0
  71. package/dist/chains/tron.js +124 -0
  72. package/dist/chains/tron.js.map +1 -0
  73. package/dist/core/types.d.ts +161 -1
  74. package/dist/core/types.d.ts.map +1 -1
  75. package/dist/index.d.ts +19 -2
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +79 -4
  78. package/dist/index.js.map +1 -1
  79. package/dist/utils/optional-deps.d.ts +9 -0
  80. package/dist/utils/optional-deps.d.ts.map +1 -0
  81. package/dist/utils/optional-deps.js +21 -0
  82. package/dist/utils/optional-deps.js.map +1 -0
  83. package/dist/utils/validation.d.ts.map +1 -1
  84. package/dist/utils/validation.js +6 -1
  85. package/dist/utils/validation.js.map +1 -1
  86. package/dist/wallet/wallet.d.ts.map +1 -1
  87. package/dist/wallet/wallet.js +61 -33
  88. package/dist/wallet/wallet.js.map +1 -1
  89. 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":"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"}