@gobob/bob-sdk 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esplora.d.ts +3 -15
- package/dist/esplora.js +3 -3
- package/dist/esplora.js.map +1 -1
- package/dist/gateway/client.d.ts +13 -39
- package/dist/gateway/client.js +139 -53
- package/dist/gateway/client.js.map +1 -1
- package/dist/gateway/index.d.ts +1 -1
- package/dist/gateway/tokens.d.ts +5 -8
- package/dist/gateway/tokens.js +56 -22
- package/dist/gateway/tokens.js.map +1 -1
- package/dist/gateway/types.d.ts +112 -1
- package/dist/gateway/types.js +12 -0
- package/dist/gateway/types.js.map +1 -1
- package/dist/ordinal-api/index.d.ts +3 -11
- package/dist/ordinal-api/index.js +10 -10
- package/dist/ordinal-api/index.js.map +1 -1
- package/dist/ordinals/index.js +1 -1
- package/dist/ordinals/index.js.map +1 -1
- package/dist/ordinals/reveal.js.map +1 -1
- package/dist/ordinals/signer.js +0 -1
- package/dist/ordinals/signer.js.map +1 -1
- package/dist/scripts/relay-genesis.js +6 -7
- package/dist/scripts/relay-genesis.js.map +1 -1
- package/dist/scripts/relay-retarget.js +9 -10
- package/dist/scripts/relay-retarget.js.map +1 -1
- package/dist/wallet/index.d.ts +1 -1
- package/dist/wallet/index.js +3 -1
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/inscriptions.js +4 -4
- package/dist/wallet/inscriptions.js.map +1 -1
- package/dist/wallet/utxo.d.ts +6 -6
- package/dist/wallet/utxo.js +37 -24
- package/dist/wallet/utxo.js.map +1 -1
- package/package.json +7 -3
- package/dist/wallet/address.d.ts +0 -2
- package/dist/wallet/address.js +0 -19
- package/dist/wallet/address.js.map +0 -1
package/dist/wallet/utxo.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getBtcNetwork = void 0;
|
|
4
|
-
exports.
|
|
4
|
+
exports.createBitcoinPsbt = createBitcoinPsbt;
|
|
5
5
|
exports.getInputFromUtxoAndTx = getInputFromUtxoAndTx;
|
|
6
6
|
const btc_signer_1 = require("@scure/btc-signer");
|
|
7
7
|
const base_1 = require("@scure/base");
|
|
@@ -9,82 +9,95 @@ const bitcoin_address_validation_1 = require("bitcoin-address-validation");
|
|
|
9
9
|
const esplora_1 = require("../esplora");
|
|
10
10
|
const bitcoinNetworks = {
|
|
11
11
|
mainnet: btc_signer_1.NETWORK,
|
|
12
|
-
testnet: btc_signer_1.TEST_NETWORK
|
|
12
|
+
testnet: btc_signer_1.TEST_NETWORK,
|
|
13
13
|
};
|
|
14
14
|
const getBtcNetwork = (name) => {
|
|
15
15
|
return bitcoinNetworks[name];
|
|
16
16
|
};
|
|
17
17
|
exports.getBtcNetwork = getBtcNetwork;
|
|
18
|
-
async function
|
|
19
|
-
const
|
|
18
|
+
async function createBitcoinPsbt(fromAddress, toAddress, amount, publicKey, opReturnData, confirmationTarget = 3) {
|
|
19
|
+
const addressInfo = (0, bitcoin_address_validation_1.getAddressInfo)(fromAddress);
|
|
20
|
+
const network = addressInfo.network;
|
|
21
|
+
if (network === "regtest") {
|
|
22
|
+
throw new Error("Bitcoin regtest not supported");
|
|
23
|
+
}
|
|
24
|
+
if (addressInfo.type === (bitcoin_address_validation_1.AddressType.p2sh || bitcoin_address_validation_1.AddressType.p2wsh)) {
|
|
25
|
+
if (!publicKey) {
|
|
26
|
+
throw new Error("Public key is required to spend from the selected address type");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const esploraClient = new esplora_1.EsploraClient(addressInfo.network);
|
|
20
30
|
const [confirmedUtxos, feeRate] = await Promise.all([
|
|
21
31
|
esploraClient.getAddressUtxos(fromAddress),
|
|
22
|
-
esploraClient.getFeeEstimate(confirmationTarget)
|
|
32
|
+
esploraClient.getFeeEstimate(confirmationTarget),
|
|
23
33
|
]);
|
|
24
34
|
if (confirmedUtxos.length === 0) {
|
|
25
|
-
throw new Error(
|
|
35
|
+
throw new Error("No confirmed UTXOs");
|
|
26
36
|
}
|
|
27
37
|
let possibleInputs = [];
|
|
28
38
|
await Promise.all(confirmedUtxos.map(async (utxo) => {
|
|
29
39
|
const hex = await esploraClient.getTransactionHex(utxo.txid);
|
|
30
|
-
const transaction = btc_signer_1.Transaction.fromRaw(Buffer.from(hex,
|
|
31
|
-
const input = getInputFromUtxoAndTx(network, utxo, transaction,
|
|
40
|
+
const transaction = btc_signer_1.Transaction.fromRaw(Buffer.from(hex, "hex"), { allowUnknownOutputs: true });
|
|
41
|
+
const input = getInputFromUtxoAndTx(network, utxo, transaction, addressInfo.type, publicKey);
|
|
32
42
|
possibleInputs.push(input);
|
|
33
43
|
}));
|
|
34
44
|
const outputs = [
|
|
35
45
|
{
|
|
36
46
|
address: toAddress,
|
|
37
|
-
amount: BigInt(amount)
|
|
38
|
-
}
|
|
47
|
+
amount: BigInt(amount),
|
|
48
|
+
},
|
|
39
49
|
];
|
|
40
50
|
if (opReturnData) {
|
|
41
|
-
if (opReturnData.startsWith(
|
|
51
|
+
if (opReturnData.startsWith("0x")) {
|
|
42
52
|
opReturnData = opReturnData.slice(2);
|
|
43
53
|
}
|
|
44
54
|
outputs.push({
|
|
45
|
-
script: btc_signer_1.Script.encode([
|
|
46
|
-
amount: BigInt(0)
|
|
55
|
+
script: btc_signer_1.Script.encode(["RETURN", base_1.hex.decode(opReturnData)]),
|
|
56
|
+
amount: BigInt(0),
|
|
47
57
|
});
|
|
48
58
|
}
|
|
49
|
-
const transaction = (0, btc_signer_1.selectUTXO)(possibleInputs, outputs,
|
|
59
|
+
const transaction = (0, btc_signer_1.selectUTXO)(possibleInputs, outputs, "default", {
|
|
50
60
|
changeAddress: fromAddress,
|
|
51
61
|
feePerByte: BigInt(Math.ceil(feeRate)),
|
|
52
62
|
bip69: true,
|
|
53
63
|
createTx: true,
|
|
54
64
|
network: (0, exports.getBtcNetwork)(network),
|
|
55
65
|
allowUnknownOutputs: true,
|
|
56
|
-
allowLegacyWitnessUtxo: true
|
|
66
|
+
allowLegacyWitnessUtxo: true,
|
|
57
67
|
});
|
|
58
68
|
if (!transaction || !transaction.tx) {
|
|
59
|
-
throw new Error(
|
|
69
|
+
throw new Error("Failed to create transaction. Do you have enough funds?");
|
|
60
70
|
}
|
|
61
|
-
return transaction.tx;
|
|
71
|
+
return base_1.base64.encode(transaction.tx.toPSBT(0));
|
|
62
72
|
}
|
|
63
|
-
function getInputFromUtxoAndTx(network, utxo, transaction, addressType,
|
|
73
|
+
function getInputFromUtxoAndTx(network, utxo, transaction, addressType, publicKey) {
|
|
64
74
|
const output = transaction.getOutput(utxo.vout);
|
|
65
75
|
let redeemScript = {};
|
|
66
76
|
if (addressType === bitcoin_address_validation_1.AddressType.p2sh) {
|
|
67
|
-
|
|
77
|
+
if (!publicKey) {
|
|
78
|
+
throw new Error("Bitcoin P2SH not supported without public key");
|
|
79
|
+
}
|
|
80
|
+
const inner = (0, btc_signer_1.p2wpkh)(Buffer.from(publicKey, "hex"), (0, exports.getBtcNetwork)(network));
|
|
68
81
|
redeemScript = (0, btc_signer_1.p2sh)(inner);
|
|
69
82
|
}
|
|
70
83
|
const scriptMixin = {
|
|
71
|
-
...redeemScript
|
|
84
|
+
...redeemScript,
|
|
72
85
|
};
|
|
73
86
|
const nonWitnessUtxo = {
|
|
74
|
-
nonWitnessUtxo: Buffer.from(transaction.hex,
|
|
87
|
+
nonWitnessUtxo: Buffer.from(transaction.hex, "hex"),
|
|
75
88
|
};
|
|
76
89
|
const witnessUtxo = {
|
|
77
90
|
witnessUtxo: {
|
|
78
91
|
script: output.script,
|
|
79
|
-
amount: output.amount
|
|
80
|
-
}
|
|
92
|
+
amount: output.amount,
|
|
93
|
+
},
|
|
81
94
|
};
|
|
82
95
|
const witnessMixin = transaction.hasWitnesses ? witnessUtxo : nonWitnessUtxo;
|
|
83
96
|
const input = {
|
|
84
97
|
txid: utxo.txid,
|
|
85
98
|
index: utxo.vout,
|
|
86
99
|
...scriptMixin,
|
|
87
|
-
...witnessMixin
|
|
100
|
+
...witnessMixin,
|
|
88
101
|
};
|
|
89
102
|
return input;
|
|
90
103
|
}
|
package/dist/wallet/utxo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utxo.js","sourceRoot":"","sources":["../../src/wallet/utxo.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"utxo.js","sourceRoot":"","sources":["../../src/wallet/utxo.ts"],"names":[],"mappings":";;;AA2CA,8CAoFC;AAGD,sDAkDC;AApLD,kDAAyG;AACzG,sCAA0C;AAC1C,2EAAkF;AAClF,wCAAiD;AAIjD,MAAM,eAAe,GAA+C;IAChE,OAAO,EAAE,oBAAO;IAChB,OAAO,EAAE,yBAAY;CACxB,CAAC;AAEK,MAAM,aAAa,GAAG,CAAC,IAAwB,EAAE,EAAE;IACtD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC,CAAC;AAFW,QAAA,aAAa,iBAExB;AA6BK,KAAK,UAAU,iBAAiB,CACnC,WAAmB,EACnB,SAAiB,EACjB,MAAc,EACd,SAAkB,EAClB,YAAqB,EACrB,qBAA6B,CAAC;IAE9B,MAAM,WAAW,GAAG,IAAA,2CAAc,EAAC,WAAW,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;IACpC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACrD,CAAC;IAGD,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,wCAAW,CAAC,IAAI,IAAI,wCAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACtF,CAAC;IACL,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,uBAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAI7D,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChD,aAAa,CAAC,eAAe,CAAC,WAAW,CAAC;QAC1C,aAAa,CAAC,cAAc,CAAC,kBAAkB,CAAC;KACnD,CAAC,CAAC;IAEH,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC1C,CAAC;IAGD,IAAI,cAAc,GAAY,EAAE,CAAC;IAEjC,MAAM,OAAO,CAAC,GAAG,CACb,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC9B,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,wBAAW,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;QAChG,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC7F,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,OAAO,GAAa;QACtB;YACI,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;SACzB;KACJ,CAAC;IAEF,IAAI,YAAY,EAAE,CAAC;QAEf,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC;YAET,MAAM,EAAE,mBAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,UAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;YAC3D,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;SACpB,CAAC,CAAC;IACP,CAAC;IAMD,MAAM,WAAW,GAAG,IAAA,uBAAU,EAAC,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE;QAC/D,aAAa,EAAE,WAAW;QAC1B,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAA,qBAAa,EAAC,OAAO,CAAC;QAC/B,mBAAmB,EAAE,IAAI;QACzB,sBAAsB,EAAE,IAAI;KAC/B,CAAC,CAAC;IAEH,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,aAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAGD,SAAgB,qBAAqB,CACjC,OAA2B,EAC3B,IAAU,EACV,WAAwB,EACxB,WAAwB,EACxB,SAAkB;IAIlB,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAMhD,IAAI,YAAY,GAAG,EAAE,CAAC;IAEtB,IAAI,WAAW,KAAK,wCAAW,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,KAAK,GAAG,IAAA,mBAAM,EAAC,MAAM,CAAC,IAAI,CAAC,SAAU,EAAE,KAAK,CAAC,EAAE,IAAA,qBAAa,EAAC,OAAO,CAAC,CAAC,CAAC;QAC7E,YAAY,GAAG,IAAA,iBAAI,EAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAGD,MAAM,WAAW,GAAG;QAChB,GAAG,YAAY;KAClB,CAAC;IAEF,MAAM,cAAc,GAAG;QACnB,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC;KACtD,CAAC;IACF,MAAM,WAAW,GAAG;QAChB,WAAW,EAAE;YACT,MAAM,EAAE,MAAM,CAAC,MAAO;YACtB,MAAM,EAAE,MAAM,CAAC,MAAO;SACzB;KACJ,CAAC;IACF,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC;IAG7E,MAAM,KAAK,GAAG;QACV,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,IAAI;QAChB,GAAG,WAAW;QACd,GAAG,YAAY;KAClB,CAAC;IAEF,OAAO,KAAK,CAAC;AACjB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gobob/bob-sdk",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"scripts": {
|
|
7
|
+
"format:check": "prettier --check src/**/*.ts",
|
|
8
|
+
"format:write": "prettier --write src/**/*.ts",
|
|
7
9
|
"test": "vitest run test/*.ts",
|
|
8
10
|
"deploy-relay": "ts-node src/scripts/relay-genesis.ts",
|
|
9
11
|
"update-relay": "ts-node src/scripts/relay-retarget.ts",
|
|
@@ -18,10 +20,12 @@
|
|
|
18
20
|
"README.md"
|
|
19
21
|
],
|
|
20
22
|
"devDependencies": {
|
|
21
|
-
"@types/node": "^22.
|
|
23
|
+
"@types/node": "^22.5.0",
|
|
22
24
|
"@types/yargs": "^17.0.33",
|
|
23
25
|
"ecpair": "^2.1.0",
|
|
24
26
|
"mocha": "^10.7.3",
|
|
27
|
+
"nock": "^14.0.0-beta.11",
|
|
28
|
+
"prettier": "3.3.3",
|
|
25
29
|
"tiny-secp256k1": "^2.2.3",
|
|
26
30
|
"ts-node": "^10.0.0",
|
|
27
31
|
"typescript": "^5.5.4",
|
|
@@ -35,4 +39,4 @@
|
|
|
35
39
|
"bitcoinjs-lib": "^6.1.6",
|
|
36
40
|
"ethers": "^6.13.2"
|
|
37
41
|
}
|
|
38
|
-
}
|
|
42
|
+
}
|
package/dist/wallet/address.d.ts
DELETED
package/dist/wallet/address.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isValidBtcAddress = void 0;
|
|
4
|
-
const BTC_MAINNET_REGEX = /\b([13][a-km-zA-HJ-NP-Z1-9]{25,34}|bc1[ac-hj-np-zAC-HJ-NP-Z02-9]{11,71})\b/;
|
|
5
|
-
const BTC_TESTNET_REGEX = /\b([2mn][a-km-zA-HJ-NP-Z1-9]{25,34}|tb1[ac-hj-np-zAC-HJ-NP-Z02-9]{11,71})\b/;
|
|
6
|
-
const mainnetRegex = new RegExp(BTC_MAINNET_REGEX);
|
|
7
|
-
const testnetRegex = new RegExp(BTC_TESTNET_REGEX);
|
|
8
|
-
const isValidBtcAddress = (network, address) => {
|
|
9
|
-
switch (network) {
|
|
10
|
-
case 'mainnet':
|
|
11
|
-
return mainnetRegex.test(address);
|
|
12
|
-
case 'testnet':
|
|
13
|
-
return testnetRegex.test(address);
|
|
14
|
-
default:
|
|
15
|
-
throw new Error(`Invalid bitcoin network configured: ${network}. Valid values are: mainnet | testnet.`);
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
exports.isValidBtcAddress = isValidBtcAddress;
|
|
19
|
-
//# sourceMappingURL=address.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"address.js","sourceRoot":"","sources":["../../src/wallet/address.ts"],"names":[],"mappings":";;;AAEA,MAAM,iBAAiB,GAAG,4EAA4E,CAAC;AACvG,MAAM,iBAAiB,GAAG,6EAA6E,CAAC;AAExG,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACnD,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAE5C,MAAM,iBAAiB,GAAG,CAAC,OAA2B,EAAE,OAAe,EAAW,EAAE;IACzF,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC;YACE,MAAM,IAAI,KAAK,CAAC,uCAAuC,OAAO,wCAAwC,CAAC,CAAC;IAC5G,CAAC;AACH,CAAC,CAAC;AATW,QAAA,iBAAiB,qBAS5B"}
|