@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,74 @@
|
|
|
1
|
+
import { SwapData, ChainSwapType } from "@atomiqlabs/base";
|
|
2
|
+
import { BigNumberish } from "starknet";
|
|
3
|
+
import { StringToPrimitiveType } from "abi-wan-kanabi/dist/kanabi";
|
|
4
|
+
import { EscrowManagerAbi } from "./EscrowManagerAbi";
|
|
5
|
+
import { IClaimHandler } from "./handlers/claim/ClaimHandlers";
|
|
6
|
+
export type StarknetSwapDataType = StringToPrimitiveType<typeof EscrowManagerAbi, "escrow_manager::structs::escrow::EscrowData">;
|
|
7
|
+
type SerializedContractCall = {
|
|
8
|
+
address: string;
|
|
9
|
+
entrypoint: string;
|
|
10
|
+
calldata: string[];
|
|
11
|
+
};
|
|
12
|
+
export declare class StarknetSwapData extends SwapData {
|
|
13
|
+
static toFlags(value: number | bigint | string): {
|
|
14
|
+
payOut: boolean;
|
|
15
|
+
payIn: boolean;
|
|
16
|
+
reputation: boolean;
|
|
17
|
+
sequence: bigint;
|
|
18
|
+
};
|
|
19
|
+
private getFlags;
|
|
20
|
+
offerer: string;
|
|
21
|
+
claimer: string;
|
|
22
|
+
token: string;
|
|
23
|
+
refundHandler: string;
|
|
24
|
+
claimHandler: string;
|
|
25
|
+
payOut: boolean;
|
|
26
|
+
payIn: boolean;
|
|
27
|
+
reputation: boolean;
|
|
28
|
+
sequence: bigint;
|
|
29
|
+
claimData: string;
|
|
30
|
+
refundData: string;
|
|
31
|
+
amount: bigint;
|
|
32
|
+
feeToken: string;
|
|
33
|
+
securityDeposit: bigint;
|
|
34
|
+
claimerBounty: bigint;
|
|
35
|
+
successAction: SerializedContractCall[];
|
|
36
|
+
extraData: string;
|
|
37
|
+
kind: ChainSwapType;
|
|
38
|
+
constructor(offerer: string, claimer: string, token: string, refundHandler: string, claimHandler: string, payOut: boolean, payIn: boolean, reputation: boolean, sequence: bigint, claimData: string, refundData: string, amount: bigint, feeToken: string, securityDeposit: bigint, claimerBounty: bigint, kind: ChainSwapType, extraData: string, successAction: SerializedContractCall[]);
|
|
39
|
+
constructor(data: any);
|
|
40
|
+
getOfferer(): string;
|
|
41
|
+
setOfferer(newOfferer: string): void;
|
|
42
|
+
getClaimer(): string;
|
|
43
|
+
setClaimer(newClaimer: string): void;
|
|
44
|
+
serialize(): any;
|
|
45
|
+
getAmount(): bigint;
|
|
46
|
+
getToken(): string;
|
|
47
|
+
isToken(token: string): boolean;
|
|
48
|
+
getType(): ChainSwapType;
|
|
49
|
+
getExpiry(): bigint;
|
|
50
|
+
isPayIn(): boolean;
|
|
51
|
+
isPayOut(): boolean;
|
|
52
|
+
getEscrowHash(): string;
|
|
53
|
+
getClaimHash(): string;
|
|
54
|
+
getSequence(): bigint;
|
|
55
|
+
getConfirmationsHint(): number;
|
|
56
|
+
getNonceHint(): bigint;
|
|
57
|
+
getTxoHashHint(): string;
|
|
58
|
+
getExtraData(): string;
|
|
59
|
+
setExtraData(extraData: string): void;
|
|
60
|
+
getSecurityDeposit(): bigint;
|
|
61
|
+
getClaimerBounty(): bigint;
|
|
62
|
+
getTotalDeposit(): bigint;
|
|
63
|
+
getDepositToken(): string;
|
|
64
|
+
isDepositToken(token: string): boolean;
|
|
65
|
+
isClaimer(address: string): boolean;
|
|
66
|
+
isOfferer(address: string): boolean;
|
|
67
|
+
isRefundHandler(address: string): boolean;
|
|
68
|
+
isClaimHandler(address: string): boolean;
|
|
69
|
+
isClaimData(data: string): boolean;
|
|
70
|
+
equals(other: StarknetSwapData): boolean;
|
|
71
|
+
toEscrowStruct(): StarknetSwapDataType;
|
|
72
|
+
static fromSerializedFeltArray(span: BigNumberish[], claimHandlerImpl: IClaimHandler<any, any>): StarknetSwapData;
|
|
73
|
+
}
|
|
74
|
+
export {};
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StarknetSwapData = void 0;
|
|
4
|
+
const base_1 = require("@atomiqlabs/base");
|
|
5
|
+
const TimelockRefundHandler_1 = require("./handlers/refund/TimelockRefundHandler");
|
|
6
|
+
const starknet_1 = require("starknet");
|
|
7
|
+
const Utils_1 = require("../../utils/Utils");
|
|
8
|
+
const FLAG_PAY_OUT = 0x01n;
|
|
9
|
+
const FLAG_PAY_IN = 0x02n;
|
|
10
|
+
const FLAG_REPUTATION = 0x04n;
|
|
11
|
+
function deserializeContractCalls(span) {
|
|
12
|
+
const successActionsLen = Number((0, Utils_1.toBigInt)(span.shift()));
|
|
13
|
+
const successActions = [];
|
|
14
|
+
for (let i = 0; i < successActionsLen; i++) {
|
|
15
|
+
const address = (0, Utils_1.toHex)(span.shift());
|
|
16
|
+
const entrypoint = (0, Utils_1.toHex)(span.shift());
|
|
17
|
+
const calldataLen = Number((0, Utils_1.toBigInt)(span.shift()));
|
|
18
|
+
const calldata = span.splice(0, calldataLen).map(Utils_1.toHex);
|
|
19
|
+
successActions.push({
|
|
20
|
+
address,
|
|
21
|
+
entrypoint,
|
|
22
|
+
calldata
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return successActions;
|
|
26
|
+
}
|
|
27
|
+
function serializeContractCalls(calls, span) {
|
|
28
|
+
span.push((0, Utils_1.toHex)(calls.length));
|
|
29
|
+
calls.forEach((call) => {
|
|
30
|
+
span.push(call.address);
|
|
31
|
+
span.push(call.entrypoint);
|
|
32
|
+
span.push((0, Utils_1.toHex)(call.calldata.length));
|
|
33
|
+
span.push(...call.calldata);
|
|
34
|
+
});
|
|
35
|
+
return span;
|
|
36
|
+
}
|
|
37
|
+
class StarknetSwapData extends base_1.SwapData {
|
|
38
|
+
static toFlags(value) {
|
|
39
|
+
const val = (0, Utils_1.toBigInt)(value);
|
|
40
|
+
return {
|
|
41
|
+
sequence: val >> 64n,
|
|
42
|
+
payOut: (val & FLAG_PAY_OUT) === FLAG_PAY_OUT,
|
|
43
|
+
payIn: (val & FLAG_PAY_IN) === FLAG_PAY_IN,
|
|
44
|
+
reputation: (val & FLAG_REPUTATION) === FLAG_REPUTATION
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
getFlags() {
|
|
48
|
+
return (this.sequence << 64n) +
|
|
49
|
+
(this.payOut ? FLAG_PAY_OUT : 0n) +
|
|
50
|
+
(this.payIn ? FLAG_PAY_IN : 0n) +
|
|
51
|
+
(this.reputation ? FLAG_REPUTATION : 0n);
|
|
52
|
+
}
|
|
53
|
+
constructor(offererOrData, claimer, token, refundHandler, claimHandler, payOut, payIn, reputation, sequence, claimData, refundData, amount, feeToken, securityDeposit, claimerBounty, kind, extraData, successAction) {
|
|
54
|
+
super();
|
|
55
|
+
if (claimer != null || token != null || refundHandler != null || claimHandler != null ||
|
|
56
|
+
payOut != null || payIn != null || reputation != null || sequence != null || claimData != null || refundData != null ||
|
|
57
|
+
amount != null || feeToken != null || securityDeposit != null || claimerBounty != null) {
|
|
58
|
+
this.offerer = offererOrData;
|
|
59
|
+
this.claimer = claimer;
|
|
60
|
+
this.token = token;
|
|
61
|
+
this.refundHandler = refundHandler;
|
|
62
|
+
this.claimHandler = claimHandler;
|
|
63
|
+
this.payOut = payOut;
|
|
64
|
+
this.payIn = payIn;
|
|
65
|
+
this.reputation = reputation;
|
|
66
|
+
this.sequence = sequence;
|
|
67
|
+
this.claimData = claimData;
|
|
68
|
+
this.refundData = refundData;
|
|
69
|
+
this.amount = amount;
|
|
70
|
+
this.feeToken = feeToken;
|
|
71
|
+
this.securityDeposit = securityDeposit;
|
|
72
|
+
this.claimerBounty = claimerBounty;
|
|
73
|
+
this.kind = kind;
|
|
74
|
+
this.extraData = extraData;
|
|
75
|
+
this.successAction = successAction;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
this.offerer = offererOrData.offerer;
|
|
79
|
+
this.claimer = offererOrData.claimer;
|
|
80
|
+
this.token = offererOrData.token;
|
|
81
|
+
this.refundHandler = offererOrData.refundHandler;
|
|
82
|
+
this.claimHandler = offererOrData.claimHandler;
|
|
83
|
+
this.payOut = offererOrData.payOut;
|
|
84
|
+
this.payIn = offererOrData.payIn;
|
|
85
|
+
this.reputation = offererOrData.reputation;
|
|
86
|
+
this.sequence = offererOrData.sequence == null ? null : BigInt(offererOrData.sequence);
|
|
87
|
+
this.claimData = offererOrData.claimData;
|
|
88
|
+
this.refundData = offererOrData.refundData;
|
|
89
|
+
this.amount = offererOrData.amount == null ? null : BigInt(offererOrData.amount);
|
|
90
|
+
this.feeToken = offererOrData.feeToken;
|
|
91
|
+
this.securityDeposit = offererOrData.securityDeposit == null ? null : BigInt(offererOrData.securityDeposit);
|
|
92
|
+
this.claimerBounty = offererOrData.claimerBounty == null ? null : BigInt(offererOrData.claimerBounty);
|
|
93
|
+
this.kind = offererOrData.kind;
|
|
94
|
+
this.extraData = offererOrData.extraData;
|
|
95
|
+
this.successAction = offererOrData.successAction;
|
|
96
|
+
}
|
|
97
|
+
//For now we disallow usage of success actions
|
|
98
|
+
if (this.successAction.length > 0)
|
|
99
|
+
throw new Error("Success actions are not supported yet!");
|
|
100
|
+
}
|
|
101
|
+
getOfferer() {
|
|
102
|
+
return this.offerer;
|
|
103
|
+
}
|
|
104
|
+
setOfferer(newOfferer) {
|
|
105
|
+
this.offerer = newOfferer;
|
|
106
|
+
this.payIn = true;
|
|
107
|
+
}
|
|
108
|
+
getClaimer() {
|
|
109
|
+
return this.claimer;
|
|
110
|
+
}
|
|
111
|
+
setClaimer(newClaimer) {
|
|
112
|
+
this.claimer = newClaimer;
|
|
113
|
+
this.payIn = false;
|
|
114
|
+
this.payOut = true;
|
|
115
|
+
this.reputation = false;
|
|
116
|
+
}
|
|
117
|
+
serialize() {
|
|
118
|
+
return {
|
|
119
|
+
type: "strk",
|
|
120
|
+
offerer: this.offerer,
|
|
121
|
+
claimer: this.claimer,
|
|
122
|
+
token: this.token,
|
|
123
|
+
refundHandler: this.refundHandler,
|
|
124
|
+
claimHandler: this.claimHandler,
|
|
125
|
+
payOut: this.payOut,
|
|
126
|
+
payIn: this.payIn,
|
|
127
|
+
reputation: this.reputation,
|
|
128
|
+
sequence: this.sequence == null ? null : this.sequence.toString(10),
|
|
129
|
+
claimData: this.claimData,
|
|
130
|
+
refundData: this.refundData,
|
|
131
|
+
amount: this.amount == null ? null : this.amount.toString(10),
|
|
132
|
+
feeToken: this.feeToken,
|
|
133
|
+
securityDeposit: this.securityDeposit == null ? null : this.securityDeposit.toString(10),
|
|
134
|
+
claimerBounty: this.claimerBounty == null ? null : this.claimerBounty.toString(10),
|
|
135
|
+
kind: this.kind,
|
|
136
|
+
extraData: this.extraData,
|
|
137
|
+
successAction: this.successAction
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
getAmount() {
|
|
141
|
+
return this.amount;
|
|
142
|
+
}
|
|
143
|
+
getToken() {
|
|
144
|
+
return this.token;
|
|
145
|
+
}
|
|
146
|
+
isToken(token) {
|
|
147
|
+
return this.token.toLowerCase() === token.toLowerCase();
|
|
148
|
+
}
|
|
149
|
+
getType() {
|
|
150
|
+
return this.kind;
|
|
151
|
+
}
|
|
152
|
+
getExpiry() {
|
|
153
|
+
return TimelockRefundHandler_1.TimelockRefundHandler.getExpiry(this);
|
|
154
|
+
}
|
|
155
|
+
isPayIn() {
|
|
156
|
+
return this.payIn;
|
|
157
|
+
}
|
|
158
|
+
isPayOut() {
|
|
159
|
+
return this.payOut;
|
|
160
|
+
}
|
|
161
|
+
getEscrowHash() {
|
|
162
|
+
const amountValue = starknet_1.cairo.uint256("0x" + this.amount.toString(16));
|
|
163
|
+
const securityDepositValue = starknet_1.cairo.uint256("0x" + this.securityDeposit.toString(16));
|
|
164
|
+
const claimerBountyValue = starknet_1.cairo.uint256("0x" + this.claimerBounty.toString(16));
|
|
165
|
+
let escrowHash = starknet_1.hash.computePoseidonHashOnElements([
|
|
166
|
+
this.offerer,
|
|
167
|
+
this.claimer,
|
|
168
|
+
this.token,
|
|
169
|
+
this.refundHandler,
|
|
170
|
+
this.claimHandler,
|
|
171
|
+
this.getFlags(),
|
|
172
|
+
this.claimData,
|
|
173
|
+
this.refundData,
|
|
174
|
+
amountValue.low,
|
|
175
|
+
amountValue.high,
|
|
176
|
+
this.feeToken,
|
|
177
|
+
securityDepositValue.low,
|
|
178
|
+
securityDepositValue.high,
|
|
179
|
+
claimerBountyValue.low,
|
|
180
|
+
claimerBountyValue.high,
|
|
181
|
+
...serializeContractCalls(this.successAction, []).slice(1) //Remove length prefix
|
|
182
|
+
]);
|
|
183
|
+
if (escrowHash.startsWith("0x"))
|
|
184
|
+
escrowHash = escrowHash.slice(2);
|
|
185
|
+
return escrowHash.padStart(64, "0");
|
|
186
|
+
}
|
|
187
|
+
getClaimHash() {
|
|
188
|
+
let hash = this.claimData;
|
|
189
|
+
if (hash.startsWith("0x"))
|
|
190
|
+
hash = hash.slice(2);
|
|
191
|
+
return hash.padStart(64, "0");
|
|
192
|
+
}
|
|
193
|
+
getSequence() {
|
|
194
|
+
return this.sequence;
|
|
195
|
+
}
|
|
196
|
+
getConfirmationsHint() {
|
|
197
|
+
if (this.extraData == null)
|
|
198
|
+
return null;
|
|
199
|
+
if (this.extraData.length != 84)
|
|
200
|
+
return null;
|
|
201
|
+
return parseInt(this.extraData.slice(80), 16);
|
|
202
|
+
}
|
|
203
|
+
getNonceHint() {
|
|
204
|
+
if (this.extraData == null)
|
|
205
|
+
return null;
|
|
206
|
+
if (this.extraData.length != 84)
|
|
207
|
+
return null;
|
|
208
|
+
return BigInt("0x" + this.extraData.slice(64, 80));
|
|
209
|
+
}
|
|
210
|
+
getTxoHashHint() {
|
|
211
|
+
if (this.extraData == null)
|
|
212
|
+
return null;
|
|
213
|
+
if (this.extraData.length != 84)
|
|
214
|
+
return null;
|
|
215
|
+
return this.extraData.slice(0, 64);
|
|
216
|
+
}
|
|
217
|
+
getExtraData() {
|
|
218
|
+
return this.extraData;
|
|
219
|
+
}
|
|
220
|
+
setExtraData(extraData) {
|
|
221
|
+
this.extraData = extraData;
|
|
222
|
+
}
|
|
223
|
+
getSecurityDeposit() {
|
|
224
|
+
return this.securityDeposit;
|
|
225
|
+
}
|
|
226
|
+
getClaimerBounty() {
|
|
227
|
+
return this.claimerBounty;
|
|
228
|
+
}
|
|
229
|
+
getTotalDeposit() {
|
|
230
|
+
return this.claimerBounty < this.securityDeposit ? this.securityDeposit : this.claimerBounty;
|
|
231
|
+
}
|
|
232
|
+
getDepositToken() {
|
|
233
|
+
return this.feeToken;
|
|
234
|
+
}
|
|
235
|
+
isDepositToken(token) {
|
|
236
|
+
if (!token.startsWith("0x"))
|
|
237
|
+
token = "0x" + token;
|
|
238
|
+
return (0, Utils_1.toHex)(this.feeToken) === (0, Utils_1.toHex)(token);
|
|
239
|
+
}
|
|
240
|
+
isClaimer(address) {
|
|
241
|
+
if (!address.startsWith("0x"))
|
|
242
|
+
address = "0x" + address;
|
|
243
|
+
return (0, Utils_1.toHex)(this.claimer) === (0, Utils_1.toHex)(address);
|
|
244
|
+
}
|
|
245
|
+
isOfferer(address) {
|
|
246
|
+
if (!address.startsWith("0x"))
|
|
247
|
+
address = "0x" + address;
|
|
248
|
+
return (0, Utils_1.toHex)(this.offerer) === (0, Utils_1.toHex)(address);
|
|
249
|
+
}
|
|
250
|
+
isRefundHandler(address) {
|
|
251
|
+
if (!address.startsWith("0x"))
|
|
252
|
+
address = "0x" + address;
|
|
253
|
+
return (0, Utils_1.toHex)(this.refundHandler) === (0, Utils_1.toHex)(address);
|
|
254
|
+
}
|
|
255
|
+
isClaimHandler(address) {
|
|
256
|
+
if (!address.startsWith("0x"))
|
|
257
|
+
address = "0x" + address;
|
|
258
|
+
return (0, Utils_1.toHex)(this.claimHandler) === (0, Utils_1.toHex)(address);
|
|
259
|
+
}
|
|
260
|
+
isClaimData(data) {
|
|
261
|
+
if (!data.startsWith("0x"))
|
|
262
|
+
data = "0x" + data;
|
|
263
|
+
return (0, Utils_1.toHex)(this.claimData) === (0, Utils_1.toHex)(data);
|
|
264
|
+
}
|
|
265
|
+
equals(other) {
|
|
266
|
+
return other.offerer.toLowerCase() === this.offerer.toLowerCase() &&
|
|
267
|
+
other.claimer.toLowerCase() === this.claimer.toLowerCase() &&
|
|
268
|
+
other.token.toLowerCase() === this.token.toLowerCase() &&
|
|
269
|
+
other.refundHandler.toLowerCase() === this.refundHandler.toLowerCase() &&
|
|
270
|
+
other.claimHandler.toLowerCase() === this.claimHandler.toLowerCase() &&
|
|
271
|
+
other.payIn === this.payIn &&
|
|
272
|
+
other.payOut === this.payOut &&
|
|
273
|
+
other.reputation === this.reputation &&
|
|
274
|
+
this.sequence === other.sequence &&
|
|
275
|
+
other.claimData.toLowerCase() === this.claimData.toLowerCase() &&
|
|
276
|
+
other.refundData.toLowerCase() === this.refundData.toLowerCase() &&
|
|
277
|
+
other.amount === this.amount &&
|
|
278
|
+
other.securityDeposit === this.securityDeposit &&
|
|
279
|
+
other.claimerBounty === this.claimerBounty;
|
|
280
|
+
}
|
|
281
|
+
toEscrowStruct() {
|
|
282
|
+
return {
|
|
283
|
+
offerer: this.offerer,
|
|
284
|
+
claimer: this.claimer,
|
|
285
|
+
token: this.token,
|
|
286
|
+
refund_handler: this.refundHandler,
|
|
287
|
+
claim_handler: this.claimHandler,
|
|
288
|
+
flags: this.getFlags(),
|
|
289
|
+
claim_data: this.claimData,
|
|
290
|
+
refund_data: this.refundData,
|
|
291
|
+
amount: starknet_1.cairo.uint256((0, Utils_1.toBigInt)(this.amount)),
|
|
292
|
+
fee_token: this.feeToken,
|
|
293
|
+
security_deposit: starknet_1.cairo.uint256((0, Utils_1.toBigInt)(this.securityDeposit)),
|
|
294
|
+
claimer_bounty: starknet_1.cairo.uint256((0, Utils_1.toBigInt)(this.claimerBounty)),
|
|
295
|
+
success_action: this.successAction
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
static fromSerializedFeltArray(span, claimHandlerImpl) {
|
|
299
|
+
const offerer = (0, Utils_1.toHex)(span.shift());
|
|
300
|
+
const claimer = (0, Utils_1.toHex)(span.shift());
|
|
301
|
+
const token = (0, Utils_1.toHex)(span.shift());
|
|
302
|
+
const refundHandler = (0, Utils_1.toHex)(span.shift());
|
|
303
|
+
const claimHandler = (0, Utils_1.toHex)(span.shift());
|
|
304
|
+
const { payOut, payIn, reputation, sequence } = StarknetSwapData.toFlags(span.shift());
|
|
305
|
+
const claimData = (0, Utils_1.toHex)(span.shift());
|
|
306
|
+
const refundData = (0, Utils_1.toHex)(span.shift());
|
|
307
|
+
const amount = (0, Utils_1.toBigInt)({ low: span.shift(), high: span.shift() });
|
|
308
|
+
const feeToken = (0, Utils_1.toHex)(span.shift());
|
|
309
|
+
const securityDeposit = (0, Utils_1.toBigInt)({ low: span.shift(), high: span.shift() });
|
|
310
|
+
const claimerBounty = (0, Utils_1.toBigInt)({ low: span.shift(), high: span.shift() });
|
|
311
|
+
const successActions = deserializeContractCalls(span);
|
|
312
|
+
return new StarknetSwapData(offerer, claimer, token, refundHandler, claimHandler, payOut, payIn, reputation, sequence, claimData, refundData, amount, feeToken, securityDeposit, claimerBounty, claimHandlerImpl.getType(), null, successActions);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
exports.StarknetSwapData = StarknetSwapData;
|
|
316
|
+
base_1.SwapData.deserializers["strk"] = StarknetSwapData;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { StarknetModule } from "../base/StarknetModule";
|
|
2
|
+
import { StarknetSwapContract } from "./StarknetSwapContract";
|
|
3
|
+
import { TypedContractV2 } from "starknet";
|
|
4
|
+
import { EscrowManagerAbi } from "./EscrowManagerAbi";
|
|
5
|
+
export declare class StarknetSwapModule extends StarknetModule {
|
|
6
|
+
readonly root: StarknetSwapContract;
|
|
7
|
+
readonly contract: TypedContractV2<typeof EscrowManagerAbi>;
|
|
8
|
+
constructor(root: StarknetSwapContract);
|
|
9
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StarknetSwapModule = void 0;
|
|
4
|
+
const StarknetModule_1 = require("../base/StarknetModule");
|
|
5
|
+
class StarknetSwapModule extends StarknetModule_1.StarknetModule {
|
|
6
|
+
constructor(root) {
|
|
7
|
+
super(root);
|
|
8
|
+
this.root = root;
|
|
9
|
+
this.contract = root.contract;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.StarknetSwapModule = StarknetSwapModule;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { StarknetSwapData } from "../StarknetSwapData";
|
|
2
|
+
import { BigNumberish } from "starknet";
|
|
3
|
+
import { StarknetGas } from "../../base/StarknetAction";
|
|
4
|
+
import { StarknetTx } from "../../base/modules/StarknetTransactions";
|
|
5
|
+
export interface IHandler<TCommitmentData, TWitnessData> {
|
|
6
|
+
readonly address: string;
|
|
7
|
+
getCommitment(data: TCommitmentData): BigNumberish;
|
|
8
|
+
getWitness(signer: string, data: StarknetSwapData, witnessData: TWitnessData, feeRate?: string): Promise<{
|
|
9
|
+
initialTxns: StarknetTx[];
|
|
10
|
+
witness: BigNumberish[];
|
|
11
|
+
}>;
|
|
12
|
+
getGas(data: StarknetSwapData): StarknetGas;
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ChainSwapType } from "@atomiqlabs/base";
|
|
2
|
+
import { StarknetGas } from "../../../base/StarknetAction";
|
|
3
|
+
import { IHandler } from "../IHandler";
|
|
4
|
+
import { BigNumberish } from "starknet";
|
|
5
|
+
export interface IClaimHandler<C, W> extends IHandler<C, W> {
|
|
6
|
+
getType(): ChainSwapType;
|
|
7
|
+
parseWitnessResult(result: BigNumberish[]): string;
|
|
8
|
+
}
|
|
9
|
+
export type ClaimHandlerType = {
|
|
10
|
+
gas: StarknetGas;
|
|
11
|
+
type: ChainSwapType;
|
|
12
|
+
} & (new (address: string) => IClaimHandler<any, any>);
|
|
13
|
+
export declare const claimHandlersList: ClaimHandlerType[];
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.claimHandlersList = void 0;
|
|
4
|
+
const HashlockClaimHandler_1 = require("./HashlockClaimHandler");
|
|
5
|
+
const BitcoinTxIdClaimHandler_1 = require("./btc/BitcoinTxIdClaimHandler");
|
|
6
|
+
const BitcoinOutputClaimHandler_1 = require("./btc/BitcoinOutputClaimHandler");
|
|
7
|
+
const BitcoinNoncedOutputClaimHandler_1 = require("./btc/BitcoinNoncedOutputClaimHandler");
|
|
8
|
+
exports.claimHandlersList = [
|
|
9
|
+
HashlockClaimHandler_1.HashlockClaimHandler,
|
|
10
|
+
BitcoinTxIdClaimHandler_1.BitcoinTxIdClaimHandler,
|
|
11
|
+
BitcoinOutputClaimHandler_1.BitcoinOutputClaimHandler,
|
|
12
|
+
BitcoinNoncedOutputClaimHandler_1.BitcoinNoncedOutputClaimHandler
|
|
13
|
+
];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { StarknetSwapData } from "../../StarknetSwapData";
|
|
3
|
+
import { BigNumberish } from "starknet";
|
|
4
|
+
import { ChainSwapType } from "@atomiqlabs/base";
|
|
5
|
+
import { StarknetGas } from "../../../base/StarknetAction";
|
|
6
|
+
import { Buffer } from "buffer";
|
|
7
|
+
import { StarknetTx } from "../../../base/modules/StarknetTransactions";
|
|
8
|
+
import { IClaimHandler } from "./ClaimHandlers";
|
|
9
|
+
export declare class HashlockClaimHandler implements IClaimHandler<Buffer, string> {
|
|
10
|
+
readonly address: string;
|
|
11
|
+
static readonly type: ChainSwapType;
|
|
12
|
+
static readonly gas: StarknetGas;
|
|
13
|
+
constructor(address: string);
|
|
14
|
+
getCommitment(data: Buffer): BigNumberish;
|
|
15
|
+
getWitness(signer: string, data: StarknetSwapData, witnessData: string): Promise<{
|
|
16
|
+
initialTxns: StarknetTx[];
|
|
17
|
+
witness: BigNumberish[];
|
|
18
|
+
}>;
|
|
19
|
+
getGas(): StarknetGas;
|
|
20
|
+
getType(): ChainSwapType;
|
|
21
|
+
parseWitnessResult(result: BigNumberish[]): string;
|
|
22
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HashlockClaimHandler = void 0;
|
|
4
|
+
const Utils_1 = require("../../../../utils/Utils");
|
|
5
|
+
const starknet_1 = require("starknet");
|
|
6
|
+
const base_1 = require("@atomiqlabs/base");
|
|
7
|
+
const buffer_1 = require("buffer");
|
|
8
|
+
const createHash = require("create-hash");
|
|
9
|
+
class HashlockClaimHandler {
|
|
10
|
+
constructor(address) {
|
|
11
|
+
this.address = address;
|
|
12
|
+
}
|
|
13
|
+
getCommitment(data) {
|
|
14
|
+
if (data.length !== 32)
|
|
15
|
+
throw new Error("Invalid swap hash");
|
|
16
|
+
return starknet_1.hash.computePoseidonHashOnElements((0, Utils_1.bufferToU32Array)(data));
|
|
17
|
+
}
|
|
18
|
+
getWitness(signer, data, witnessData) {
|
|
19
|
+
if (!data.isClaimHandler(this.address))
|
|
20
|
+
throw new Error("Invalid claim handler");
|
|
21
|
+
if (witnessData.length !== 64)
|
|
22
|
+
throw new Error("Invalid hash secret: string length");
|
|
23
|
+
const buffer = buffer_1.Buffer.from(witnessData, "hex");
|
|
24
|
+
if (buffer.length !== 32)
|
|
25
|
+
throw new Error("Invalid hash secret: buff length");
|
|
26
|
+
const witnessSha256 = createHash("sha256").update(buffer).digest();
|
|
27
|
+
if (!data.isClaimData((0, Utils_1.toHex)(this.getCommitment(witnessSha256))))
|
|
28
|
+
throw new Error("Invalid hash secret: poseidon hash doesn't match");
|
|
29
|
+
const witnessArray = (0, Utils_1.bufferToU32Array)(buffer);
|
|
30
|
+
return Promise.resolve({ initialTxns: [], witness: witnessArray });
|
|
31
|
+
}
|
|
32
|
+
getGas() {
|
|
33
|
+
return HashlockClaimHandler.gas;
|
|
34
|
+
}
|
|
35
|
+
getType() {
|
|
36
|
+
return HashlockClaimHandler.type;
|
|
37
|
+
}
|
|
38
|
+
parseWitnessResult(result) {
|
|
39
|
+
return (0, Utils_1.u32ArrayToBuffer)(result).toString("hex");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.HashlockClaimHandler = HashlockClaimHandler;
|
|
43
|
+
HashlockClaimHandler.type = base_1.ChainSwapType.HTLC;
|
|
44
|
+
HashlockClaimHandler.gas = { l1: 750 };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { StarknetSwapData } from "../../../StarknetSwapData";
|
|
3
|
+
import { StarknetGas } from "../../../../base/StarknetAction";
|
|
4
|
+
import { ChainSwapType } from "@atomiqlabs/base";
|
|
5
|
+
import { BigNumberish } from "starknet";
|
|
6
|
+
import { StarknetTx } from "../../../../base/modules/StarknetTransactions";
|
|
7
|
+
import { BitcoinCommitmentData, IBitcoinClaimHandler } from "./IBitcoinClaimHandler";
|
|
8
|
+
import { BitcoinOutputWitnessData } from "./BitcoinOutputClaimHandler";
|
|
9
|
+
import { Buffer } from "buffer";
|
|
10
|
+
export type BitcoinNoncedOutputCommitmentData = {
|
|
11
|
+
output: Buffer;
|
|
12
|
+
amount: bigint;
|
|
13
|
+
nonce: bigint;
|
|
14
|
+
};
|
|
15
|
+
export declare class BitcoinNoncedOutputClaimHandler extends IBitcoinClaimHandler<BitcoinNoncedOutputCommitmentData, BitcoinOutputWitnessData> {
|
|
16
|
+
static readonly type: ChainSwapType;
|
|
17
|
+
static readonly gas: StarknetGas;
|
|
18
|
+
protected serializeCommitment(data: BitcoinNoncedOutputCommitmentData & BitcoinCommitmentData): BigNumberish[];
|
|
19
|
+
getWitness(signer: string, swapData: StarknetSwapData, witnessData: BitcoinOutputWitnessData, feeRate?: string): Promise<{
|
|
20
|
+
initialTxns: StarknetTx[];
|
|
21
|
+
witness: BigNumberish[];
|
|
22
|
+
}>;
|
|
23
|
+
getGas(data: StarknetSwapData): StarknetGas;
|
|
24
|
+
getType(): ChainSwapType;
|
|
25
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BitcoinNoncedOutputClaimHandler = void 0;
|
|
4
|
+
const base_1 = require("@atomiqlabs/base");
|
|
5
|
+
const starknet_1 = require("starknet");
|
|
6
|
+
const Utils_1 = require("../../../../../utils/Utils");
|
|
7
|
+
const IBitcoinClaimHandler_1 = require("./IBitcoinClaimHandler");
|
|
8
|
+
const btc_signer_1 = require("@scure/btc-signer");
|
|
9
|
+
const buffer_1 = require("buffer");
|
|
10
|
+
const logger = (0, Utils_1.getLogger)("BitcoinNoncedOutputClaimHandler: ");
|
|
11
|
+
function getTransactionNonce(btcTx) {
|
|
12
|
+
const locktimeSub500M = BigInt(btcTx.lockTime - 500000000);
|
|
13
|
+
if (locktimeSub500M < 0n)
|
|
14
|
+
throw new Error("Locktime too low!");
|
|
15
|
+
const nSequence = BigInt(btcTx.getInput(0).sequence);
|
|
16
|
+
return (locktimeSub500M << 24n) | (nSequence & 0x00ffffffn);
|
|
17
|
+
}
|
|
18
|
+
class BitcoinNoncedOutputClaimHandler extends IBitcoinClaimHandler_1.IBitcoinClaimHandler {
|
|
19
|
+
serializeCommitment(data) {
|
|
20
|
+
return [
|
|
21
|
+
starknet_1.hash.computePoseidonHashOnElements([(0, Utils_1.toBigInt)(data.nonce), (0, Utils_1.toBigInt)(data.amount), (0, Utils_1.poseidonHashRange)(data.output)]),
|
|
22
|
+
...super.serializeCommitment(data)
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
async getWitness(signer, swapData, witnessData, feeRate) {
|
|
26
|
+
if (!swapData.isClaimHandler(this.address))
|
|
27
|
+
throw new Error("Invalid claim handler");
|
|
28
|
+
const parsedBtcTx = btc_signer_1.Transaction.fromRaw(buffer_1.Buffer.from(witnessData.tx.hex, "hex"));
|
|
29
|
+
const out = parsedBtcTx.getOutput(witnessData.vout);
|
|
30
|
+
const { initialTxns, witness } = await this._getWitness(signer, swapData, witnessData, {
|
|
31
|
+
output: buffer_1.Buffer.from(out.script),
|
|
32
|
+
amount: out.amount,
|
|
33
|
+
nonce: getTransactionNonce(parsedBtcTx)
|
|
34
|
+
});
|
|
35
|
+
witness.push(...(0, Utils_1.bufferToByteArray)(buffer_1.Buffer.from(witnessData.tx.hex, "hex")));
|
|
36
|
+
witness.push(BigInt(witnessData.vout));
|
|
37
|
+
return { initialTxns, witness };
|
|
38
|
+
}
|
|
39
|
+
getGas(data) {
|
|
40
|
+
return BitcoinNoncedOutputClaimHandler.gas;
|
|
41
|
+
}
|
|
42
|
+
getType() {
|
|
43
|
+
return BitcoinNoncedOutputClaimHandler.type;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.BitcoinNoncedOutputClaimHandler = BitcoinNoncedOutputClaimHandler;
|
|
47
|
+
BitcoinNoncedOutputClaimHandler.type = base_1.ChainSwapType.CHAIN_NONCED;
|
|
48
|
+
BitcoinNoncedOutputClaimHandler.gas = { l1: 20000 };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { StarknetSwapData } from "../../../StarknetSwapData";
|
|
3
|
+
import { StarknetGas } from "../../../../base/StarknetAction";
|
|
4
|
+
import { ChainSwapType } from "@atomiqlabs/base";
|
|
5
|
+
import { BigNumberish } from "starknet";
|
|
6
|
+
import { StarknetTx } from "../../../../base/modules/StarknetTransactions";
|
|
7
|
+
import { BitcoinCommitmentData, BitcoinWitnessData, IBitcoinClaimHandler } from "./IBitcoinClaimHandler";
|
|
8
|
+
import { Buffer } from "buffer";
|
|
9
|
+
export type BitcoinOutputCommitmentData = {
|
|
10
|
+
output: Buffer;
|
|
11
|
+
amount: bigint;
|
|
12
|
+
};
|
|
13
|
+
export type BitcoinOutputWitnessData = BitcoinWitnessData & {
|
|
14
|
+
vout: number;
|
|
15
|
+
};
|
|
16
|
+
export declare class BitcoinOutputClaimHandler extends IBitcoinClaimHandler<BitcoinOutputCommitmentData, BitcoinOutputWitnessData> {
|
|
17
|
+
static readonly type: ChainSwapType;
|
|
18
|
+
static readonly gas: StarknetGas;
|
|
19
|
+
protected serializeCommitment(data: BitcoinOutputCommitmentData & BitcoinCommitmentData): BigNumberish[];
|
|
20
|
+
getWitness(signer: string, swapData: StarknetSwapData, witnessData: BitcoinOutputWitnessData, feeRate?: string): Promise<{
|
|
21
|
+
initialTxns: StarknetTx[];
|
|
22
|
+
witness: BigNumberish[];
|
|
23
|
+
}>;
|
|
24
|
+
getGas(data: StarknetSwapData): StarknetGas;
|
|
25
|
+
getType(): ChainSwapType;
|
|
26
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BitcoinOutputClaimHandler = void 0;
|
|
4
|
+
const base_1 = require("@atomiqlabs/base");
|
|
5
|
+
const starknet_1 = require("starknet");
|
|
6
|
+
const Utils_1 = require("../../../../../utils/Utils");
|
|
7
|
+
const IBitcoinClaimHandler_1 = require("./IBitcoinClaimHandler");
|
|
8
|
+
const btc_signer_1 = require("@scure/btc-signer");
|
|
9
|
+
const buffer_1 = require("buffer");
|
|
10
|
+
const logger = (0, Utils_1.getLogger)("BitcoinOutputClaimHandler: ");
|
|
11
|
+
class BitcoinOutputClaimHandler extends IBitcoinClaimHandler_1.IBitcoinClaimHandler {
|
|
12
|
+
serializeCommitment(data) {
|
|
13
|
+
return [
|
|
14
|
+
starknet_1.hash.computePoseidonHashOnElements([(0, Utils_1.toBigInt)(data.amount), (0, Utils_1.poseidonHashRange)(data.output)]),
|
|
15
|
+
...super.serializeCommitment(data)
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
async getWitness(signer, swapData, witnessData, feeRate) {
|
|
19
|
+
if (!swapData.isClaimHandler(this.address))
|
|
20
|
+
throw new Error("Invalid claim handler");
|
|
21
|
+
const parsedBtcTx = btc_signer_1.Transaction.fromRaw(buffer_1.Buffer.from(witnessData.tx.hex, "hex"));
|
|
22
|
+
const out = parsedBtcTx.getOutput(witnessData.vout);
|
|
23
|
+
const { initialTxns, witness } = await this._getWitness(signer, swapData, witnessData, {
|
|
24
|
+
output: buffer_1.Buffer.from(out.script),
|
|
25
|
+
amount: out.amount
|
|
26
|
+
});
|
|
27
|
+
witness.push(...(0, Utils_1.bufferToByteArray)(buffer_1.Buffer.from(witnessData.tx.hex, "hex")));
|
|
28
|
+
witness.push(BigInt(witnessData.vout));
|
|
29
|
+
return { initialTxns, witness };
|
|
30
|
+
}
|
|
31
|
+
getGas(data) {
|
|
32
|
+
return BitcoinOutputClaimHandler.gas;
|
|
33
|
+
}
|
|
34
|
+
getType() {
|
|
35
|
+
return BitcoinOutputClaimHandler.type;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.BitcoinOutputClaimHandler = BitcoinOutputClaimHandler;
|
|
39
|
+
BitcoinOutputClaimHandler.type = base_1.ChainSwapType.CHAIN;
|
|
40
|
+
BitcoinOutputClaimHandler.gas = { l1: 20000 };
|