@gobob/bob-sdk 1.3.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/gateway/client.d.ts +45 -0
- package/dist/gateway/client.js +127 -0
- package/dist/gateway/client.js.map +1 -0
- package/dist/gateway/index.d.ts +2 -0
- package/dist/gateway/index.js +6 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/tokens.d.ts +12 -0
- package/dist/gateway/tokens.js +64 -0
- package/dist/gateway/tokens.js.map +1 -0
- package/dist/gateway/types.d.ts +17 -0
- package/dist/gateway/types.js +3 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/scripts/relay-genesis.d.ts +1 -0
- package/dist/scripts/relay-genesis.js +120 -0
- package/dist/scripts/relay-genesis.js.map +1 -0
- package/dist/scripts/relay-retarget.d.ts +1 -0
- package/dist/scripts/relay-retarget.js +115 -0
- package/dist/scripts/relay-retarget.js.map +1 -0
- package/package.json +11 -10
- package/dist/gateway.d.ts +0 -30
- package/dist/gateway.js +0 -56
- package/dist/gateway.js.map +0 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { GatewayQuoteParams } from "./types";
|
|
2
|
+
import { Token as TokenInfo } from "./tokens";
|
|
3
|
+
type EvmAddress = string;
|
|
4
|
+
type GatewayQuote = {
|
|
5
|
+
gatewayAddress: EvmAddress;
|
|
6
|
+
dustThreshold: number;
|
|
7
|
+
satoshis: number;
|
|
8
|
+
fee: number;
|
|
9
|
+
gratuity: string;
|
|
10
|
+
bitcoinAddress: string;
|
|
11
|
+
txProofDifficultyFactor: number;
|
|
12
|
+
strategyAddress: EvmAddress | null;
|
|
13
|
+
};
|
|
14
|
+
type GatewayOrderResponse = {
|
|
15
|
+
gatewayAddress: EvmAddress;
|
|
16
|
+
tokenAddress: EvmAddress;
|
|
17
|
+
txid: string;
|
|
18
|
+
status: boolean;
|
|
19
|
+
timestamp: number;
|
|
20
|
+
tokens: string;
|
|
21
|
+
satoshis: number;
|
|
22
|
+
fee: number;
|
|
23
|
+
txProofDifficultyFactor: number;
|
|
24
|
+
};
|
|
25
|
+
type GatewayCreateOrderResponse = {
|
|
26
|
+
uuid: string;
|
|
27
|
+
opReturnHash: string;
|
|
28
|
+
};
|
|
29
|
+
type GatewayStartOrderResult = GatewayCreateOrderResponse & {
|
|
30
|
+
bitcoinAddress: string;
|
|
31
|
+
satoshis: number;
|
|
32
|
+
};
|
|
33
|
+
export declare const MAINNET_GATEWAY_BASE_URL = "https://gateway-api-mainnet.gobob.xyz";
|
|
34
|
+
export declare const TESTNET_GATEWAY_BASE_URL = "https://gateway-api-testnet.gobob.xyz";
|
|
35
|
+
export declare class GatewayApiClient {
|
|
36
|
+
private baseUrl;
|
|
37
|
+
constructor(networkOrUrl?: string);
|
|
38
|
+
getQuote(params: GatewayQuoteParams): Promise<GatewayQuote>;
|
|
39
|
+
startOrder(gatewayQuote: GatewayQuote, params: GatewayQuoteParams): Promise<GatewayStartOrderResult>;
|
|
40
|
+
finalizeOrder(orderUuid: string, bitcoinTx: string): Promise<void>;
|
|
41
|
+
getOrders(userAddress: EvmAddress): Promise<GatewayOrderResponse[]>;
|
|
42
|
+
getTokens(): Promise<EvmAddress[]>;
|
|
43
|
+
getTokensInfo(): Promise<TokenInfo[]>;
|
|
44
|
+
}
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GatewayApiClient = exports.TESTNET_GATEWAY_BASE_URL = exports.MAINNET_GATEWAY_BASE_URL = void 0;
|
|
4
|
+
const ethers_1 = require("ethers");
|
|
5
|
+
const tokens_1 = require("./tokens");
|
|
6
|
+
exports.MAINNET_GATEWAY_BASE_URL = "https://gateway-api-mainnet.gobob.xyz";
|
|
7
|
+
exports.TESTNET_GATEWAY_BASE_URL = "https://gateway-api-testnet.gobob.xyz";
|
|
8
|
+
class GatewayApiClient {
|
|
9
|
+
constructor(networkOrUrl = "mainnet") {
|
|
10
|
+
switch (networkOrUrl) {
|
|
11
|
+
case "mainnet" || "bob":
|
|
12
|
+
this.baseUrl = exports.MAINNET_GATEWAY_BASE_URL;
|
|
13
|
+
break;
|
|
14
|
+
case "testnet" || "bob-sepolia":
|
|
15
|
+
this.baseUrl = exports.TESTNET_GATEWAY_BASE_URL;
|
|
16
|
+
break;
|
|
17
|
+
default:
|
|
18
|
+
this.baseUrl = networkOrUrl;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async getQuote(params) {
|
|
22
|
+
const isMainnet = params.toChain == "bob" || params.toChain == 60808;
|
|
23
|
+
let outputToken = "";
|
|
24
|
+
if (params.toToken.startsWith("0x")) {
|
|
25
|
+
outputToken = params.toToken;
|
|
26
|
+
}
|
|
27
|
+
else if (params.toToken in tokens_1.TOKENS_INFO) {
|
|
28
|
+
outputToken = isMainnet ? tokens_1.TOKENS_INFO[params.toToken].bob : tokens_1.TOKENS_INFO[params.toToken].bobSepolia;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
throw new Error('Unknown output token');
|
|
32
|
+
}
|
|
33
|
+
const atomicAmount = params.amount;
|
|
34
|
+
const response = await fetch(`${this.baseUrl}/quote/${outputToken}/${atomicAmount || ''}`, {
|
|
35
|
+
headers: {
|
|
36
|
+
'Content-Type': 'application/json',
|
|
37
|
+
Accept: 'application/json'
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
return await response.json();
|
|
41
|
+
}
|
|
42
|
+
async startOrder(gatewayQuote, params) {
|
|
43
|
+
const request = {
|
|
44
|
+
gatewayAddress: gatewayQuote.gatewayAddress,
|
|
45
|
+
strategyAddress: gatewayQuote.strategyAddress,
|
|
46
|
+
satsToConvertToEth: params.gasRefill,
|
|
47
|
+
userAddress: params.toUserAddress,
|
|
48
|
+
gatewayExtraData: null,
|
|
49
|
+
strategyExtraData: null,
|
|
50
|
+
satoshis: gatewayQuote.satoshis,
|
|
51
|
+
};
|
|
52
|
+
const response = await fetch(`${this.baseUrl}/order`, {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
headers: {
|
|
55
|
+
'Content-Type': 'application/json',
|
|
56
|
+
Accept: 'application/json'
|
|
57
|
+
},
|
|
58
|
+
body: JSON.stringify(request)
|
|
59
|
+
});
|
|
60
|
+
if (!response.ok) {
|
|
61
|
+
throw new Error('Failed to create order');
|
|
62
|
+
}
|
|
63
|
+
const data = await response.json();
|
|
64
|
+
if (data.opReturnHash != calculateOpReturnHash(request)) {
|
|
65
|
+
throw new Error('Invalid OP_RETURN hash');
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
uuid: data.uuid,
|
|
69
|
+
opReturnHash: data.opReturnHash,
|
|
70
|
+
bitcoinAddress: gatewayQuote.bitcoinAddress,
|
|
71
|
+
satoshis: gatewayQuote.satoshis,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async finalizeOrder(orderUuid, bitcoinTx) {
|
|
75
|
+
const response = await fetch(`${this.baseUrl}/order/${orderUuid}`, {
|
|
76
|
+
method: 'PATCH',
|
|
77
|
+
headers: {
|
|
78
|
+
'Content-Type': 'application/json',
|
|
79
|
+
Accept: 'application/json'
|
|
80
|
+
},
|
|
81
|
+
body: JSON.stringify({ bitcoinTx: bitcoinTx })
|
|
82
|
+
});
|
|
83
|
+
if (!response.ok) {
|
|
84
|
+
throw new Error('Failed to update order');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async getOrders(userAddress) {
|
|
88
|
+
const response = await fetch(`${this.baseUrl}/orders/${userAddress}`, {
|
|
89
|
+
method: 'GET',
|
|
90
|
+
headers: {
|
|
91
|
+
'Content-Type': 'application/json',
|
|
92
|
+
Accept: 'application/json'
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
return response.json();
|
|
96
|
+
}
|
|
97
|
+
async getTokens() {
|
|
98
|
+
const response = await fetch(`${this.baseUrl}/tokens`, {
|
|
99
|
+
method: 'GET',
|
|
100
|
+
headers: {
|
|
101
|
+
'Content-Type': 'application/json',
|
|
102
|
+
Accept: 'application/json'
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
return response.json();
|
|
106
|
+
}
|
|
107
|
+
async getTokensInfo() {
|
|
108
|
+
const tokens = await this.getTokens();
|
|
109
|
+
return tokens
|
|
110
|
+
.map(token => tokens_1.ADDRESS_LOOKUP[token])
|
|
111
|
+
.filter(token => token !== undefined);
|
|
112
|
+
;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.GatewayApiClient = GatewayApiClient;
|
|
116
|
+
function calculateOpReturnHash(req) {
|
|
117
|
+
const abiCoder = new ethers_1.AbiCoder();
|
|
118
|
+
return ethers_1.ethers.keccak256(abiCoder.encode(["address", "address", "uint256", "address", "bytes", "bytes"], [
|
|
119
|
+
req.gatewayAddress,
|
|
120
|
+
req.strategyAddress || ethers_1.ethers.ZeroAddress,
|
|
121
|
+
req.satsToConvertToEth,
|
|
122
|
+
req.userAddress,
|
|
123
|
+
req.gatewayExtraData,
|
|
124
|
+
req.strategyExtraData
|
|
125
|
+
]));
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/gateway/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GatewaySDK = void 0;
|
|
4
|
+
var client_1 = require("./client");
|
|
5
|
+
Object.defineProperty(exports, "GatewaySDK", { enumerable: true, get: function () { return client_1.GatewayApiClient; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":";;;AAAA,mCAA0D;AAAjD,oGAAA,gBAAgB,OAAc"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ADDRESS_LOOKUP = exports.TOKENS_INFO = void 0;
|
|
4
|
+
const TOKENS = {
|
|
5
|
+
"tBTC": {
|
|
6
|
+
name: "tBTC v2",
|
|
7
|
+
symbol: "tBTC",
|
|
8
|
+
bob: "0xBBa2eF945D523C4e2608C9E1214C2Cc64D4fc2e2",
|
|
9
|
+
bobSepolia: "0x6744bAbDf02DCF578EA173A9F0637771A9e1c4d0",
|
|
10
|
+
},
|
|
11
|
+
"WBTC": {
|
|
12
|
+
name: "Wrapped BTC",
|
|
13
|
+
symbol: "WBTC",
|
|
14
|
+
bob: "0x03C7054BCB39f7b2e5B2c7AcB37583e32D70Cfa3",
|
|
15
|
+
bobSepolia: "0xe51e40e15e6e1496a0981f90Ca1D632545bdB519",
|
|
16
|
+
},
|
|
17
|
+
"sbtBTC": {
|
|
18
|
+
name: "sb tBTC v2",
|
|
19
|
+
symbol: "sbtBTC",
|
|
20
|
+
bob: "0x2925dF9Eb2092B53B06A06353A7249aF3a8B139e",
|
|
21
|
+
bobSepolia: "",
|
|
22
|
+
},
|
|
23
|
+
"sbWBTC": {
|
|
24
|
+
name: "sb Wrapped BTC",
|
|
25
|
+
symbol: "sbWBTC",
|
|
26
|
+
bob: "0x5c46D274ed8AbCAe2964B63c0360ad3Ccc384dAa",
|
|
27
|
+
bobSepolia: "",
|
|
28
|
+
},
|
|
29
|
+
"seTBTC": {
|
|
30
|
+
name: "Segment TBTC",
|
|
31
|
+
symbol: "seTBTC",
|
|
32
|
+
bob: "0xD30288EA9873f376016A0250433b7eA375676077",
|
|
33
|
+
bobSepolia: "",
|
|
34
|
+
},
|
|
35
|
+
"seWBTC": {
|
|
36
|
+
name: "Segment WBTC",
|
|
37
|
+
symbol: "seWBTC",
|
|
38
|
+
bob: "0x6265C05158f672016B771D6Fb7422823ed2CbcDd",
|
|
39
|
+
bobSepolia: "",
|
|
40
|
+
},
|
|
41
|
+
"stmtBTC": {
|
|
42
|
+
name: "Staked mtBTC",
|
|
43
|
+
symbol: "stmtBTC",
|
|
44
|
+
bob: "",
|
|
45
|
+
bobSepolia: "0xc4229678b65e2D9384FDf96F2E5D512d6eeC0C77",
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
exports.TOKENS_INFO = {};
|
|
49
|
+
exports.ADDRESS_LOOKUP = {};
|
|
50
|
+
for (const key in exports.TOKENS_INFO) {
|
|
51
|
+
const token = TOKENS[key];
|
|
52
|
+
const lowerBob = token.bob.toLowerCase();
|
|
53
|
+
const lowerBobSepolia = token.bobSepolia.toLowerCase();
|
|
54
|
+
const lowercasedToken = {
|
|
55
|
+
name: token.name,
|
|
56
|
+
symbol: token.symbol,
|
|
57
|
+
bob: lowerBob,
|
|
58
|
+
bobSepolia: lowerBobSepolia,
|
|
59
|
+
};
|
|
60
|
+
exports.TOKENS_INFO[key] = lowercasedToken;
|
|
61
|
+
exports.ADDRESS_LOOKUP[lowerBob] = lowercasedToken;
|
|
62
|
+
exports.ADDRESS_LOOKUP[lowerBobSepolia] = lowercasedToken;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/gateway/tokens.ts"],"names":[],"mappings":";;;AAOA,MAAM,MAAM,GAA6B;IACrC,MAAM,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,4CAA4C;QACjD,UAAU,EAAE,4CAA4C;KAC3D;IACD,MAAM,EAAE;QACJ,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,4CAA4C;QACjD,UAAU,EAAE,4CAA4C;KAC3D;IACD,QAAQ,EAAE;QACN,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE,4CAA4C;QACjD,UAAU,EAAE,EAAE;KACjB;IACD,QAAQ,EAAE;QACN,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE,4CAA4C;QACjD,UAAU,EAAE,EAAE;KACjB;IACD,QAAQ,EAAE;QACN,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE,4CAA4C;QACjD,UAAU,EAAE,EAAE;KACjB;IACD,QAAQ,EAAE;QACN,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE,4CAA4C;QACjD,UAAU,EAAE,EAAE;KACjB;IACD,SAAS,EAAE;QACP,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,SAAS;QACjB,GAAG,EAAE,EAAE;QACP,UAAU,EAAE,4CAA4C;KAC3D;CACJ,CAAC;AAEW,QAAA,WAAW,GAA6B,EAAE,CAAC;AAC3C,QAAA,cAAc,GAAiC,EAAE,CAAC;AAE/D,KAAK,MAAM,GAAG,IAAI,mBAAW,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAE1B,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;IAEvD,MAAM,eAAe,GAAU;QAC3B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG,EAAE,QAAQ;QACb,UAAU,EAAE,eAAe;KAC9B,CAAC;IAEF,mBAAW,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC;IACnC,sBAAc,CAAC,QAAQ,CAAC,GAAG,eAAe,CAAC;IAC3C,sBAAc,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
type ChainSlug = string | number;
|
|
2
|
+
type TokenSymbol = string;
|
|
3
|
+
export interface GatewayQuoteParams {
|
|
4
|
+
fromChain: ChainSlug;
|
|
5
|
+
toChain: ChainSlug;
|
|
6
|
+
fromToken: TokenSymbol;
|
|
7
|
+
toToken: TokenSymbol;
|
|
8
|
+
fromUserAddress: string;
|
|
9
|
+
toUserAddress: string;
|
|
10
|
+
amount: number | string;
|
|
11
|
+
maxSlippage?: number;
|
|
12
|
+
affiliateId?: string;
|
|
13
|
+
type?: 'swap' | 'deposit' | 'withdraw' | 'claim';
|
|
14
|
+
fee?: number;
|
|
15
|
+
gasRefill?: number;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/gateway/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const esplora_1 = require("../esplora");
|
|
7
|
+
const yargs_1 = __importDefault(require("yargs"));
|
|
8
|
+
const helpers_1 = require("yargs/helpers");
|
|
9
|
+
const node_child_process_1 = require("node:child_process");
|
|
10
|
+
const args = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
11
|
+
.option("init-height", {
|
|
12
|
+
description: "Height of the bitcoin chain to initialize the relay at",
|
|
13
|
+
demandOption: true,
|
|
14
|
+
})
|
|
15
|
+
.option("private-key", {
|
|
16
|
+
description: "Private key to submit with",
|
|
17
|
+
type: "string",
|
|
18
|
+
})
|
|
19
|
+
.option("dev", {
|
|
20
|
+
description: "Deploy the contracts locally",
|
|
21
|
+
type: "boolean",
|
|
22
|
+
})
|
|
23
|
+
.option("testnet", {
|
|
24
|
+
description: "Use the testnet relay contract which can override the difficulty",
|
|
25
|
+
type: "boolean",
|
|
26
|
+
})
|
|
27
|
+
.option("proof-length", {
|
|
28
|
+
description: "The default proof length for retargets",
|
|
29
|
+
type: "number",
|
|
30
|
+
default: 1,
|
|
31
|
+
})
|
|
32
|
+
.option("network", {
|
|
33
|
+
description: "Bitcoin network to use",
|
|
34
|
+
type: "string",
|
|
35
|
+
demandOption: true,
|
|
36
|
+
})
|
|
37
|
+
.option("rpc-url", {
|
|
38
|
+
description: "ETH RPC URL",
|
|
39
|
+
type: "string",
|
|
40
|
+
})
|
|
41
|
+
.option("verifier-url", {
|
|
42
|
+
description: "Verifier URL",
|
|
43
|
+
type: "string",
|
|
44
|
+
})
|
|
45
|
+
.argv;
|
|
46
|
+
main().catch((err) => {
|
|
47
|
+
console.log("Error thrown by script:");
|
|
48
|
+
console.log(err);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
});
|
|
51
|
+
function range(size, startAt = 0) {
|
|
52
|
+
return [...Array(size).keys()].map(i => i + startAt);
|
|
53
|
+
}
|
|
54
|
+
async function getRetargetHeaders(esploraClient, nextRetargetHeight, proofLength) {
|
|
55
|
+
const beforeRetarget = await Promise.all(range(proofLength, nextRetargetHeight - proofLength).map(height => esploraClient.getBlockHeaderAt(height)));
|
|
56
|
+
const afterRetarget = await Promise.all(range(proofLength, nextRetargetHeight).map(height => esploraClient.getBlockHeaderAt(height)));
|
|
57
|
+
return beforeRetarget.concat(afterRetarget).join("");
|
|
58
|
+
}
|
|
59
|
+
async function main() {
|
|
60
|
+
const esploraClient = new esplora_1.DefaultEsploraClient(args["network"]);
|
|
61
|
+
let initHeight = args["init-height"];
|
|
62
|
+
if (initHeight == "latest") {
|
|
63
|
+
const currentHeight = await esploraClient.getLatestHeight();
|
|
64
|
+
initHeight = currentHeight - (currentHeight % 2016) - 2016;
|
|
65
|
+
console.log(`Using block ${initHeight}`);
|
|
66
|
+
}
|
|
67
|
+
if ((initHeight % 2016) != 0) {
|
|
68
|
+
throw new Error("Invalid genesis height: must be multiple of 2016");
|
|
69
|
+
}
|
|
70
|
+
const genesis = await esploraClient.getBlockHeaderAt(initHeight);
|
|
71
|
+
const proofLength = args["proof-length"];
|
|
72
|
+
const nextRetargetHeight = initHeight + 2016;
|
|
73
|
+
console.log(`Next retarget height: ${nextRetargetHeight}`);
|
|
74
|
+
const retargetHeaders = await getRetargetHeaders(esploraClient, nextRetargetHeight, proofLength);
|
|
75
|
+
let rpcUrl;
|
|
76
|
+
let verifyOpts;
|
|
77
|
+
if (args["dev"]) {
|
|
78
|
+
rpcUrl = "http://localhost:8545";
|
|
79
|
+
}
|
|
80
|
+
else if (args["rpc-url"] == "testnet") {
|
|
81
|
+
rpcUrl = "https://bob-sepolia.rpc.gobob.xyz/";
|
|
82
|
+
verifyOpts = "--verify --verifier blockscout --verifier-url 'https://bob-sepolia.explorer.gobob.xyz/api'";
|
|
83
|
+
}
|
|
84
|
+
else if (args["rpc-url"] == "mainnet") {
|
|
85
|
+
rpcUrl = "https://rpc.gobob.xyz/";
|
|
86
|
+
verifyOpts = "--verify --verifier blockscout --verifier-url 'https://explorer.gobob.xyz/api'";
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
rpcUrl = args["rpc-url"];
|
|
90
|
+
verifyOpts = `--verify --verifier blockscout --verifier-url ${args["verifier-url"]}`;
|
|
91
|
+
}
|
|
92
|
+
let privateKey;
|
|
93
|
+
if (args["private-key"]) {
|
|
94
|
+
privateKey = args["private-key"];
|
|
95
|
+
}
|
|
96
|
+
else if (args["dev"]) {
|
|
97
|
+
privateKey = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
throw new Error("No private key");
|
|
101
|
+
}
|
|
102
|
+
let env = [
|
|
103
|
+
`GENESIS_PROOF_LENGTH=${proofLength}`,
|
|
104
|
+
`GENESIS_HEIGHT=${initHeight}`,
|
|
105
|
+
`GENESIS_HEADER=${genesis}`,
|
|
106
|
+
`RETARGET_HEADERS=${retargetHeaders}`,
|
|
107
|
+
`PRIVATE_KEY=${privateKey}`,
|
|
108
|
+
];
|
|
109
|
+
if (args["testnet"]) {
|
|
110
|
+
env.push("TESTNET=true");
|
|
111
|
+
}
|
|
112
|
+
(0, node_child_process_1.exec)(`${env.join(" ")} forge script ../script/RelayGenesis.s.sol:RelayGenesisScript --rpc-url '${rpcUrl}' ${verifyOpts} --broadcast --priority-gas-price 1`, { maxBuffer: 1024 * 5000 }, (err, stdout, stderr) => {
|
|
113
|
+
if (err) {
|
|
114
|
+
throw new Error(`Failed to run command: ${err}`);
|
|
115
|
+
}
|
|
116
|
+
console.log(`stdout: ${stdout}`);
|
|
117
|
+
console.log(`stderr: ${stderr}`);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=relay-genesis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-genesis.js","sourceRoot":"","sources":["../../src/scripts/relay-genesis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const esplora_1 = require("../esplora");
|
|
7
|
+
const yargs_1 = __importDefault(require("yargs"));
|
|
8
|
+
const helpers_1 = require("yargs/helpers");
|
|
9
|
+
const node_child_process_1 = require("node:child_process");
|
|
10
|
+
const args = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
11
|
+
.env('RELAY')
|
|
12
|
+
.option("private-key", {
|
|
13
|
+
description: "Private key to submit with",
|
|
14
|
+
type: "string",
|
|
15
|
+
})
|
|
16
|
+
.option("dev", {
|
|
17
|
+
description: "Deploy the contracts locally",
|
|
18
|
+
type: "boolean",
|
|
19
|
+
})
|
|
20
|
+
.option("network", {
|
|
21
|
+
description: "Bitcoin network to use",
|
|
22
|
+
type: "string",
|
|
23
|
+
demandOption: true,
|
|
24
|
+
})
|
|
25
|
+
.option("rpc-url", {
|
|
26
|
+
description: "ETH RPC URL",
|
|
27
|
+
type: "string",
|
|
28
|
+
})
|
|
29
|
+
.option("relay-address", {
|
|
30
|
+
description: "Relay address",
|
|
31
|
+
type: "string",
|
|
32
|
+
demandOption: true,
|
|
33
|
+
})
|
|
34
|
+
.argv;
|
|
35
|
+
main().catch((err) => {
|
|
36
|
+
console.log("Error thrown by script:");
|
|
37
|
+
console.log(err);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
});
|
|
40
|
+
function range(size, startAt = 0) {
|
|
41
|
+
return [...Array(size).keys()].map(i => i + startAt);
|
|
42
|
+
}
|
|
43
|
+
async function getRetargetHeaders(esploraClient, nextRetargetHeight, proofLength) {
|
|
44
|
+
const beforeRetarget = await Promise.all(range(proofLength, nextRetargetHeight - proofLength).map(height => esploraClient.getBlockHeaderAt(height)));
|
|
45
|
+
const afterRetarget = await Promise.all(range(proofLength, nextRetargetHeight).map(height => esploraClient.getBlockHeaderAt(height)));
|
|
46
|
+
return beforeRetarget.concat(afterRetarget).join("");
|
|
47
|
+
}
|
|
48
|
+
async function main() {
|
|
49
|
+
const esploraClient = new esplora_1.DefaultEsploraClient(args["network"]);
|
|
50
|
+
let privateKey;
|
|
51
|
+
if (args["private-key"]) {
|
|
52
|
+
privateKey = args["private-key"];
|
|
53
|
+
}
|
|
54
|
+
else if (args["dev"]) {
|
|
55
|
+
privateKey = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
throw new Error("No private key");
|
|
59
|
+
}
|
|
60
|
+
const relayAddress = args["relay-address"];
|
|
61
|
+
let rpcUrl;
|
|
62
|
+
if (args["dev"]) {
|
|
63
|
+
rpcUrl = "http://localhost:8545";
|
|
64
|
+
}
|
|
65
|
+
else if (args["rpc-url"] == "testnet") {
|
|
66
|
+
rpcUrl = "https://bob-sepolia.rpc.gobob.xyz/";
|
|
67
|
+
}
|
|
68
|
+
else if (args["rpc-url"] == "mainnet") {
|
|
69
|
+
rpcUrl = "https://rpc.gobob.xyz/";
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
rpcUrl = args["rpc-url"];
|
|
73
|
+
}
|
|
74
|
+
const currentEpoch = await new Promise((resolve, reject) => {
|
|
75
|
+
(0, node_child_process_1.exec)(`cast call ${relayAddress} "currentEpoch() (uint256)" --rpc-url '${rpcUrl}'`, (err, stdout, _stderr) => {
|
|
76
|
+
if (err)
|
|
77
|
+
reject(`Failed to run command: ${err}`);
|
|
78
|
+
resolve(Number.parseInt(stdout));
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
console.log(`Current epoch: ${currentEpoch}`);
|
|
82
|
+
const proofLength = await new Promise((resolve, reject) => {
|
|
83
|
+
(0, node_child_process_1.exec)(`cast call ${relayAddress} "proofLength() (uint256)" --rpc-url '${rpcUrl}'`, (err, stdout, _stderr) => {
|
|
84
|
+
if (err)
|
|
85
|
+
reject(`Failed to run command: ${err}`);
|
|
86
|
+
resolve(Number.parseInt(stdout));
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
console.log(`Proof length: ${proofLength}`);
|
|
90
|
+
const nextEpoch = currentEpoch + 1;
|
|
91
|
+
const nextRetargetHeight = nextEpoch * 2016;
|
|
92
|
+
console.log(`Next epoch: ${nextEpoch}`);
|
|
93
|
+
console.log(`Next retarget height: ${nextRetargetHeight}`);
|
|
94
|
+
try {
|
|
95
|
+
await esploraClient.getBlockHash(nextRetargetHeight + proofLength);
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
console.log(`Cannot retarget without ${proofLength} headers after ${nextRetargetHeight}. Exiting.`);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const retargetHeaders = await getRetargetHeaders(esploraClient, nextRetargetHeight, proofLength);
|
|
102
|
+
let env = {
|
|
103
|
+
'RELAY_ADDRESS': relayAddress,
|
|
104
|
+
'RETARGET_HEADERS': retargetHeaders,
|
|
105
|
+
'PRIVATE_KEY': privateKey,
|
|
106
|
+
};
|
|
107
|
+
(0, node_child_process_1.exec)(`forge script ../script/RelayRetarget.s.sol:RelayRetargetScript --rpc-url '${rpcUrl}' --broadcast --priority-gas-price 1`, { env: { ...process.env, ...env } }, (err, stdout, stderr) => {
|
|
108
|
+
if (err) {
|
|
109
|
+
throw new Error(`Failed to run command: ${err}`);
|
|
110
|
+
}
|
|
111
|
+
console.log(`stdout: ${stdout}`);
|
|
112
|
+
console.log(`stderr: ${stderr}`);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=relay-retarget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-retarget.js","sourceRoot":"","sources":["../../src/scripts/relay-retarget.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gobob/bob-sdk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"test": "vitest run test/*.ts",
|
|
8
|
-
"deploy-relay": "ts-node scripts/relay-genesis.ts",
|
|
9
|
-
"update-relay": "ts-node scripts/relay-retarget.ts",
|
|
8
|
+
"deploy-relay": "ts-node src/scripts/relay-genesis.ts",
|
|
9
|
+
"update-relay": "ts-node src/scripts/relay-retarget.ts",
|
|
10
10
|
"build": "tsc -p tsconfig.json"
|
|
11
11
|
},
|
|
12
12
|
"files": [
|
|
@@ -18,20 +18,21 @@
|
|
|
18
18
|
"README.md"
|
|
19
19
|
],
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@types/node": "^
|
|
22
|
-
"@types/yargs": "^17.0.
|
|
21
|
+
"@types/node": "^22.0.0",
|
|
22
|
+
"@types/yargs": "^17.0.33",
|
|
23
23
|
"ecpair": "^2.1.0",
|
|
24
|
-
"mocha": "^10.3
|
|
24
|
+
"mocha": "^10.7.3",
|
|
25
25
|
"tiny-secp256k1": "^2.2.3",
|
|
26
26
|
"ts-node": "^10.0.0",
|
|
27
|
-
"typescript": "^5.4
|
|
28
|
-
"vitest": "^
|
|
27
|
+
"typescript": "^5.5.4",
|
|
28
|
+
"vitest": "^2.0.5",
|
|
29
29
|
"yargs": "^17.5.1"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@scure/base": "^1.1.7",
|
|
33
33
|
"@scure/btc-signer": "^1.3.2",
|
|
34
34
|
"bitcoin-address-validation": "^2.2.3",
|
|
35
|
-
"bitcoinjs-lib": "^6.1.6"
|
|
35
|
+
"bitcoinjs-lib": "^6.1.6",
|
|
36
|
+
"ethers": "^6.13.2"
|
|
36
37
|
}
|
|
37
|
-
}
|
|
38
|
+
}
|
package/dist/gateway.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
export type EvmAddress = string;
|
|
2
|
-
type GatewayQuote = {
|
|
3
|
-
onramp_address: EvmAddress;
|
|
4
|
-
dust_threshold: number;
|
|
5
|
-
satoshis: number;
|
|
6
|
-
fee: number;
|
|
7
|
-
gratuity: string;
|
|
8
|
-
bitcoin_address: string;
|
|
9
|
-
tx_proof_difficulty_factor: number;
|
|
10
|
-
};
|
|
11
|
-
type GatewayOrderResponse = {
|
|
12
|
-
onramp_address: EvmAddress;
|
|
13
|
-
token_address: EvmAddress;
|
|
14
|
-
txid: string;
|
|
15
|
-
status: boolean;
|
|
16
|
-
timestamp: number;
|
|
17
|
-
tokens: string;
|
|
18
|
-
satoshis: number;
|
|
19
|
-
fee: number;
|
|
20
|
-
tx_proof_difficulty_factor: number;
|
|
21
|
-
};
|
|
22
|
-
export declare class GatewayApiClient {
|
|
23
|
-
private baseUrl;
|
|
24
|
-
constructor(baseUrl: string);
|
|
25
|
-
getQuote(address: string, atomicAmount?: number | string): Promise<GatewayQuote>;
|
|
26
|
-
createOrder(contractAddress: string, userAddress: EvmAddress, atomicAmount: number | string): Promise<string>;
|
|
27
|
-
updateOrder(id: string, tx: string): Promise<void>;
|
|
28
|
-
getOrders(userAddress: EvmAddress): Promise<GatewayOrderResponse[]>;
|
|
29
|
-
}
|
|
30
|
-
export {};
|
package/dist/gateway.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GatewayApiClient = void 0;
|
|
4
|
-
class GatewayApiClient {
|
|
5
|
-
constructor(baseUrl) {
|
|
6
|
-
this.baseUrl = baseUrl;
|
|
7
|
-
}
|
|
8
|
-
async getQuote(address, atomicAmount) {
|
|
9
|
-
const response = await fetch(`${this.baseUrl}/quote/${address}/${atomicAmount || ''}`, {
|
|
10
|
-
headers: {
|
|
11
|
-
'Content-Type': 'application/json',
|
|
12
|
-
Accept: 'application/json'
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
return await response.json();
|
|
16
|
-
}
|
|
17
|
-
async createOrder(contractAddress, userAddress, atomicAmount) {
|
|
18
|
-
const response = await fetch(`${this.baseUrl}/order`, {
|
|
19
|
-
method: 'POST',
|
|
20
|
-
headers: {
|
|
21
|
-
'Content-Type': 'application/json',
|
|
22
|
-
Accept: 'application/json'
|
|
23
|
-
},
|
|
24
|
-
body: JSON.stringify({ onramp_address: contractAddress, user_address: userAddress, satoshis: atomicAmount })
|
|
25
|
-
});
|
|
26
|
-
if (!response.ok) {
|
|
27
|
-
throw new Error('Failed to create order');
|
|
28
|
-
}
|
|
29
|
-
return await response.json();
|
|
30
|
-
}
|
|
31
|
-
async updateOrder(id, tx) {
|
|
32
|
-
const response = await fetch(`${this.baseUrl}/order/${id}`, {
|
|
33
|
-
method: 'PATCH',
|
|
34
|
-
headers: {
|
|
35
|
-
'Content-Type': 'application/json',
|
|
36
|
-
Accept: 'application/json'
|
|
37
|
-
},
|
|
38
|
-
body: JSON.stringify({ bitcoin_tx: tx })
|
|
39
|
-
});
|
|
40
|
-
if (!response.ok) {
|
|
41
|
-
throw new Error('Failed to update order');
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
async getOrders(userAddress) {
|
|
45
|
-
const response = await fetch(`${this.baseUrl}/orders/${userAddress}`, {
|
|
46
|
-
method: 'GET',
|
|
47
|
-
headers: {
|
|
48
|
-
'Content-Type': 'application/json',
|
|
49
|
-
Accept: 'application/json'
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
return response.json();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
exports.GatewayApiClient = GatewayApiClient;
|
|
56
|
-
//# sourceMappingURL=gateway.js.map
|
package/dist/gateway.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":";;;AAwBA,MAAa,gBAAgB;IAGzB,YAAY,OAAe;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe,EAAE,YAA8B;QAC1D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,UAAU,OAAO,IAAI,YAAY,IAAI,EAAE,EAAE,EAAE;YACnF,OAAO,EAAE;gBACL,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC7B;SACJ,CAAC,CAAC;QAEH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAGD,KAAK,CAAC,WAAW,CAAC,eAAuB,EAAE,WAAuB,EAAE,YAA6B;QAC7F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,QAAQ,EAAE;YAClD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACL,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC7B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;SAC/G,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU,EAAE,EAAU;QACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,UAAU,EAAE,EAAE,EAAE;YACxD,MAAM,EAAE,OAAO;YACf,OAAO,EAAE;gBACL,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC7B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;SAC3C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,WAAuB;QACnC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,WAAW,EAAE,EAAE;YAClE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACL,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC7B;SACJ,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;CACJ;AA9DD,4CA8DC"}
|