@defuse-protocol/intents-sdk 0.58.0 → 0.58.1
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.
|
@@ -54,8 +54,68 @@ function validateAddress(address, blockchain) {
|
|
|
54
54
|
function validateEthAddress(address) {
|
|
55
55
|
return (0, viem.isAddress)(address, { strict: true });
|
|
56
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Validates Bitcoin mainnet addresses. Supported types:
|
|
59
|
+
*
|
|
60
|
+
* Base58Check (legacy):
|
|
61
|
+
* - P2PKH starts with 1 version 0x00 e.g. 1A1zP1eP...
|
|
62
|
+
* - P2SH starts with 3 version 0x05 e.g. 3J98t1Wp...
|
|
63
|
+
*
|
|
64
|
+
* Bech32 (native SegWit v0):
|
|
65
|
+
* - P2WPKH bc1q 42 chars 20-byte witness program
|
|
66
|
+
* - P2WSH bc1q 62 chars 32-byte witness program
|
|
67
|
+
*
|
|
68
|
+
* Bech32m (native SegWit v1+):
|
|
69
|
+
* - P2TR bc1p 62 chars 32-byte witness program (Taproot)
|
|
70
|
+
*/
|
|
57
71
|
function validateBtcAddress(address) {
|
|
58
|
-
|
|
72
|
+
try {
|
|
73
|
+
if (address.toLowerCase().startsWith("bc1")) return validateBtcBech32Address(address);
|
|
74
|
+
return validateBtcBase58Address(address);
|
|
75
|
+
} catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function validateBtcBase58Address(address) {
|
|
80
|
+
const decoded = _scure_base.base58.decode(address);
|
|
81
|
+
if (decoded.length !== 25) return false;
|
|
82
|
+
const version = decoded[0];
|
|
83
|
+
if (version !== 0 && version !== 5) return false;
|
|
84
|
+
const payload = decoded.subarray(0, 21);
|
|
85
|
+
const checksum = decoded.subarray(21, 25);
|
|
86
|
+
const expectedChecksum = (0, _noble_hashes_sha2.sha256)((0, _noble_hashes_sha2.sha256)(payload)).subarray(0, 4);
|
|
87
|
+
for (let i = 0; i < 4; i++) if (checksum[i] !== expectedChecksum[i]) return false;
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
function validateBtcBech32Address(address) {
|
|
91
|
+
let decoded;
|
|
92
|
+
let isBech32m = false;
|
|
93
|
+
try {
|
|
94
|
+
decoded = _scure_base.bech32.decode(address);
|
|
95
|
+
} catch {
|
|
96
|
+
try {
|
|
97
|
+
decoded = _scure_base.bech32m.decode(address);
|
|
98
|
+
isBech32m = true;
|
|
99
|
+
} catch {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (decoded.prefix.toLowerCase() !== "bc") return false;
|
|
104
|
+
const { words } = decoded;
|
|
105
|
+
if (!words || words.length < 1) return false;
|
|
106
|
+
const witnessVersion = words[0];
|
|
107
|
+
if (witnessVersion === void 0 || witnessVersion < 0 || witnessVersion > 16) return false;
|
|
108
|
+
const progLen = _scure_base.bech32.fromWords(words.slice(1)).length;
|
|
109
|
+
if (progLen < 2 || progLen > 40) return false;
|
|
110
|
+
if (witnessVersion === 0) {
|
|
111
|
+
if (isBech32m) return false;
|
|
112
|
+
return progLen === 20 || progLen === 32;
|
|
113
|
+
}
|
|
114
|
+
if (witnessVersion === 1) {
|
|
115
|
+
if (!isBech32m) return false;
|
|
116
|
+
return progLen === 32;
|
|
117
|
+
}
|
|
118
|
+
return false;
|
|
59
119
|
}
|
|
60
120
|
/**
|
|
61
121
|
* Validates Bitcoin Cash addresses
|
|
@@ -53,8 +53,68 @@ function validateAddress(address, blockchain) {
|
|
|
53
53
|
function validateEthAddress(address) {
|
|
54
54
|
return isAddress(address, { strict: true });
|
|
55
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Validates Bitcoin mainnet addresses. Supported types:
|
|
58
|
+
*
|
|
59
|
+
* Base58Check (legacy):
|
|
60
|
+
* - P2PKH starts with 1 version 0x00 e.g. 1A1zP1eP...
|
|
61
|
+
* - P2SH starts with 3 version 0x05 e.g. 3J98t1Wp...
|
|
62
|
+
*
|
|
63
|
+
* Bech32 (native SegWit v0):
|
|
64
|
+
* - P2WPKH bc1q 42 chars 20-byte witness program
|
|
65
|
+
* - P2WSH bc1q 62 chars 32-byte witness program
|
|
66
|
+
*
|
|
67
|
+
* Bech32m (native SegWit v1+):
|
|
68
|
+
* - P2TR bc1p 62 chars 32-byte witness program (Taproot)
|
|
69
|
+
*/
|
|
56
70
|
function validateBtcAddress(address) {
|
|
57
|
-
|
|
71
|
+
try {
|
|
72
|
+
if (address.toLowerCase().startsWith("bc1")) return validateBtcBech32Address(address);
|
|
73
|
+
return validateBtcBase58Address(address);
|
|
74
|
+
} catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function validateBtcBase58Address(address) {
|
|
79
|
+
const decoded = base58.decode(address);
|
|
80
|
+
if (decoded.length !== 25) return false;
|
|
81
|
+
const version = decoded[0];
|
|
82
|
+
if (version !== 0 && version !== 5) return false;
|
|
83
|
+
const payload = decoded.subarray(0, 21);
|
|
84
|
+
const checksum = decoded.subarray(21, 25);
|
|
85
|
+
const expectedChecksum = sha256(sha256(payload)).subarray(0, 4);
|
|
86
|
+
for (let i = 0; i < 4; i++) if (checksum[i] !== expectedChecksum[i]) return false;
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
function validateBtcBech32Address(address) {
|
|
90
|
+
let decoded;
|
|
91
|
+
let isBech32m = false;
|
|
92
|
+
try {
|
|
93
|
+
decoded = bech32.decode(address);
|
|
94
|
+
} catch {
|
|
95
|
+
try {
|
|
96
|
+
decoded = bech32m.decode(address);
|
|
97
|
+
isBech32m = true;
|
|
98
|
+
} catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (decoded.prefix.toLowerCase() !== "bc") return false;
|
|
103
|
+
const { words } = decoded;
|
|
104
|
+
if (!words || words.length < 1) return false;
|
|
105
|
+
const witnessVersion = words[0];
|
|
106
|
+
if (witnessVersion === void 0 || witnessVersion < 0 || witnessVersion > 16) return false;
|
|
107
|
+
const progLen = bech32.fromWords(words.slice(1)).length;
|
|
108
|
+
if (progLen < 2 || progLen > 40) return false;
|
|
109
|
+
if (witnessVersion === 0) {
|
|
110
|
+
if (isBech32m) return false;
|
|
111
|
+
return progLen === 20 || progLen === 32;
|
|
112
|
+
}
|
|
113
|
+
if (witnessVersion === 1) {
|
|
114
|
+
if (!isBech32m) return false;
|
|
115
|
+
return progLen === 32;
|
|
116
|
+
}
|
|
117
|
+
return false;
|
|
58
118
|
}
|
|
59
119
|
/**
|
|
60
120
|
* Validates Bitcoin Cash addresses
|