@hyperbridge/sdk 1.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/LICENSE +21 -0
- package/README.md +127 -0
- package/dist/abis/erc6160.d.ts +370 -0
- package/dist/abis/erc6160.js +238 -0
- package/dist/abis/erc6160.js.map +1 -0
- package/dist/abis/evmHost.d.ts +1752 -0
- package/dist/abis/evmHost.js +2250 -0
- package/dist/abis/evmHost.js.map +1 -0
- package/dist/abis/handler.d.ts +580 -0
- package/dist/abis/handler.js +750 -0
- package/dist/abis/handler.js.map +1 -0
- package/dist/abis/pingModule.d.ts +594 -0
- package/dist/abis/pingModule.js +765 -0
- package/dist/abis/pingModule.js.map +1 -0
- package/dist/abis/tokenGateway.d.ts +839 -0
- package/dist/abis/tokenGateway.js +471 -0
- package/dist/abis/tokenGateway.js.map +1 -0
- package/dist/chain.d.ts +83 -0
- package/dist/chain.js +34 -0
- package/dist/chain.js.map +1 -0
- package/dist/chains/evm.d.ts +86 -0
- package/dist/chains/evm.js +249 -0
- package/dist/chains/evm.js.map +1 -0
- package/dist/chains/substrate.d.ts +88 -0
- package/dist/chains/substrate.js +287 -0
- package/dist/chains/substrate.js.map +1 -0
- package/dist/client.d.ts +216 -0
- package/dist/client.js +774 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/queries.d.ts +3 -0
- package/dist/queries.js +78 -0
- package/dist/queries.js.map +1 -0
- package/dist/tests/hyperbridgeRequests.test.d.ts +1 -0
- package/dist/tests/hyperbridgeRequests.test.js +415 -0
- package/dist/tests/hyperbridgeRequests.test.js.map +1 -0
- package/dist/tests/postRequest.test.d.ts +1 -0
- package/dist/tests/postRequest.test.js +293 -0
- package/dist/tests/postRequest.test.js.map +1 -0
- package/dist/tests/setup.d.ts +1 -0
- package/dist/tests/setup.js +6 -0
- package/dist/tests/setup.js.map +1 -0
- package/dist/tests/tokenGateway.test.d.ts +1 -0
- package/dist/tests/tokenGateway.test.js +85 -0
- package/dist/tests/tokenGateway.test.js.map +1 -0
- package/dist/tests/xcmGateway.test.d.ts +1 -0
- package/dist/tests/xcmGateway.test.js +71 -0
- package/dist/tests/xcmGateway.test.js.map +1 -0
- package/dist/types/index.d.ts +238 -0
- package/dist/types/index.js +30 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/mmr.d.ts +13 -0
- package/dist/utils/mmr.js +153 -0
- package/dist/utils/mmr.js.map +1 -0
- package/dist/utils/substrate.d.ts +1913 -0
- package/dist/utils/substrate.js +361 -0
- package/dist/utils/substrate.js.map +1 -0
- package/dist/utils/tokenGateway.d.ts +68 -0
- package/dist/utils/tokenGateway.js +151 -0
- package/dist/utils/tokenGateway.js.map +1 -0
- package/dist/utils/xcmGateway.d.ts +81 -0
- package/dist/utils/xcmGateway.js +218 -0
- package/dist/utils/xcmGateway.js.map +1 -0
- package/dist/utils.d.ts +57 -0
- package/dist/utils.js +96 -0
- package/dist/utils.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { u8aToHex } from "@polkadot/util";
|
|
2
|
+
import { decodeAddress } from "@polkadot/util-crypto";
|
|
3
|
+
import { parseUnits } from "viem";
|
|
4
|
+
const DECIMALS = 10;
|
|
5
|
+
/**
|
|
6
|
+
* Teleports DOT tokens from Polkadot relay chain to an EVM-based destination chain
|
|
7
|
+
* using XCM (Cross-Consensus Message Format).
|
|
8
|
+
*
|
|
9
|
+
* This function initiates a teleport transaction, monitors its status, and yields events
|
|
10
|
+
* about the transaction's progress through an AsyncGenerator. It handles the complete
|
|
11
|
+
* lifecycle of a teleport operation:
|
|
12
|
+
* 1. Transaction preparation and signing
|
|
13
|
+
* 2. Broadcasting to the relay chain
|
|
14
|
+
* 3. Tracking the transaction until it's included in a block
|
|
15
|
+
* 4. Monitoring Hyperbridge for the commitment hash
|
|
16
|
+
*
|
|
17
|
+
* @param relayApi - Polkadot API instance connected to the relay chain
|
|
18
|
+
* @param hyperbridge - Polkadot API instance connected to the Hyperbridge parachain
|
|
19
|
+
* @param who - Sender's SS58Address address
|
|
20
|
+
* @param options - Transaction signing options
|
|
21
|
+
* @param params - Teleport parameters including destination, recipient, and amount
|
|
22
|
+
* @yields {HyperbridgeTxEvents} Stream of events indicating transaction status
|
|
23
|
+
* @throws {Error} If there's an issue getting the Hyperbridge block or other failures
|
|
24
|
+
*/
|
|
25
|
+
export async function teleportDot(relayApi, hyperbridge, who, options, params) {
|
|
26
|
+
// 2. initiate the transaction
|
|
27
|
+
const destination = {
|
|
28
|
+
V3: {
|
|
29
|
+
parents: 0,
|
|
30
|
+
interior: {
|
|
31
|
+
X1: {
|
|
32
|
+
Parachain: params.paraId,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
const beneficiary = {
|
|
38
|
+
V3: {
|
|
39
|
+
parents: 0,
|
|
40
|
+
interior: {
|
|
41
|
+
X3: [
|
|
42
|
+
{
|
|
43
|
+
AccountId32: {
|
|
44
|
+
id: u8aToHex(decodeAddress(who, false, 42)),
|
|
45
|
+
network: null,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
AccountKey20: {
|
|
50
|
+
network: {
|
|
51
|
+
Ethereum: {
|
|
52
|
+
chainId: params.destination,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
key: params.recipient,
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
GeneralIndex: params.timeout,
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
const assets = {
|
|
66
|
+
V3: [
|
|
67
|
+
{
|
|
68
|
+
id: {
|
|
69
|
+
Concrete: {
|
|
70
|
+
parents: 0,
|
|
71
|
+
interior: "Here",
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
fun: {
|
|
75
|
+
Fungible: parseUnits(params.amount.toString(), DECIMALS),
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
const feeAssetItem = 0;
|
|
81
|
+
const weightLimit = "Unlimited";
|
|
82
|
+
const tx = relayApi.tx.xcmPallet.limitedReserveTransferAssets(destination, beneficiary, assets, feeAssetItem, weightLimit);
|
|
83
|
+
const finalizedHash = await hyperbridge.rpc.chain.getFinalizedHead();
|
|
84
|
+
const finalizedHead = await hyperbridge.rpc.chain.getHeader(finalizedHash);
|
|
85
|
+
const hyperbridgeBlock = finalizedHead.number.toNumber();
|
|
86
|
+
if (!hyperbridgeBlock)
|
|
87
|
+
throw new Error("Error getting Hyperbridge Block");
|
|
88
|
+
let unsubscribe;
|
|
89
|
+
const stream = new ReadableStream({
|
|
90
|
+
async start(controller) {
|
|
91
|
+
unsubscribe = await tx.signAndSend(who, options, async (result) => {
|
|
92
|
+
try {
|
|
93
|
+
const { status, dispatchError, txHash } = result;
|
|
94
|
+
// @ts-expect-error Type Mismatch
|
|
95
|
+
const events = result.events;
|
|
96
|
+
if (dispatchError) {
|
|
97
|
+
controller.enqueue({
|
|
98
|
+
kind: "Error",
|
|
99
|
+
error: `Error watching extrinsic: ${dispatchError.toString()}`,
|
|
100
|
+
});
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (status.isReady) {
|
|
104
|
+
// send tx hash as soon as it is available
|
|
105
|
+
controller.enqueue({
|
|
106
|
+
kind: "Ready",
|
|
107
|
+
transaction_hash: txHash.toHex(),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
else if (status.isInBlock) {
|
|
111
|
+
await relayApi.rpc.chain.getHeader(status.asInBlock);
|
|
112
|
+
const { commitment, block_number } = await watchForRequestCommitment(hyperbridge, who, params, hyperbridgeBlock);
|
|
113
|
+
// send block number once available
|
|
114
|
+
controller.enqueue({
|
|
115
|
+
kind: "Dispatched",
|
|
116
|
+
block_number: block_number,
|
|
117
|
+
transaction_hash: txHash.toHex(),
|
|
118
|
+
commitment,
|
|
119
|
+
events: events,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
if (status.isFinalized) {
|
|
123
|
+
controller.enqueue({
|
|
124
|
+
kind: "Finalized",
|
|
125
|
+
transaction_hash: txHash.toHex(),
|
|
126
|
+
events: events,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
controller.enqueue({
|
|
132
|
+
kind: "Error",
|
|
133
|
+
error: String(err),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
},
|
|
138
|
+
pull() {
|
|
139
|
+
// We don't really need a pull in this example
|
|
140
|
+
},
|
|
141
|
+
cancel() {
|
|
142
|
+
// This is called if the reader cancels,
|
|
143
|
+
unsubscribe?.();
|
|
144
|
+
},
|
|
145
|
+
}, {
|
|
146
|
+
highWaterMark: 3,
|
|
147
|
+
size: () => 1,
|
|
148
|
+
});
|
|
149
|
+
return stream;
|
|
150
|
+
}
|
|
151
|
+
// Watch for the request to be dispatched from hyperbridge
|
|
152
|
+
async function watchForRequestCommitment(hyperbridge, who, params, start_block) {
|
|
153
|
+
return new Promise((resolve, reject) => {
|
|
154
|
+
let blockCount = 0;
|
|
155
|
+
let last_block = start_block;
|
|
156
|
+
let unsubscribeHyperbridgeEvents = () => { };
|
|
157
|
+
const handleLatestHeader = async (lastHeader) => {
|
|
158
|
+
const finalized = lastHeader.number.toNumber();
|
|
159
|
+
blockCount += Math.max(finalized - last_block, 1);
|
|
160
|
+
for (let block_number = last_block; block_number <= finalized; block_number++) {
|
|
161
|
+
const block_hash = await hyperbridge.rpc.chain.getBlockHash(block_number);
|
|
162
|
+
// just to be safe, query events at this specific hash
|
|
163
|
+
const apiAt = await hyperbridge.at(block_hash);
|
|
164
|
+
const events = (await apiAt.query.system.events());
|
|
165
|
+
for (const record of events) {
|
|
166
|
+
const { event } = record;
|
|
167
|
+
if (event.section === "xcmGateway" && event.method === "AssetTeleported") {
|
|
168
|
+
const commitment = extractCommitmentHashFromEvent({
|
|
169
|
+
record,
|
|
170
|
+
from: who,
|
|
171
|
+
params,
|
|
172
|
+
});
|
|
173
|
+
if (commitment) {
|
|
174
|
+
unsubscribeHyperbridgeEvents?.();
|
|
175
|
+
resolve({
|
|
176
|
+
commitment,
|
|
177
|
+
block_hash: block_hash.toHex(),
|
|
178
|
+
block_number: BigInt(block_number),
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
last_block = finalized + 1;
|
|
185
|
+
if (blockCount >= 30) {
|
|
186
|
+
unsubscribeHyperbridgeEvents?.();
|
|
187
|
+
reject(new Error("No commitment received"));
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
hyperbridge.rpc.chain
|
|
191
|
+
.subscribeFinalizedHeads((header) => {
|
|
192
|
+
// @ts-expect-error Issue referencing type
|
|
193
|
+
return handleLatestHeader(header);
|
|
194
|
+
})
|
|
195
|
+
.then((unsubscribe) => {
|
|
196
|
+
unsubscribeHyperbridgeEvents = unsubscribe;
|
|
197
|
+
})
|
|
198
|
+
.catch(reject);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Extracts the commitment hash from the event data if the event data
|
|
203
|
+
* matches the expected data
|
|
204
|
+
*/
|
|
205
|
+
export function extractCommitmentHashFromEvent({ record, from: who, params, }) {
|
|
206
|
+
const { event } = record;
|
|
207
|
+
const [from, to, _amount, dest, commitment] = event.data;
|
|
208
|
+
const decodedFrom = u8aToHex(decodeAddress(from.toString(), false));
|
|
209
|
+
const decodedWho = u8aToHex(decodeAddress(who, false));
|
|
210
|
+
const isExpectedEvent = decodedFrom === decodedWho &&
|
|
211
|
+
to.toString().toLowerCase() === params.recipient.toLowerCase() &&
|
|
212
|
+
dest.toString().includes(params.destination?.toString());
|
|
213
|
+
if (!isExpectedEvent) {
|
|
214
|
+
throw new Error("Error extracting commitment. Data mismatch");
|
|
215
|
+
}
|
|
216
|
+
return commitment.toString();
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=xcmGateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xcmGateway.js","sourceRoot":"","sources":["../../src/utils/xcmGateway.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AA0BjC,MAAM,QAAQ,GAAG,EAAE,CAAA;AAmCnB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,QAAoB,EACpB,WAAuB,EACvB,GAAW,EACX,OAA+B,EAC/B,MAAwB;IAExB,8BAA8B;IAC9B,MAAM,WAAW,GAAG;QACnB,EAAE,EAAE;YACH,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE;gBACT,EAAE,EAAE;oBACH,SAAS,EAAE,MAAM,CAAC,MAAM;iBACxB;aACD;SACD;KACD,CAAA;IAED,MAAM,WAAW,GAAG;QACnB,EAAE,EAAE;YACH,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE;gBACT,EAAE,EAAE;oBACH;wBACC,WAAW,EAAE;4BACZ,EAAE,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;4BAC3C,OAAO,EAAE,IAAI;yBACb;qBACD;oBACD;wBACC,YAAY,EAAE;4BACb,OAAO,EAAE;gCACR,QAAQ,EAAE;oCACT,OAAO,EAAE,MAAM,CAAC,WAAW;iCAC3B;6BACD;4BACD,GAAG,EAAE,MAAM,CAAC,SAAS;yBACrB;qBACD;oBACD;wBACC,YAAY,EAAE,MAAM,CAAC,OAAO;qBAC5B;iBACD;aACD;SACD;KACD,CAAA;IACD,MAAM,MAAM,GAAG;QACd,EAAE,EAAE;YACH;gBACC,EAAE,EAAE;oBACH,QAAQ,EAAE;wBACT,OAAO,EAAE,CAAC;wBACV,QAAQ,EAAE,MAAM;qBAChB;iBACD;gBACD,GAAG,EAAE;oBACJ,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC;iBACxD;aACD;SACD;KACD,CAAA;IAED,MAAM,YAAY,GAAG,CAAC,CAAA;IACtB,MAAM,WAAW,GAAG,WAAW,CAAA;IAE/B,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,4BAA4B,CAC5D,WAAW,EACX,WAAW,EACX,MAAM,EACN,YAAY,EACZ,WAAW,CACX,CAAA;IACD,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAA;IACpE,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;IAC1E,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;IAExD,IAAI,CAAC,gBAAgB;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IAEzE,IAAI,WAAuB,CAAA;IAC3B,MAAM,MAAM,GAAG,IAAI,cAAc,CAChC;QACC,KAAK,CAAC,KAAK,CAAC,UAAU;YACrB,WAAW,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACjE,IAAI,CAAC;oBACJ,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;oBAChD,iCAAiC;oBACjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAsC,CAAA;oBAE5D,IAAI,aAAa,EAAE,CAAC;wBACnB,UAAU,CAAC,OAAO,CAAC;4BAClB,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE,6BAA6B,aAAa,CAAC,QAAQ,EAAE,EAAE;yBAC9D,CAAC,CAAA;wBACF,OAAM;oBACP,CAAC;oBAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACpB,0CAA0C;wBAC1C,UAAU,CAAC,OAAO,CAAC;4BAClB,IAAI,EAAE,OAAO;4BACb,gBAAgB,EAAE,MAAM,CAAC,KAAK,EAAE;yBAChC,CAAC,CAAA;oBACH,CAAC;yBAAM,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;wBAC7B,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;wBACpD,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,yBAAyB,CACnE,WAAW,EACX,GAAG,EACH,MAAM,EACN,gBAAgB,CAChB,CAAA;wBAED,mCAAmC;wBACnC,UAAU,CAAC,OAAO,CAAC;4BAClB,IAAI,EAAE,YAAY;4BAClB,YAAY,EAAE,YAAY;4BAC1B,gBAAgB,EAAE,MAAM,CAAC,KAAK,EAAE;4BAChC,UAAU;4BACV,MAAM,EAAE,MAAM;yBACd,CAAC,CAAA;oBACH,CAAC;oBAED,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;wBACxB,UAAU,CAAC,OAAO,CAAC;4BAClB,IAAI,EAAE,WAAW;4BACjB,gBAAgB,EAAE,MAAM,CAAC,KAAK,EAAE;4BAChC,MAAM,EAAE,MAAM;yBACd,CAAC,CAAA;oBACH,CAAC;gBACF,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,UAAU,CAAC,OAAO,CAAC;wBAClB,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;qBAClB,CAAC,CAAA;gBACH,CAAC;YACF,CAAC,CAAC,CAAA;QACH,CAAC;QACD,IAAI;YACH,8CAA8C;QAC/C,CAAC;QACD,MAAM;YACL,wCAAwC;YACxC,WAAW,EAAE,EAAE,CAAA;QAChB,CAAC;KACD,EACD;QACC,aAAa,EAAE,CAAC;QAChB,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;KACb,CACD,CAAA;IAED,OAAO,MAAM,CAAA;AACd,CAAC;AAED,0DAA0D;AAC1D,KAAK,UAAU,yBAAyB,CACvC,WAAuB,EACvB,GAAW,EACX,MAAwB,EACxB,WAAmB;IAMnB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,IAAI,UAAU,GAAG,WAAW,CAAA;QAC5B,IAAI,4BAA4B,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;QAE3C,MAAM,kBAAkB,GAAG,KAAK,EAAE,UAAkB,EAAE,EAAE;YACvD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;YAC9C,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC,CAAC,CAAA;YACjD,KAAK,IAAI,YAAY,GAAG,UAAU,EAAE,YAAY,IAAI,SAAS,EAAE,YAAY,EAAE,EAAE,CAAC;gBAC/E,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;gBAEzE,sDAAsD;gBACtD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;gBAC9C,MAAM,MAAM,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAA6B,CAAA;gBAE9E,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;oBAC7B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAA;oBAExB,IAAI,KAAK,CAAC,OAAO,KAAK,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;wBAC1E,MAAM,UAAU,GAAG,8BAA8B,CAAC;4BACjD,MAAM;4BACN,IAAI,EAAE,GAAG;4BACT,MAAM;yBACN,CAAC,CAAA;wBAEF,IAAI,UAAU,EAAE,CAAC;4BAChB,4BAA4B,EAAE,EAAE,CAAA;4BAChC,OAAO,CAAC;gCACP,UAAU;gCACV,UAAU,EAAE,UAAU,CAAC,KAAK,EAAE;gCAC9B,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC;6BAClC,CAAC,CAAA;wBACH,CAAC;oBACF,CAAC;gBACF,CAAC;YACF,CAAC;YAED,UAAU,GAAG,SAAS,GAAG,CAAC,CAAA;YAE1B,IAAI,UAAU,IAAI,EAAE,EAAE,CAAC;gBACtB,4BAA4B,EAAE,EAAE,CAAA;gBAChC,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAA;YAC5C,CAAC;QACF,CAAC,CAAA;QAED,WAAW,CAAC,GAAG,CAAC,KAAK;aACnB,uBAAuB,CAAC,CAAC,MAAM,EAAE,EAAE;YACnC,0CAA0C;YAC1C,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAA;QAClC,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;YACrB,4BAA4B,GAAG,WAAW,CAAA;QAC3C,CAAC,CAAC;aACD,KAAK,CAAC,MAAM,CAAC,CAAA;IAChB,CAAC,CAAC,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAAC,EAC9C,MAAM,EACN,IAAI,EAAE,GAAG,EACT,MAAM,GAKN;IACA,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAA;IAExB,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,IAAI,CAAA;IAExD,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,CAAA;IACnE,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IACtD,MAAM,eAAe,GACpB,WAAW,KAAK,UAAU;QAC1B,EAAE,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE;QAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAA;IAEzD,IAAI,CAAC,eAAe,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC9D,CAAC;IAED,OAAO,UAAU,CAAC,QAAQ,EAAe,CAAA;AAC1C,CAAC"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { HexString, IPostRequest, RequestStatus, TimeoutStatus } from "./types";
|
|
2
|
+
export * from "./utils/mmr";
|
|
3
|
+
export * from "./utils/substrate";
|
|
4
|
+
export declare const DEFAULT_POLL_INTERVAL = 5000;
|
|
5
|
+
/**
|
|
6
|
+
* Sleeps for the specified number of milliseconds.
|
|
7
|
+
* @param ms The number of milliseconds to sleep.
|
|
8
|
+
*/
|
|
9
|
+
export declare function sleep(ms?: number): Promise<unknown>;
|
|
10
|
+
/**
|
|
11
|
+
* Checks if the given state machine ID represents an EVM chain.
|
|
12
|
+
* @param stateMachineId The state machine ID to check.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isEvmChain(stateMachineId: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Checks if the given state machine ID represents a Substrate chain.
|
|
17
|
+
* @param stateMachineId The state machine ID to check.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isSubstrateChain(stateMachineId: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Checks if the given string is a valid UTF-8 string.
|
|
22
|
+
* @param str The string to check.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isValidUTF8(str: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Calculates the commitment hash for a post request.
|
|
27
|
+
* @param post The post request to calculate the commitment hash for.
|
|
28
|
+
* @returns The commitment hash.
|
|
29
|
+
*/
|
|
30
|
+
export declare function postRequestCommitment(post: IPostRequest): HexString;
|
|
31
|
+
/**
|
|
32
|
+
** Calculates the weight of a request status.
|
|
33
|
+
* Used to determine the progression of a request through its lifecycle.
|
|
34
|
+
* Higher weights represent more advanced states in the processing pipeline.
|
|
35
|
+
* @returns A record mapping each RequestStatus to its corresponding weight value.
|
|
36
|
+
*/
|
|
37
|
+
export declare const REQUEST_STATUS_WEIGHTS: Record<RequestStatus, number>;
|
|
38
|
+
/**
|
|
39
|
+
* Calculates the weight of a timeout status.
|
|
40
|
+
* Used to determine the progression of a timeout through its lifecycle.
|
|
41
|
+
* Higher weights represent more advanced states in the timeout processing.
|
|
42
|
+
* @returns A record mapping each TimeoutStatus to its corresponding weight value.
|
|
43
|
+
*/
|
|
44
|
+
export declare const TIMEOUT_STATUS_WEIGHTS: Record<TimeoutStatus, number>;
|
|
45
|
+
/**
|
|
46
|
+
* Combines both request and timeout status weights into a single mapping.
|
|
47
|
+
* This provides a comprehensive view of all possible states a request can be in,
|
|
48
|
+
* with higher weights representing more advanced states in either the normal
|
|
49
|
+
* processing pipeline or the timeout handling process.
|
|
50
|
+
*
|
|
51
|
+
* The weights follow this progression:
|
|
52
|
+
* 0-4: Normal request processing (SOURCE to DESTINATION)
|
|
53
|
+
* 5-9: Timeout handling progression (PENDING_TIMEOUT to TIMED_OUT)
|
|
54
|
+
*
|
|
55
|
+
* @returns A record mapping each RequestStatus and TimeoutStatus to its corresponding weight value.
|
|
56
|
+
*/
|
|
57
|
+
export declare const COMBINED_STATUS_WEIGHTS: Record<RequestStatus | TimeoutStatus, number>;
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { RequestStatus, TimeoutStatus } from "./types/index.js";
|
|
2
|
+
import { encodePacked, keccak256, toHex } from "viem";
|
|
3
|
+
export * from "./utils/mmr.js";
|
|
4
|
+
export * from "./utils/substrate.js";
|
|
5
|
+
export const DEFAULT_POLL_INTERVAL = 5000;
|
|
6
|
+
/**
|
|
7
|
+
* Sleeps for the specified number of milliseconds.
|
|
8
|
+
* @param ms The number of milliseconds to sleep.
|
|
9
|
+
*/
|
|
10
|
+
export function sleep(ms) {
|
|
11
|
+
return new Promise((resolve) => setTimeout(resolve, ms || DEFAULT_POLL_INTERVAL));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Checks if the given state machine ID represents an EVM chain.
|
|
15
|
+
* @param stateMachineId The state machine ID to check.
|
|
16
|
+
*/
|
|
17
|
+
export function isEvmChain(stateMachineId) {
|
|
18
|
+
return stateMachineId.startsWith("EVM");
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Checks if the given state machine ID represents a Substrate chain.
|
|
22
|
+
* @param stateMachineId The state machine ID to check.
|
|
23
|
+
*/
|
|
24
|
+
export function isSubstrateChain(stateMachineId) {
|
|
25
|
+
return (stateMachineId.startsWith("POLKADOT") ||
|
|
26
|
+
stateMachineId.startsWith("KUSAMA") ||
|
|
27
|
+
stateMachineId.startsWith("SUBSTRATE"));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Checks if the given string is a valid UTF-8 string.
|
|
31
|
+
* @param str The string to check.
|
|
32
|
+
*/
|
|
33
|
+
export function isValidUTF8(str) {
|
|
34
|
+
return Buffer.from(str).toString("utf8") === str;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Calculates the commitment hash for a post request.
|
|
38
|
+
* @param post The post request to calculate the commitment hash for.
|
|
39
|
+
* @returns The commitment hash.
|
|
40
|
+
*/
|
|
41
|
+
export function postRequestCommitment(post) {
|
|
42
|
+
return keccak256(encodePacked(["bytes", "bytes", "uint64", "uint64", "bytes", "bytes", "bytes"], [toHex(post.source), toHex(post.dest), post.nonce, post.timeoutTimestamp, post.from, post.to, post.body]));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
** Calculates the weight of a request status.
|
|
46
|
+
* Used to determine the progression of a request through its lifecycle.
|
|
47
|
+
* Higher weights represent more advanced states in the processing pipeline.
|
|
48
|
+
* @returns A record mapping each RequestStatus to its corresponding weight value.
|
|
49
|
+
*/
|
|
50
|
+
export const REQUEST_STATUS_WEIGHTS = {
|
|
51
|
+
[RequestStatus.SOURCE]: 0,
|
|
52
|
+
[RequestStatus.SOURCE_FINALIZED]: 1,
|
|
53
|
+
[RequestStatus.HYPERBRIDGE_DELIVERED]: 2,
|
|
54
|
+
[RequestStatus.HYPERBRIDGE_FINALIZED]: 3,
|
|
55
|
+
[RequestStatus.DESTINATION]: 4,
|
|
56
|
+
[RequestStatus.HYPERBRIDGE_TIMED_OUT]: 5,
|
|
57
|
+
[RequestStatus.TIMED_OUT]: 6,
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Calculates the weight of a timeout status.
|
|
61
|
+
* Used to determine the progression of a timeout through its lifecycle.
|
|
62
|
+
* Higher weights represent more advanced states in the timeout processing.
|
|
63
|
+
* @returns A record mapping each TimeoutStatus to its corresponding weight value.
|
|
64
|
+
*/
|
|
65
|
+
export const TIMEOUT_STATUS_WEIGHTS = {
|
|
66
|
+
[TimeoutStatus.PENDING_TIMEOUT]: 1,
|
|
67
|
+
[TimeoutStatus.DESTINATION_FINALIZED_TIMEOUT]: 2,
|
|
68
|
+
[TimeoutStatus.HYPERBRIDGE_TIMED_OUT]: 3,
|
|
69
|
+
[TimeoutStatus.HYPERBRIDGE_FINALIZED_TIMEOUT]: 4,
|
|
70
|
+
[TimeoutStatus.TIMED_OUT]: 5,
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Combines both request and timeout status weights into a single mapping.
|
|
74
|
+
* This provides a comprehensive view of all possible states a request can be in,
|
|
75
|
+
* with higher weights representing more advanced states in either the normal
|
|
76
|
+
* processing pipeline or the timeout handling process.
|
|
77
|
+
*
|
|
78
|
+
* The weights follow this progression:
|
|
79
|
+
* 0-4: Normal request processing (SOURCE to DESTINATION)
|
|
80
|
+
* 5-9: Timeout handling progression (PENDING_TIMEOUT to TIMED_OUT)
|
|
81
|
+
*
|
|
82
|
+
* @returns A record mapping each RequestStatus and TimeoutStatus to its corresponding weight value.
|
|
83
|
+
*/
|
|
84
|
+
export const COMBINED_STATUS_WEIGHTS = {
|
|
85
|
+
[RequestStatus.SOURCE]: 0,
|
|
86
|
+
[RequestStatus.SOURCE_FINALIZED]: 1,
|
|
87
|
+
[RequestStatus.HYPERBRIDGE_DELIVERED]: 2,
|
|
88
|
+
[RequestStatus.HYPERBRIDGE_FINALIZED]: 3,
|
|
89
|
+
[RequestStatus.DESTINATION]: 4,
|
|
90
|
+
[TimeoutStatus.PENDING_TIMEOUT]: 5,
|
|
91
|
+
[TimeoutStatus.DESTINATION_FINALIZED_TIMEOUT]: 6,
|
|
92
|
+
[TimeoutStatus.HYPERBRIDGE_TIMED_OUT]: 7,
|
|
93
|
+
[TimeoutStatus.HYPERBRIDGE_FINALIZED_TIMEOUT]: 8,
|
|
94
|
+
[TimeoutStatus.TIMED_OUT]: 9,
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hyperbridge/sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "The hyperclient SDK provides utilities for querying proofs and statuses for cross-chain requests from HyperBridge.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"keywords": [
|
|
12
|
+
"hyperbridge",
|
|
13
|
+
"indexer",
|
|
14
|
+
"subquery",
|
|
15
|
+
"graphql",
|
|
16
|
+
"substrate",
|
|
17
|
+
"blockchain",
|
|
18
|
+
"interoperability",
|
|
19
|
+
"cryptocurrency",
|
|
20
|
+
"evm"
|
|
21
|
+
],
|
|
22
|
+
"type": "module",
|
|
23
|
+
"homepage": "https://github.com/polytope-labs/hyperbridge-sdk#readme",
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/polytope-labs/hyperbridge-sdk/issues"
|
|
26
|
+
},
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "git+https://github.com/polytope-labs/hyperbridge-sdk.git"
|
|
30
|
+
},
|
|
31
|
+
"license": "ISC",
|
|
32
|
+
"author": "Polytope Labs",
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@async-generator/merge-race": "^1.0.3",
|
|
35
|
+
"@polkadot/api": "^15.7.1",
|
|
36
|
+
"@polkadot/types": "14.0.1",
|
|
37
|
+
"@polkadot/util": "13.3.1",
|
|
38
|
+
"@polkadot/util-crypto": "13.3.1",
|
|
39
|
+
"graphql": "^16.10.0",
|
|
40
|
+
"graphql-request": "^7.1.2",
|
|
41
|
+
"lodash": "^4.17.21",
|
|
42
|
+
"rpc-websocket-client": "^1.1.4",
|
|
43
|
+
"scale-ts": "^1.6.1",
|
|
44
|
+
"ts-pattern": "^5.6.2",
|
|
45
|
+
"viem": "^2.23.5"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@biomejs/biome": "^1.9.4",
|
|
49
|
+
"@polkadot/keyring": "13.4.3",
|
|
50
|
+
"@polytope-labs/hyperclient": "1.2.0",
|
|
51
|
+
"@types/lodash": "^4.17.15",
|
|
52
|
+
"@types/node": "^22.13.5",
|
|
53
|
+
"@vitest/coverage-v8": "^3.0.7",
|
|
54
|
+
"dotenv": "^16.4.7",
|
|
55
|
+
"jsdom": "^26.0.0",
|
|
56
|
+
"log-timestamp": "^0.3.0",
|
|
57
|
+
"resolve-tspaths": "^0.8.23",
|
|
58
|
+
"typescript": "^5.7.3",
|
|
59
|
+
"vite-tsconfig-paths": "^5.1.4",
|
|
60
|
+
"vitest": "^3.0.7",
|
|
61
|
+
"vite": "^6.2.0"
|
|
62
|
+
},
|
|
63
|
+
"publishConfig": {
|
|
64
|
+
"access": "public"
|
|
65
|
+
},
|
|
66
|
+
"scripts": {
|
|
67
|
+
"build": "tsc && resolve-tspaths",
|
|
68
|
+
"test": "vitest --watch=false --maxConcurrency=1",
|
|
69
|
+
"test:watch": "vitest",
|
|
70
|
+
"lint": "biome lint .",
|
|
71
|
+
"lint:fix": "biome lint --write .",
|
|
72
|
+
"format": "prettier --write \"src/**/*.ts\""
|
|
73
|
+
}
|
|
74
|
+
}
|