@atomiqlabs/chain-starknet 1.0.0-beta.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 +201 -0
- package/dist/get_serialized_block.d.ts +1 -0
- package/dist/get_serialized_block.js +28 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.js +50 -0
- package/dist/starknet/StarknetChainType.d.ts +9 -0
- package/dist/starknet/StarknetChainType.js +2 -0
- package/dist/starknet/StarknetInitializer.d.ts +18 -0
- package/dist/starknet/StarknetInitializer.js +49 -0
- package/dist/starknet/base/StarknetAction.d.ts +27 -0
- package/dist/starknet/base/StarknetAction.js +73 -0
- package/dist/starknet/base/StarknetBase.d.ts +34 -0
- package/dist/starknet/base/StarknetBase.js +29 -0
- package/dist/starknet/base/StarknetModule.d.ts +14 -0
- package/dist/starknet/base/StarknetModule.js +13 -0
- package/dist/starknet/base/modules/ERC20Abi.d.ts +755 -0
- package/dist/starknet/base/modules/ERC20Abi.js +1032 -0
- package/dist/starknet/base/modules/StarknetAccounts.d.ts +6 -0
- package/dist/starknet/base/modules/StarknetAccounts.js +24 -0
- package/dist/starknet/base/modules/StarknetAddresses.d.ts +9 -0
- package/dist/starknet/base/modules/StarknetAddresses.js +26 -0
- package/dist/starknet/base/modules/StarknetBlocks.d.ts +19 -0
- package/dist/starknet/base/modules/StarknetBlocks.js +49 -0
- package/dist/starknet/base/modules/StarknetEvents.d.ts +44 -0
- package/dist/starknet/base/modules/StarknetEvents.js +88 -0
- package/dist/starknet/base/modules/StarknetFees.d.ts +55 -0
- package/dist/starknet/base/modules/StarknetFees.js +102 -0
- package/dist/starknet/base/modules/StarknetSignatures.d.ts +30 -0
- package/dist/starknet/base/modules/StarknetSignatures.js +71 -0
- package/dist/starknet/base/modules/StarknetTokens.d.ts +67 -0
- package/dist/starknet/base/modules/StarknetTokens.js +97 -0
- package/dist/starknet/base/modules/StarknetTransactions.d.ts +87 -0
- package/dist/starknet/base/modules/StarknetTransactions.js +226 -0
- package/dist/starknet/btcrelay/BtcRelayAbi.d.ts +250 -0
- package/dist/starknet/btcrelay/BtcRelayAbi.js +341 -0
- package/dist/starknet/btcrelay/StarknetBtcRelay.d.ts +166 -0
- package/dist/starknet/btcrelay/StarknetBtcRelay.js +323 -0
- package/dist/starknet/btcrelay/headers/StarknetBtcHeader.d.ts +32 -0
- package/dist/starknet/btcrelay/headers/StarknetBtcHeader.js +74 -0
- package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.d.ts +52 -0
- package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.js +113 -0
- package/dist/starknet/contract/StarknetContractBase.d.ts +13 -0
- package/dist/starknet/contract/StarknetContractBase.js +18 -0
- package/dist/starknet/contract/modules/StarknetContractEvents.d.ts +40 -0
- package/dist/starknet/contract/modules/StarknetContractEvents.js +77 -0
- package/dist/starknet/events/StarknetChainEvents.d.ts +19 -0
- package/dist/starknet/events/StarknetChainEvents.js +51 -0
- package/dist/starknet/events/StarknetChainEventsBrowser.d.ts +73 -0
- package/dist/starknet/events/StarknetChainEventsBrowser.js +210 -0
- package/dist/starknet/swaps/EscrowManagerAbi.d.ts +445 -0
- package/dist/starknet/swaps/EscrowManagerAbi.js +601 -0
- package/dist/starknet/swaps/StarknetSwapContract.d.ts +215 -0
- package/dist/starknet/swaps/StarknetSwapContract.js +452 -0
- package/dist/starknet/swaps/StarknetSwapData.d.ts +74 -0
- package/dist/starknet/swaps/StarknetSwapData.js +316 -0
- package/dist/starknet/swaps/StarknetSwapModule.d.ts +9 -0
- package/dist/starknet/swaps/StarknetSwapModule.js +12 -0
- package/dist/starknet/swaps/handlers/IHandler.d.ts +13 -0
- package/dist/starknet/swaps/handlers/IHandler.js +2 -0
- package/dist/starknet/swaps/handlers/claim/ClaimHandlers.d.ts +13 -0
- package/dist/starknet/swaps/handlers/claim/ClaimHandlers.js +13 -0
- package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.d.ts +22 -0
- package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.js +44 -0
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.d.ts +25 -0
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.js +48 -0
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.d.ts +26 -0
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.js +40 -0
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.d.ts +20 -0
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.js +29 -0
- package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.d.ts +64 -0
- package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.js +86 -0
- package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.d.ts +17 -0
- package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.js +27 -0
- package/dist/starknet/swaps/modules/StarknetLpVault.d.ts +69 -0
- package/dist/starknet/swaps/modules/StarknetLpVault.js +122 -0
- package/dist/starknet/swaps/modules/StarknetSwapClaim.d.ts +53 -0
- package/dist/starknet/swaps/modules/StarknetSwapClaim.js +100 -0
- package/dist/starknet/swaps/modules/StarknetSwapInit.d.ts +84 -0
- package/dist/starknet/swaps/modules/StarknetSwapInit.js +164 -0
- package/dist/starknet/swaps/modules/StarknetSwapRefund.d.ts +64 -0
- package/dist/starknet/swaps/modules/StarknetSwapRefund.js +131 -0
- package/dist/starknet/swaps/modules/SwapClaim.d.ts +54 -0
- package/dist/starknet/swaps/modules/SwapClaim.js +115 -0
- package/dist/starknet/swaps/modules/SwapInit.d.ts +79 -0
- package/dist/starknet/swaps/modules/SwapInit.js +174 -0
- package/dist/starknet/swaps/modules/SwapRefund.d.ts +63 -0
- package/dist/starknet/swaps/modules/SwapRefund.js +149 -0
- package/dist/starknet/wallet/StarknetKeypairWallet.d.ts +6 -0
- package/dist/starknet/wallet/StarknetKeypairWallet.js +26 -0
- package/dist/starknet/wallet/StarknetSigner.d.ts +12 -0
- package/dist/starknet/wallet/StarknetSigner.js +46 -0
- package/dist/utils/Utils.d.ts +38 -0
- package/dist/utils/Utils.js +255 -0
- package/package.json +39 -0
- package/src/index.ts +41 -0
- package/src/starknet/StarknetChainType.ts +20 -0
- package/src/starknet/StarknetInitializer.ts +75 -0
- package/src/starknet/base/StarknetAction.ts +90 -0
- package/src/starknet/base/StarknetBase.ts +56 -0
- package/src/starknet/base/StarknetModule.ts +20 -0
- package/src/starknet/base/modules/ERC20Abi.ts +1029 -0
- package/src/starknet/base/modules/StarknetAccounts.ts +26 -0
- package/src/starknet/base/modules/StarknetAddresses.ts +23 -0
- package/src/starknet/base/modules/StarknetBlocks.ts +59 -0
- package/src/starknet/base/modules/StarknetEvents.ts +105 -0
- package/src/starknet/base/modules/StarknetFees.ts +136 -0
- package/src/starknet/base/modules/StarknetSignatures.ts +91 -0
- package/src/starknet/base/modules/StarknetTokens.ts +116 -0
- package/src/starknet/base/modules/StarknetTransactions.ts +254 -0
- package/src/starknet/btcrelay/BtcRelayAbi.ts +338 -0
- package/src/starknet/btcrelay/StarknetBtcRelay.ts +415 -0
- package/src/starknet/btcrelay/headers/StarknetBtcHeader.ts +101 -0
- package/src/starknet/btcrelay/headers/StarknetBtcStoredHeader.ts +142 -0
- package/src/starknet/contract/StarknetContractBase.ts +29 -0
- package/src/starknet/contract/modules/StarknetContractEvents.ts +108 -0
- package/src/starknet/events/StarknetChainEvents.ts +63 -0
- package/src/starknet/events/StarknetChainEventsBrowser.ts +289 -0
- package/src/starknet/swaps/EscrowManagerAbi.ts +600 -0
- package/src/starknet/swaps/StarknetSwapContract.ts +694 -0
- package/src/starknet/swaps/StarknetSwapData.ts +441 -0
- package/src/starknet/swaps/StarknetSwapModule.ts +17 -0
- package/src/starknet/swaps/handlers/IHandler.ts +20 -0
- package/src/starknet/swaps/handlers/claim/ClaimHandlers.ts +23 -0
- package/src/starknet/swaps/handlers/claim/HashlockClaimHandler.ts +54 -0
- package/src/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.ts +73 -0
- package/src/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.ts +67 -0
- package/src/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.ts +49 -0
- package/src/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.ts +151 -0
- package/src/starknet/swaps/handlers/refund/TimelockRefundHandler.ts +39 -0
- package/src/starknet/swaps/modules/StarknetLpVault.ts +148 -0
- package/src/starknet/swaps/modules/StarknetSwapClaim.ts +142 -0
- package/src/starknet/swaps/modules/StarknetSwapInit.ts +226 -0
- package/src/starknet/swaps/modules/StarknetSwapRefund.ts +202 -0
- package/src/starknet/wallet/StarknetKeypairWallet.ts +34 -0
- package/src/starknet/wallet/StarknetSigner.ts +55 -0
- package/src/utils/Utils.ts +247 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findLastIndex = exports.parseInitFunctionCalldata = exports.poseidonHashRange = exports.bufferToByteArray = exports.bufferToBytes31Span = exports.bytes31SpanToBuffer = exports.toBigInt = exports.bigNumberishToBuffer = exports.u32ReverseEndianness = exports.bufferToU32Array = exports.u32ArrayToBuffer = exports.calculateHash = exports.toHex = exports.tryWithRetries = exports.getLogger = exports.onceAsync = exports.timeoutPromise = exports.isUint256 = void 0;
|
|
4
|
+
const starknet_types_07_1 = require("starknet-types-07");
|
|
5
|
+
const starknet_1 = require("starknet");
|
|
6
|
+
const buffer_1 = require("buffer");
|
|
7
|
+
const StarknetSwapData_1 = require("../starknet/swaps/StarknetSwapData");
|
|
8
|
+
function isUint256(val) {
|
|
9
|
+
return val.low != null && val.high != null;
|
|
10
|
+
}
|
|
11
|
+
exports.isUint256 = isUint256;
|
|
12
|
+
function timeoutPromise(timeoutMillis, abortSignal) {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
const timeout = setTimeout(resolve, timeoutMillis);
|
|
15
|
+
if (abortSignal != null)
|
|
16
|
+
abortSignal.addEventListener("abort", () => {
|
|
17
|
+
clearTimeout(timeout);
|
|
18
|
+
reject(new Error("Aborted"));
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
exports.timeoutPromise = timeoutPromise;
|
|
23
|
+
function onceAsync(executor) {
|
|
24
|
+
let promise;
|
|
25
|
+
return () => {
|
|
26
|
+
if (promise == null) {
|
|
27
|
+
promise = executor();
|
|
28
|
+
return promise;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
return promise.catch(() => promise = executor());
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
exports.onceAsync = onceAsync;
|
|
36
|
+
function getLogger(prefix) {
|
|
37
|
+
return {
|
|
38
|
+
debug: (msg, ...args) => console.debug(prefix + msg, ...args),
|
|
39
|
+
info: (msg, ...args) => console.info(prefix + msg, ...args),
|
|
40
|
+
warn: (msg, ...args) => console.warn(prefix + msg, ...args),
|
|
41
|
+
error: (msg, ...args) => console.error(prefix + msg, ...args)
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
exports.getLogger = getLogger;
|
|
45
|
+
const logger = getLogger("Utils: ");
|
|
46
|
+
async function tryWithRetries(func, retryPolicy, errorAllowed, abortSignal) {
|
|
47
|
+
retryPolicy = retryPolicy || {};
|
|
48
|
+
retryPolicy.maxRetries = retryPolicy.maxRetries || 5;
|
|
49
|
+
retryPolicy.delay = retryPolicy.delay || 500;
|
|
50
|
+
retryPolicy.exponential = retryPolicy.exponential == null ? true : retryPolicy.exponential;
|
|
51
|
+
let err = null;
|
|
52
|
+
for (let i = 0; i < retryPolicy.maxRetries; i++) {
|
|
53
|
+
try {
|
|
54
|
+
const resp = await func();
|
|
55
|
+
return resp;
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
if (errorAllowed != null && errorAllowed(e))
|
|
59
|
+
throw e;
|
|
60
|
+
err = e;
|
|
61
|
+
logger.error("tryWithRetries(): error on try number: " + i, e);
|
|
62
|
+
}
|
|
63
|
+
if (abortSignal != null && abortSignal.aborted)
|
|
64
|
+
throw new Error("Aborted");
|
|
65
|
+
if (i !== retryPolicy.maxRetries - 1) {
|
|
66
|
+
await timeoutPromise(retryPolicy.exponential ? retryPolicy.delay * Math.pow(2, i) : retryPolicy.delay, abortSignal);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
exports.tryWithRetries = tryWithRetries;
|
|
72
|
+
function toHex(value, length = 64) {
|
|
73
|
+
if (value == null)
|
|
74
|
+
return null;
|
|
75
|
+
switch (typeof (value)) {
|
|
76
|
+
case "string":
|
|
77
|
+
if (value.startsWith("0x")) {
|
|
78
|
+
return "0x" + value.slice(2).padStart(length, "0");
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
return "0x" + BigInt(value).toString(16).padStart(length, "0");
|
|
82
|
+
}
|
|
83
|
+
case "number":
|
|
84
|
+
case "bigint":
|
|
85
|
+
return "0x" + value.toString(16).padStart(length, "0");
|
|
86
|
+
}
|
|
87
|
+
return "0x" + value.toString("hex").padStart(length, "0");
|
|
88
|
+
}
|
|
89
|
+
exports.toHex = toHex;
|
|
90
|
+
function calculateHash(tx) {
|
|
91
|
+
const commonData = {
|
|
92
|
+
version: tx.details.version,
|
|
93
|
+
maxFee: tx.details.maxFee,
|
|
94
|
+
chainId: tx.details.chainId,
|
|
95
|
+
nonce: tx.details.nonce,
|
|
96
|
+
accountDeploymentData: tx.details.version === "0x3" ? tx.details.accountDeploymentData : null,
|
|
97
|
+
nonceDataAvailabilityMode: tx.details.version === "0x3" ? starknet_types_07_1.EDAMode[tx.details.nonceDataAvailabilityMode] : null,
|
|
98
|
+
feeDataAvailabilityMode: tx.details.version === "0x3" ? starknet_types_07_1.EDAMode[tx.details.feeDataAvailabilityMode] : null,
|
|
99
|
+
resourceBounds: tx.details.version === "0x3" ? tx.details.resourceBounds : null,
|
|
100
|
+
tip: tx.details.version === "0x3" ? tx.details.tip : null,
|
|
101
|
+
paymasterData: tx.details.version === "0x3" ? tx.details.paymasterData : null
|
|
102
|
+
};
|
|
103
|
+
switch (tx.type) {
|
|
104
|
+
case "INVOKE":
|
|
105
|
+
const invokeData = starknet_1.CallData.compile(tx.signed.calldata);
|
|
106
|
+
return tx.txId = starknet_1.hash.calculateInvokeTransactionHash({
|
|
107
|
+
senderAddress: tx.details.walletAddress,
|
|
108
|
+
compiledCalldata: invokeData,
|
|
109
|
+
...commonData
|
|
110
|
+
});
|
|
111
|
+
case "DEPLOY_ACCOUNT":
|
|
112
|
+
const deployAccountData = starknet_1.CallData.compile(tx.signed.constructorCalldata);
|
|
113
|
+
return tx.txId = starknet_1.hash.calculateDeployAccountTransactionHash({
|
|
114
|
+
contractAddress: tx.tx.contractAddress,
|
|
115
|
+
classHash: tx.signed.classHash,
|
|
116
|
+
constructorCalldata: deployAccountData,
|
|
117
|
+
compiledConstructorCalldata: deployAccountData,
|
|
118
|
+
salt: tx.signed.addressSalt,
|
|
119
|
+
...commonData
|
|
120
|
+
});
|
|
121
|
+
default:
|
|
122
|
+
throw new Error("Unsupported tx type!");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
exports.calculateHash = calculateHash;
|
|
126
|
+
function u32ArrayToBuffer(arr) {
|
|
127
|
+
const buffer = buffer_1.Buffer.alloc(4 * arr.length);
|
|
128
|
+
for (let i = 0; i < arr.length; i++) {
|
|
129
|
+
buffer.writeUInt32BE(Number(arr[i]), i * 4);
|
|
130
|
+
}
|
|
131
|
+
return buffer;
|
|
132
|
+
}
|
|
133
|
+
exports.u32ArrayToBuffer = u32ArrayToBuffer;
|
|
134
|
+
function bufferToU32Array(buffer) {
|
|
135
|
+
const result = [];
|
|
136
|
+
for (let i = 0; i < buffer.length; i += 4) {
|
|
137
|
+
result.push(buffer.readUInt32BE(i));
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
exports.bufferToU32Array = bufferToU32Array;
|
|
142
|
+
function u32ReverseEndianness(value) {
|
|
143
|
+
const valueBN = BigInt(value);
|
|
144
|
+
return Number(((valueBN & 0xffn) << 24n) |
|
|
145
|
+
((valueBN & 0xff00n) << 8n) |
|
|
146
|
+
((valueBN >> 8n) & 0xff00n) |
|
|
147
|
+
((valueBN >> 24n) & 0xffn));
|
|
148
|
+
}
|
|
149
|
+
exports.u32ReverseEndianness = u32ReverseEndianness;
|
|
150
|
+
function bigNumberishToBuffer(value, length) {
|
|
151
|
+
if (isUint256(value)) {
|
|
152
|
+
return buffer_1.Buffer.concat([bigNumberishToBuffer(value.high, 16), bigNumberishToBuffer(value.low, 16)]);
|
|
153
|
+
}
|
|
154
|
+
if (typeof (value) === "string") {
|
|
155
|
+
if (value.startsWith("0x")) {
|
|
156
|
+
value = value.slice(2);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
value = BigInt(value).toString(16);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
value = value.toString(16);
|
|
164
|
+
}
|
|
165
|
+
const buff = buffer_1.Buffer.from(value.padStart(length * 2, "0"), "hex");
|
|
166
|
+
if (buff.length > length)
|
|
167
|
+
return buff.subarray(buff.length - length);
|
|
168
|
+
return buff;
|
|
169
|
+
}
|
|
170
|
+
exports.bigNumberishToBuffer = bigNumberishToBuffer;
|
|
171
|
+
function toBigInt(value) {
|
|
172
|
+
if (value == null)
|
|
173
|
+
return null;
|
|
174
|
+
if (isUint256(value)) {
|
|
175
|
+
return (toBigInt(value.high) << 128n) | toBigInt(value.low);
|
|
176
|
+
}
|
|
177
|
+
if (typeof (value) === "string") {
|
|
178
|
+
if (!value.startsWith("0x"))
|
|
179
|
+
value = "0x" + value;
|
|
180
|
+
return BigInt(value);
|
|
181
|
+
}
|
|
182
|
+
if (typeof (value) === "bigint") {
|
|
183
|
+
return value;
|
|
184
|
+
}
|
|
185
|
+
return BigInt(value);
|
|
186
|
+
}
|
|
187
|
+
exports.toBigInt = toBigInt;
|
|
188
|
+
function bytes31SpanToBuffer(span, length) {
|
|
189
|
+
const buffers = [];
|
|
190
|
+
const numFullBytes31 = Math.floor(length / 31);
|
|
191
|
+
const additionalBytes = length - (numFullBytes31 * 31);
|
|
192
|
+
const requiredSpanLength = numFullBytes31 + (additionalBytes === 0 ? 0 : 1);
|
|
193
|
+
if (span.length < requiredSpanLength)
|
|
194
|
+
throw new Error("Not enough bytes in the felt array!");
|
|
195
|
+
let i = 0;
|
|
196
|
+
for (; i < numFullBytes31; i++) {
|
|
197
|
+
buffers.push(bigNumberishToBuffer(span[i], 31));
|
|
198
|
+
}
|
|
199
|
+
if (additionalBytes !== 0)
|
|
200
|
+
buffers.push(bigNumberishToBuffer(span[i], additionalBytes));
|
|
201
|
+
return buffer_1.Buffer.concat(buffers);
|
|
202
|
+
}
|
|
203
|
+
exports.bytes31SpanToBuffer = bytes31SpanToBuffer;
|
|
204
|
+
function bufferToBytes31Span(buffer, startIndex = 0, endIndex = buffer.length) {
|
|
205
|
+
const values = [];
|
|
206
|
+
for (let i = startIndex + 31; i < endIndex; i += 31) {
|
|
207
|
+
values.push(BigInt("0x" + buffer.subarray(i - 31, i).toString("hex")));
|
|
208
|
+
}
|
|
209
|
+
if (endIndex > startIndex + (values.length * 31))
|
|
210
|
+
values.push(BigInt("0x" + buffer.subarray(startIndex + (values.length * 31), endIndex).toString("hex")));
|
|
211
|
+
return values;
|
|
212
|
+
}
|
|
213
|
+
exports.bufferToBytes31Span = bufferToBytes31Span;
|
|
214
|
+
function bufferToByteArray(buffer, startIndex = 0, endIndex = buffer.length) {
|
|
215
|
+
const values = [];
|
|
216
|
+
for (let i = startIndex + 31; i < endIndex; i += 31) {
|
|
217
|
+
values.push(BigInt("0x" + buffer.subarray(i - 31, i).toString("hex")));
|
|
218
|
+
}
|
|
219
|
+
let pendingWord = BigInt(0);
|
|
220
|
+
let pendingWordLen = BigInt(endIndex - (startIndex + (values.length * 31)));
|
|
221
|
+
if (pendingWordLen !== BigInt(0)) {
|
|
222
|
+
pendingWord = BigInt("0x" + buffer.subarray(startIndex + (values.length * 31), endIndex).toString("hex"));
|
|
223
|
+
}
|
|
224
|
+
return [
|
|
225
|
+
BigInt(values.length),
|
|
226
|
+
...values,
|
|
227
|
+
pendingWord,
|
|
228
|
+
pendingWordLen
|
|
229
|
+
];
|
|
230
|
+
}
|
|
231
|
+
exports.bufferToByteArray = bufferToByteArray;
|
|
232
|
+
function poseidonHashRange(buffer, startIndex = 0, endIndex = buffer.length) {
|
|
233
|
+
return starknet_1.hash.computePoseidonHashOnElements(bufferToBytes31Span(buffer, startIndex, endIndex));
|
|
234
|
+
}
|
|
235
|
+
exports.poseidonHashRange = poseidonHashRange;
|
|
236
|
+
function parseInitFunctionCalldata(calldata, claimHandler) {
|
|
237
|
+
const escrow = StarknetSwapData_1.StarknetSwapData.fromSerializedFeltArray(calldata, claimHandler);
|
|
238
|
+
const signatureLen = Number(toBigInt(calldata.shift()));
|
|
239
|
+
const signature = calldata.splice(0, signatureLen);
|
|
240
|
+
const timeout = toBigInt(calldata.shift());
|
|
241
|
+
const extraDataLen = Number(toBigInt(calldata.shift()));
|
|
242
|
+
const extraData = calldata.splice(0, extraDataLen);
|
|
243
|
+
if (calldata.length !== 0)
|
|
244
|
+
throw new Error("Calldata not read fully!");
|
|
245
|
+
return { escrow, signature, timeout, extraData };
|
|
246
|
+
}
|
|
247
|
+
exports.parseInitFunctionCalldata = parseInitFunctionCalldata;
|
|
248
|
+
function findLastIndex(array, callback) {
|
|
249
|
+
for (let i = array.length - 1; i >= 0; i--) {
|
|
250
|
+
if (callback(array[i], i))
|
|
251
|
+
return i;
|
|
252
|
+
}
|
|
253
|
+
return -1;
|
|
254
|
+
}
|
|
255
|
+
exports.findLastIndex = findLastIndex;
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@atomiqlabs/chain-starknet",
|
|
3
|
+
"version": "1.0.0-beta.0",
|
|
4
|
+
"description": "Starknet specific base implementation",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types:": "./dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"/dist",
|
|
12
|
+
"/src"
|
|
13
|
+
],
|
|
14
|
+
"keywords": [
|
|
15
|
+
"Starknet",
|
|
16
|
+
"Bitcoin",
|
|
17
|
+
"Cross-chain",
|
|
18
|
+
"Cryptocurrency",
|
|
19
|
+
"Bridge",
|
|
20
|
+
"Trustless"
|
|
21
|
+
],
|
|
22
|
+
"author": "adambor",
|
|
23
|
+
"license": "ISC",
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@atomiqlabs/base": "8.0.0-beta.0",
|
|
26
|
+
"@scure/btc-signer": "1.6.0",
|
|
27
|
+
"abi-wan-kanabi": "2.2.4",
|
|
28
|
+
"buffer": "6.0.3",
|
|
29
|
+
"create-hash": "1.2.0",
|
|
30
|
+
"randombytes": "2.1.0"
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"starknet": "^6.11.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/create-hash": "1.2.6",
|
|
37
|
+
"typescript": "4.9.5"
|
|
38
|
+
}
|
|
39
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export * from "./starknet/base/StarknetAction";
|
|
2
|
+
export * from "./starknet/base/StarknetBase";
|
|
3
|
+
export * from "./starknet/base/StarknetModule";
|
|
4
|
+
|
|
5
|
+
export * from "./starknet/base/modules/StarknetFees";
|
|
6
|
+
export * from "./starknet/base/modules/StarknetEvents";
|
|
7
|
+
export * from "./starknet/base/modules/StarknetTokens";
|
|
8
|
+
export * from "./starknet/base/modules/StarknetAddresses";
|
|
9
|
+
export * from "./starknet/base/modules/StarknetTransactions";
|
|
10
|
+
export * from "./starknet/base/modules/StarknetSignatures";
|
|
11
|
+
|
|
12
|
+
export * from "./starknet/btcrelay/headers/StarknetBtcStoredHeader";
|
|
13
|
+
export * from "./starknet/btcrelay/headers/StarknetBtcHeader";
|
|
14
|
+
export * from "./starknet/btcrelay/StarknetBtcRelay";
|
|
15
|
+
|
|
16
|
+
export * from "./starknet/contract/modules/StarknetContractEvents";
|
|
17
|
+
export * from "./starknet/contract/StarknetContractBase";
|
|
18
|
+
|
|
19
|
+
export * from "./starknet/swaps/StarknetSwapContract";
|
|
20
|
+
export * from "./starknet/swaps/StarknetSwapData";
|
|
21
|
+
export * from "./starknet/swaps/StarknetSwapModule";
|
|
22
|
+
export * from "./starknet/swaps/modules/StarknetLpVault";
|
|
23
|
+
export * from "./starknet/swaps/modules/StarknetSwapClaim";
|
|
24
|
+
export * from "./starknet/swaps/modules/StarknetSwapInit";
|
|
25
|
+
export * from "./starknet/swaps/modules/StarknetSwapRefund";
|
|
26
|
+
export * from "./starknet/swaps/handlers/IHandler";
|
|
27
|
+
export * from "./starknet/swaps/handlers/refund/TimelockRefundHandler";
|
|
28
|
+
export * from "./starknet/swaps/handlers/claim/ClaimHandlers";
|
|
29
|
+
export * from "./starknet/swaps/handlers/claim/HashlockClaimHandler";
|
|
30
|
+
export * from "./starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler";
|
|
31
|
+
export * from "./starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler";
|
|
32
|
+
export * from "./starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler";
|
|
33
|
+
export * from "./starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler";
|
|
34
|
+
|
|
35
|
+
export * from "./starknet/events/StarknetChainEventsBrowser";
|
|
36
|
+
|
|
37
|
+
export * from "./starknet/wallet/StarknetSigner";
|
|
38
|
+
export * from "./starknet/wallet/StarknetKeypairWallet";
|
|
39
|
+
|
|
40
|
+
export * from "./starknet/StarknetChainType";
|
|
41
|
+
export * from "./starknet/StarknetInitializer";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {ChainType} from "@atomiqlabs/base";
|
|
2
|
+
import {StarknetTx} from "./base/modules/StarknetTransactions";
|
|
3
|
+
import {StarknetSigner} from "./wallet/StarknetSigner";
|
|
4
|
+
import {StarknetSwapData} from "./swaps/StarknetSwapData";
|
|
5
|
+
import {StarknetSwapContract} from "./swaps/StarknetSwapContract";
|
|
6
|
+
import {StarknetChainEventsBrowser} from "./events/StarknetChainEventsBrowser";
|
|
7
|
+
import {StarknetBtcRelay} from "./btcrelay/StarknetBtcRelay";
|
|
8
|
+
import {StarknetPreFetchVerification} from "./swaps/modules/StarknetSwapInit";
|
|
9
|
+
|
|
10
|
+
export type StarknetChainType = ChainType<
|
|
11
|
+
"STARKNET",
|
|
12
|
+
never,
|
|
13
|
+
StarknetPreFetchVerification,
|
|
14
|
+
StarknetTx,
|
|
15
|
+
StarknetSigner,
|
|
16
|
+
StarknetSwapData,
|
|
17
|
+
StarknetSwapContract,
|
|
18
|
+
StarknetChainEventsBrowser,
|
|
19
|
+
StarknetBtcRelay<any>
|
|
20
|
+
>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import {constants, Provider, RpcProvider} from "starknet";
|
|
2
|
+
import {StarknetFees} from "./base/modules/StarknetFees";
|
|
3
|
+
import {StarknetRetryPolicy} from "./base/StarknetBase";
|
|
4
|
+
import {StarknetBtcRelay} from "./btcrelay/StarknetBtcRelay";
|
|
5
|
+
import {StarknetSwapContract} from "./swaps/StarknetSwapContract";
|
|
6
|
+
import {StarknetChainEventsBrowser} from "./events/StarknetChainEventsBrowser";
|
|
7
|
+
import {BaseTokenType, BitcoinNetwork, BitcoinRpc, ChainData, ChainInitializer} from "@atomiqlabs/base";
|
|
8
|
+
import {StarknetChainType} from "./StarknetChainType";
|
|
9
|
+
import {StarknetSwapData} from "./swaps/StarknetSwapData";
|
|
10
|
+
|
|
11
|
+
export type StarknetAssetsType = BaseTokenType<"ETH" | "STRK">;
|
|
12
|
+
export const StarknetAssets: StarknetAssetsType = {
|
|
13
|
+
ETH: {
|
|
14
|
+
address: "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",
|
|
15
|
+
decimals: 18,
|
|
16
|
+
displayDecimals: 9
|
|
17
|
+
},
|
|
18
|
+
STRK: {
|
|
19
|
+
address: "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d",
|
|
20
|
+
decimals: 18,
|
|
21
|
+
displayDecimals: 9
|
|
22
|
+
}
|
|
23
|
+
} as const;
|
|
24
|
+
|
|
25
|
+
export type StarknetOptions = {
|
|
26
|
+
rpcUrl: string | Provider,
|
|
27
|
+
retryPolicy?: StarknetRetryPolicy,
|
|
28
|
+
chainId?: constants.StarknetChainId,
|
|
29
|
+
|
|
30
|
+
swapContract?: string,
|
|
31
|
+
btcRelayContract?: string,
|
|
32
|
+
|
|
33
|
+
fees?: StarknetFees
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function initializeStarknet(
|
|
37
|
+
options: StarknetOptions,
|
|
38
|
+
bitcoinRpc: BitcoinRpc<any>,
|
|
39
|
+
network: BitcoinNetwork
|
|
40
|
+
): ChainData<StarknetChainType> {
|
|
41
|
+
const provider = typeof(options.rpcUrl)==="string" ?
|
|
42
|
+
new RpcProvider({nodeUrl: options.rpcUrl}) :
|
|
43
|
+
options.rpcUrl;
|
|
44
|
+
|
|
45
|
+
const Fees = options.fees ?? new StarknetFees(provider, "ETH");
|
|
46
|
+
|
|
47
|
+
const chainId = options.chainId ??
|
|
48
|
+
(network===BitcoinNetwork.MAINNET ? constants.StarknetChainId.SN_MAIN : constants.StarknetChainId.SN_SEPOLIA);
|
|
49
|
+
|
|
50
|
+
const btcRelay = new StarknetBtcRelay(
|
|
51
|
+
chainId, provider, bitcoinRpc, options.btcRelayContract, options.retryPolicy, Fees
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
const swapContract = new StarknetSwapContract(
|
|
55
|
+
chainId, provider, btcRelay, options.swapContract, options.retryPolicy, Fees
|
|
56
|
+
);
|
|
57
|
+
const chainEvents = new StarknetChainEventsBrowser(swapContract);
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
chainId: "STARKNET",
|
|
61
|
+
btcRelay,
|
|
62
|
+
swapContract,
|
|
63
|
+
chainEvents,
|
|
64
|
+
swapDataConstructor: StarknetSwapData
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export type StarknetInitializerType = ChainInitializer<StarknetOptions, StarknetChainType, StarknetAssetsType>;
|
|
69
|
+
export const StarknetInitializer: StarknetInitializerType = {
|
|
70
|
+
chainId: "STARKNET",
|
|
71
|
+
chainType: null as StarknetChainType,
|
|
72
|
+
initializer: initializeStarknet,
|
|
73
|
+
tokens: StarknetAssets,
|
|
74
|
+
options: null as StarknetOptions
|
|
75
|
+
} as const;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import {Call} from "starknet";
|
|
2
|
+
import {StarknetBase} from "./StarknetBase";
|
|
3
|
+
import {StarknetTx} from "./modules/StarknetTransactions";
|
|
4
|
+
|
|
5
|
+
export type StarknetGas = {l1?: number, l2?: number};
|
|
6
|
+
|
|
7
|
+
export function sumStarknetGas(a: StarknetGas, b: StarknetGas) {
|
|
8
|
+
return {
|
|
9
|
+
l1: (a?.l1 ?? 0) + (b?.l1 ?? 0),
|
|
10
|
+
l2: (a?.l2 ?? 0) + (b?.l2 ?? 0)
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class StarknetAction {
|
|
15
|
+
|
|
16
|
+
L1GasLimit: number;
|
|
17
|
+
L2GasLimit: number;
|
|
18
|
+
readonly mainSigner: string;
|
|
19
|
+
private readonly root: StarknetBase;
|
|
20
|
+
private readonly instructions: Call[];
|
|
21
|
+
private feeRate: string;
|
|
22
|
+
|
|
23
|
+
constructor(
|
|
24
|
+
mainSigner: string,
|
|
25
|
+
root: StarknetBase,
|
|
26
|
+
instructions: Call[] | Call = [],
|
|
27
|
+
gasLimit?: StarknetGas,
|
|
28
|
+
feeRate?: string
|
|
29
|
+
) {
|
|
30
|
+
this.mainSigner = mainSigner;
|
|
31
|
+
this.root = root;
|
|
32
|
+
this.instructions = Array.isArray(instructions) ? instructions : [instructions];
|
|
33
|
+
this.L1GasLimit = gasLimit?.l1 ?? 0;
|
|
34
|
+
this.L2GasLimit = gasLimit?.l2 ?? 0;
|
|
35
|
+
this.feeRate = feeRate;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private estimateFeeRate(): Promise<string> {
|
|
39
|
+
return this.root.Fees.getFeeRate();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public addIx(instruction: Call, gasLimit?: StarknetGas) {
|
|
43
|
+
this.instructions.push(instruction);
|
|
44
|
+
this.L1GasLimit += gasLimit?.l1 ?? 0;
|
|
45
|
+
this.L2GasLimit += gasLimit?.l2 ?? 0;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public add(action: StarknetAction): this {
|
|
49
|
+
return this.addAction(action);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public addAction(action: StarknetAction, index: number = this.instructions.length): this {
|
|
53
|
+
if(action.mainSigner!==this.mainSigner) throw new Error("Actions need to have the same signer!");
|
|
54
|
+
if(this.L1GasLimit==null && action.L1GasLimit!=null) this.L1GasLimit = action.L1GasLimit;
|
|
55
|
+
if(this.L2GasLimit==null && action.L2GasLimit!=null) this.L2GasLimit = action.L2GasLimit;
|
|
56
|
+
if(this.L1GasLimit!=null && action.L1GasLimit!=null) this.L1GasLimit += action.L1GasLimit;
|
|
57
|
+
if(this.L2GasLimit!=null && action.L2GasLimit!=null) this.L2GasLimit += action.L2GasLimit;
|
|
58
|
+
this.instructions.splice(index, 0, ...action.instructions);
|
|
59
|
+
if(this.feeRate==null) this.feeRate = action.feeRate;
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public async tx(feeRate?: string): Promise<StarknetTx> {
|
|
64
|
+
if(feeRate==null) feeRate = this.feeRate;
|
|
65
|
+
if(feeRate==null) feeRate = await this.estimateFeeRate();
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
type: "INVOKE",
|
|
69
|
+
tx: this.instructions,
|
|
70
|
+
details: {
|
|
71
|
+
...this.root.Fees.getFeeDetails(this.L1GasLimit, this.L2GasLimit, feeRate),
|
|
72
|
+
walletAddress: this.mainSigner,
|
|
73
|
+
cairoVersion: "1",
|
|
74
|
+
chainId: this.root.starknetChainId,
|
|
75
|
+
nonce: null,
|
|
76
|
+
accountDeploymentData: [],
|
|
77
|
+
skipValidate: false
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public async addToTxs(txs: StarknetTx[], feeRate?: string): Promise<void> {
|
|
83
|
+
txs.push(await this.tx(feeRate));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public ixsLength(): number {
|
|
87
|
+
return this.instructions.length;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import {Provider, constants} from "starknet";
|
|
2
|
+
import {getLogger} from "../../utils/Utils";
|
|
3
|
+
import {StarknetTransactions} from "./modules/StarknetTransactions";
|
|
4
|
+
import {StarknetFees} from "./modules/StarknetFees";
|
|
5
|
+
import {StarknetAddresses} from "./modules/StarknetAddresses";
|
|
6
|
+
import {StarknetTokens} from "./modules/StarknetTokens";
|
|
7
|
+
import {StarknetEvents} from "./modules/StarknetEvents";
|
|
8
|
+
import {StarknetSignatures} from "./modules/StarknetSignatures";
|
|
9
|
+
import {StarknetAccounts} from "./modules/StarknetAccounts";
|
|
10
|
+
import {StarknetBlocks} from "./modules/StarknetBlocks";
|
|
11
|
+
|
|
12
|
+
export type StarknetRetryPolicy = {
|
|
13
|
+
maxRetries?: number,
|
|
14
|
+
delay?: number,
|
|
15
|
+
exponential?: boolean
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export class StarknetBase {
|
|
19
|
+
|
|
20
|
+
readonly provider: Provider;
|
|
21
|
+
readonly retryPolicy: StarknetRetryPolicy;
|
|
22
|
+
|
|
23
|
+
public readonly starknetChainId: constants.StarknetChainId;
|
|
24
|
+
|
|
25
|
+
public Fees: StarknetFees;
|
|
26
|
+
public readonly Tokens: StarknetTokens;
|
|
27
|
+
public readonly Transactions: StarknetTransactions;
|
|
28
|
+
public readonly Addresses: StarknetAddresses;
|
|
29
|
+
public readonly Signatures: StarknetSignatures;
|
|
30
|
+
public readonly Events: StarknetEvents;
|
|
31
|
+
public readonly Accounts: StarknetAccounts;
|
|
32
|
+
public readonly Blocks: StarknetBlocks;
|
|
33
|
+
|
|
34
|
+
protected readonly logger = getLogger(this.constructor.name+": ");
|
|
35
|
+
|
|
36
|
+
constructor(
|
|
37
|
+
chainId: constants.StarknetChainId,
|
|
38
|
+
provider: Provider,
|
|
39
|
+
retryPolicy?: StarknetRetryPolicy,
|
|
40
|
+
solanaFeeEstimator: StarknetFees = new StarknetFees(provider)
|
|
41
|
+
) {
|
|
42
|
+
this.starknetChainId = chainId;
|
|
43
|
+
this.provider = provider;
|
|
44
|
+
this.retryPolicy = retryPolicy;
|
|
45
|
+
|
|
46
|
+
this.Fees = solanaFeeEstimator;
|
|
47
|
+
this.Tokens = new StarknetTokens(this);
|
|
48
|
+
this.Transactions = new StarknetTransactions(this);
|
|
49
|
+
this.Addresses = new StarknetAddresses(this);
|
|
50
|
+
this.Signatures = new StarknetSignatures(this);
|
|
51
|
+
this.Events = new StarknetEvents(this);
|
|
52
|
+
this.Accounts = new StarknetAccounts(this);
|
|
53
|
+
this.Blocks = new StarknetBlocks(this);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {Provider} from "starknet";
|
|
2
|
+
import {StarknetBase, StarknetRetryPolicy} from "./StarknetBase";
|
|
3
|
+
import {getLogger} from "../../utils/Utils";
|
|
4
|
+
|
|
5
|
+
export class StarknetModule {
|
|
6
|
+
protected readonly provider: Provider;
|
|
7
|
+
protected readonly retryPolicy: StarknetRetryPolicy;
|
|
8
|
+
protected readonly root: StarknetBase;
|
|
9
|
+
|
|
10
|
+
protected readonly logger = getLogger(this.constructor.name+": ");
|
|
11
|
+
|
|
12
|
+
constructor(
|
|
13
|
+
root: StarknetBase
|
|
14
|
+
) {
|
|
15
|
+
this.provider = root.provider;
|
|
16
|
+
this.retryPolicy = root.retryPolicy;
|
|
17
|
+
this.root = root;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
}
|