lampamazaza-new-intents-sdk 0.47.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.
- package/LICENSE +21 -0
- package/README.md +1083 -0
- package/dist/_virtual/rolldown_runtime.cjs +29 -0
- package/dist/index.cjs +124 -0
- package/dist/index.d.cts +22 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +19 -0
- package/dist/src/bridges/aurora-engine-bridge/aurora-engine-bridge-constants.cjs +10 -0
- package/dist/src/bridges/aurora-engine-bridge/aurora-engine-bridge-constants.js +7 -0
- package/dist/src/bridges/aurora-engine-bridge/aurora-engine-bridge-utils.cjs +44 -0
- package/dist/src/bridges/aurora-engine-bridge/aurora-engine-bridge-utils.js +42 -0
- package/dist/src/bridges/aurora-engine-bridge/aurora-engine-bridge.cjs +111 -0
- package/dist/src/bridges/aurora-engine-bridge/aurora-engine-bridge.js +110 -0
- package/dist/src/bridges/direct-bridge/direct-bridge-constants.cjs +8 -0
- package/dist/src/bridges/direct-bridge/direct-bridge-constants.js +6 -0
- package/dist/src/bridges/direct-bridge/direct-bridge-utils.cjs +47 -0
- package/dist/src/bridges/direct-bridge/direct-bridge-utils.js +44 -0
- package/dist/src/bridges/direct-bridge/direct-bridge.cjs +155 -0
- package/dist/src/bridges/direct-bridge/direct-bridge.js +154 -0
- package/dist/src/bridges/direct-bridge/error.cjs +16 -0
- package/dist/src/bridges/direct-bridge/error.d.cts +12 -0
- package/dist/src/bridges/direct-bridge/error.d.ts +12 -0
- package/dist/src/bridges/direct-bridge/error.js +15 -0
- package/dist/src/bridges/hot-bridge/error.cjs +23 -0
- package/dist/src/bridges/hot-bridge/error.d.cts +19 -0
- package/dist/src/bridges/hot-bridge/error.d.ts +19 -0
- package/dist/src/bridges/hot-bridge/error.js +21 -0
- package/dist/src/bridges/hot-bridge/hot-bridge-chains.cjs +21 -0
- package/dist/src/bridges/hot-bridge/hot-bridge-chains.d.cts +6 -0
- package/dist/src/bridges/hot-bridge/hot-bridge-chains.d.ts +6 -0
- package/dist/src/bridges/hot-bridge/hot-bridge-chains.js +20 -0
- package/dist/src/bridges/hot-bridge/hot-bridge-constants.cjs +11 -0
- package/dist/src/bridges/hot-bridge/hot-bridge-constants.js +9 -0
- package/dist/src/bridges/hot-bridge/hot-bridge-utils.cjs +66 -0
- package/dist/src/bridges/hot-bridge/hot-bridge-utils.js +61 -0
- package/dist/src/bridges/hot-bridge/hot-bridge.cjs +241 -0
- package/dist/src/bridges/hot-bridge/hot-bridge.js +239 -0
- package/dist/src/bridges/intents-bridge/intents-bridge.cjs +59 -0
- package/dist/src/bridges/intents-bridge/intents-bridge.js +59 -0
- package/dist/src/bridges/omni-bridge/error.cjs +54 -0
- package/dist/src/bridges/omni-bridge/error.d.cts +41 -0
- package/dist/src/bridges/omni-bridge/error.d.ts +41 -0
- package/dist/src/bridges/omni-bridge/error.js +49 -0
- package/dist/src/bridges/omni-bridge/omni-bridge-constants.cjs +12 -0
- package/dist/src/bridges/omni-bridge/omni-bridge-constants.js +8 -0
- package/dist/src/bridges/omni-bridge/omni-bridge-utils.cjs +153 -0
- package/dist/src/bridges/omni-bridge/omni-bridge-utils.js +143 -0
- package/dist/src/bridges/omni-bridge/omni-bridge.cjs +316 -0
- package/dist/src/bridges/omni-bridge/omni-bridge.js +314 -0
- package/dist/src/bridges/poa-bridge/poa-bridge-utils.cjs +76 -0
- package/dist/src/bridges/poa-bridge/poa-bridge-utils.js +73 -0
- package/dist/src/bridges/poa-bridge/poa-bridge.cjs +175 -0
- package/dist/src/bridges/poa-bridge/poa-bridge.js +173 -0
- package/dist/src/bridges/poa-bridge/poa-constants.cjs +6 -0
- package/dist/src/bridges/poa-bridge/poa-constants.js +5 -0
- package/dist/src/classes/errors.cjs +87 -0
- package/dist/src/classes/errors.d.cts +48 -0
- package/dist/src/classes/errors.d.ts +48 -0
- package/dist/src/classes/errors.js +81 -0
- package/dist/src/constants/bridge-name-enum.cjs +11 -0
- package/dist/src/constants/bridge-name-enum.d.cts +11 -0
- package/dist/src/constants/bridge-name-enum.d.ts +11 -0
- package/dist/src/constants/bridge-name-enum.js +10 -0
- package/dist/src/constants/poa-tokens-routable-through-omni-bridge.cjs +17 -0
- package/dist/src/constants/poa-tokens-routable-through-omni-bridge.d.cts +12 -0
- package/dist/src/constants/poa-tokens-routable-through-omni-bridge.d.ts +12 -0
- package/dist/src/constants/poa-tokens-routable-through-omni-bridge.js +16 -0
- package/dist/src/constants/public-rpc-urls.cjs +25 -0
- package/dist/src/constants/public-rpc-urls.js +24 -0
- package/dist/src/constants/route-enum.cjs +13 -0
- package/dist/src/constants/route-enum.d.cts +13 -0
- package/dist/src/constants/route-enum.d.ts +13 -0
- package/dist/src/constants/route-enum.js +12 -0
- package/dist/src/constants/withdrawal-timing.cjs +68 -0
- package/dist/src/constants/withdrawal-timing.js +68 -0
- package/dist/src/core/withdrawal-watcher.cjs +86 -0
- package/dist/src/core/withdrawal-watcher.d.cts +18 -0
- package/dist/src/core/withdrawal-watcher.d.ts +19 -0
- package/dist/src/core/withdrawal-watcher.js +82 -0
- package/dist/src/intents/expirable-nonce.cjs +90 -0
- package/dist/src/intents/expirable-nonce.d.cts +44 -0
- package/dist/src/intents/expirable-nonce.d.ts +45 -0
- package/dist/src/intents/expirable-nonce.js +82 -0
- package/dist/src/intents/intent-executer-impl/intent-executer.cjs +85 -0
- package/dist/src/intents/intent-executer-impl/intent-executer.d.cts +20 -0
- package/dist/src/intents/intent-executer-impl/intent-executer.d.ts +24 -0
- package/dist/src/intents/intent-executer-impl/intent-executer.js +85 -0
- package/dist/src/intents/intent-hash.cjs +48 -0
- package/dist/src/intents/intent-hash.d.cts +8 -0
- package/dist/src/intents/intent-hash.d.ts +8 -0
- package/dist/src/intents/intent-hash.js +47 -0
- package/dist/src/intents/intent-hashes/erc191.cjs +38 -0
- package/dist/src/intents/intent-hashes/erc191.js +37 -0
- package/dist/src/intents/intent-hashes/nep413.cjs +23 -0
- package/dist/src/intents/intent-hashes/nep413.js +22 -0
- package/dist/src/intents/intent-hashes/raw-ed25519.cjs +26 -0
- package/dist/src/intents/intent-hashes/raw-ed25519.js +25 -0
- package/dist/src/intents/intent-hashes/sep53.cjs +36 -0
- package/dist/src/intents/intent-hashes/sep53.js +35 -0
- package/dist/src/intents/intent-hashes/tip191.cjs +39 -0
- package/dist/src/intents/intent-hashes/tip191.js +38 -0
- package/dist/src/intents/intent-hashes/ton-connect.cjs +105 -0
- package/dist/src/intents/intent-hashes/ton-connect.js +104 -0
- package/dist/src/intents/intent-hashes/webauthn.cjs +26 -0
- package/dist/src/intents/intent-hashes/webauthn.js +25 -0
- package/dist/src/intents/intent-payload-builder.cjs +208 -0
- package/dist/src/intents/intent-payload-builder.d.cts +161 -0
- package/dist/src/intents/intent-payload-builder.d.ts +161 -0
- package/dist/src/intents/intent-payload-builder.js +207 -0
- package/dist/src/intents/intent-payload-factory.cjs +23 -0
- package/dist/src/intents/intent-payload-factory.js +21 -0
- package/dist/src/intents/intent-relayer-impl/intent-relayer-public.cjs +43 -0
- package/dist/src/intents/intent-relayer-impl/intent-relayer-public.js +42 -0
- package/dist/src/intents/intent-signer-impl/factories.cjs +19 -0
- package/dist/src/intents/intent-signer-impl/factories.d.cts +11 -0
- package/dist/src/intents/intent-signer-impl/factories.d.ts +11 -0
- package/dist/src/intents/intent-signer-impl/factories.js +17 -0
- package/dist/src/intents/intent-signer-impl/intent-signer-near-keypair.cjs +22 -0
- package/dist/src/intents/intent-signer-impl/intent-signer-near-keypair.d.cts +15 -0
- package/dist/src/intents/intent-signer-impl/intent-signer-near-keypair.d.ts +16 -0
- package/dist/src/intents/intent-signer-impl/intent-signer-near-keypair.js +21 -0
- package/dist/src/intents/intent-signer-impl/intent-signer-nep413.cjs +37 -0
- package/dist/src/intents/intent-signer-impl/intent-signer-nep413.d.cts +14 -0
- package/dist/src/intents/intent-signer-impl/intent-signer-nep413.d.ts +14 -0
- package/dist/src/intents/intent-signer-impl/intent-signer-nep413.js +36 -0
- package/dist/src/intents/intent-signer-impl/intent-signer-noop.cjs +8 -0
- package/dist/src/intents/intent-signer-impl/intent-signer-noop.js +7 -0
- package/dist/src/intents/intent-signer-impl/intent-signer-viem.cjs +31 -0
- package/dist/src/intents/intent-signer-impl/intent-signer-viem.d.cts +17 -0
- package/dist/src/intents/intent-signer-impl/intent-signer-viem.d.ts +17 -0
- package/dist/src/intents/intent-signer-impl/intent-signer-viem.js +30 -0
- package/dist/src/intents/interfaces/intent-executer.d.ts +2 -0
- package/dist/src/intents/interfaces/intent-relayer.d.cts +43 -0
- package/dist/src/intents/interfaces/intent-relayer.d.ts +43 -0
- package/dist/src/intents/interfaces/intent-signer.d.cts +8 -0
- package/dist/src/intents/interfaces/intent-signer.d.ts +8 -0
- package/dist/src/intents/interfaces/salt-manager.d.cts +9 -0
- package/dist/src/intents/interfaces/salt-manager.d.ts +9 -0
- package/dist/src/intents/salt-manager.cjs +74 -0
- package/dist/src/intents/salt-manager.js +72 -0
- package/dist/src/intents/shared-types.d.cts +20 -0
- package/dist/src/intents/shared-types.d.ts +20 -0
- package/dist/src/lib/array.cjs +11 -0
- package/dist/src/lib/array.js +10 -0
- package/dist/src/lib/caip2.cjs +50 -0
- package/dist/src/lib/caip2.d.cts +38 -0
- package/dist/src/lib/caip2.d.ts +38 -0
- package/dist/src/lib/caip2.js +48 -0
- package/dist/src/lib/configure-rpc-config.cjs +20 -0
- package/dist/src/lib/configure-rpc-config.js +18 -0
- package/dist/src/lib/estimate-fee.cjs +96 -0
- package/dist/src/lib/estimate-fee.js +94 -0
- package/dist/src/lib/hex.cjs +11 -0
- package/dist/src/lib/hex.js +10 -0
- package/dist/src/lib/nep413.cjs +42 -0
- package/dist/src/lib/nep413.d.cts +14 -0
- package/dist/src/lib/nep413.d.ts +14 -0
- package/dist/src/lib/nep413.js +41 -0
- package/dist/src/lib/object.cjs +10 -0
- package/dist/src/lib/object.js +9 -0
- package/dist/src/lib/parse-defuse-asset-id.cjs +15 -0
- package/dist/src/lib/parse-defuse-asset-id.js +14 -0
- package/dist/src/lib/route-config-factory.cjs +43 -0
- package/dist/src/lib/route-config-factory.d.cts +13 -0
- package/dist/src/lib/route-config-factory.d.ts +13 -0
- package/dist/src/lib/route-config-factory.js +37 -0
- package/dist/src/lib/tokensUsdPricesHttpClient/apis.cjs +17 -0
- package/dist/src/lib/tokensUsdPricesHttpClient/apis.js +16 -0
- package/dist/src/lib/validateAddress.cjs +271 -0
- package/dist/src/lib/validateAddress.d.cts +14 -0
- package/dist/src/lib/validateAddress.d.ts +14 -0
- package/dist/src/lib/validateAddress.js +270 -0
- package/dist/src/sdk.cjs +435 -0
- package/dist/src/sdk.d.cts +231 -0
- package/dist/src/sdk.d.ts +231 -0
- package/dist/src/sdk.js +433 -0
- package/dist/src/shared-types.d.cts +378 -0
- package/dist/src/shared-types.d.ts +378 -0
- package/package.json +62 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_caip2 = require('./caip2.cjs');
|
|
3
|
+
let lampamazaza_internal_utils = require("lampamazaza-internal-utils");
|
|
4
|
+
let viem = require("viem");
|
|
5
|
+
let _noble_hashes_sha2 = require("@noble/hashes/sha2");
|
|
6
|
+
let _scure_base = require("@scure/base");
|
|
7
|
+
let _solana_web3_js = require("@solana/web3.js");
|
|
8
|
+
let ripple_address_codec = require("ripple-address-codec");
|
|
9
|
+
|
|
10
|
+
//#region src/lib/validateAddress.ts
|
|
11
|
+
/**
|
|
12
|
+
* Validates that an address matches the expected format for a given blockchain.
|
|
13
|
+
*
|
|
14
|
+
* Note: This validates address FORMAT only. Specific bridges may have
|
|
15
|
+
* additional requirements (e.g., supported address types, memo requirements).
|
|
16
|
+
* A valid format does not guarantee a bridge will accept the address.
|
|
17
|
+
*/
|
|
18
|
+
function validateAddress(address, blockchain) {
|
|
19
|
+
switch (blockchain) {
|
|
20
|
+
case require_caip2.Chains.Near: return lampamazaza_internal_utils.utils.validateNearAddress(address);
|
|
21
|
+
case require_caip2.Chains.Bitcoin: return validateBtcAddress(address);
|
|
22
|
+
case require_caip2.Chains.BitcoinCash: return validateBchAddress(address);
|
|
23
|
+
case require_caip2.Chains.Solana: return validateSolAddress(address);
|
|
24
|
+
case require_caip2.Chains.Dogecoin: return validateDogeAddress(address);
|
|
25
|
+
case require_caip2.Chains.Litecoin: return validateLitecoinAddress(address);
|
|
26
|
+
case require_caip2.Chains.XRPL: return validateXrpAddress(address);
|
|
27
|
+
case require_caip2.Chains.Zcash: return validateZcashAddress(address);
|
|
28
|
+
case require_caip2.Chains.Tron: return validateTronAddress(address);
|
|
29
|
+
case require_caip2.Chains.TON: return validateTonAddress(address);
|
|
30
|
+
case require_caip2.Chains.Sui: return validateSuiAddress(address);
|
|
31
|
+
case require_caip2.Chains.Stellar: return validateStellarAddress(address);
|
|
32
|
+
case require_caip2.Chains.Aptos: return validateAptosAddress(address);
|
|
33
|
+
case require_caip2.Chains.Cardano: return validateCardanoAddress(address);
|
|
34
|
+
case require_caip2.Chains.Starknet: return validateStarknetAddress(address);
|
|
35
|
+
case require_caip2.Chains.Ethereum:
|
|
36
|
+
case require_caip2.Chains.Optimism:
|
|
37
|
+
case require_caip2.Chains.BNB:
|
|
38
|
+
case require_caip2.Chains.Gnosis:
|
|
39
|
+
case require_caip2.Chains.Polygon:
|
|
40
|
+
case require_caip2.Chains.Monad:
|
|
41
|
+
case require_caip2.Chains.LayerX:
|
|
42
|
+
case require_caip2.Chains.Adi:
|
|
43
|
+
case require_caip2.Chains.Base:
|
|
44
|
+
case require_caip2.Chains.Arbitrum:
|
|
45
|
+
case require_caip2.Chains.Avalanche:
|
|
46
|
+
case require_caip2.Chains.Berachain:
|
|
47
|
+
case require_caip2.Chains.Plasma:
|
|
48
|
+
case require_caip2.Chains.Scroll: return validateEthAddress(address);
|
|
49
|
+
default: return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function validateEthAddress(address) {
|
|
53
|
+
return (0, viem.isAddress)(address, { strict: true });
|
|
54
|
+
}
|
|
55
|
+
function validateBtcAddress(address) {
|
|
56
|
+
return /^1[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address) || /^3[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address) || /^bc1[02-9ac-hj-np-z]{11,87}$/.test(address) || /^bc1p[02-9ac-hj-np-z]{42,87}$/.test(address);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Validates Bitcoin Cash addresses
|
|
60
|
+
* Supports:
|
|
61
|
+
* - Legacy addresses (1... for P2PKH, 3... for P2SH) - shared with Bitcoin
|
|
62
|
+
* - CashAddr format (bitcoincash:q... or q... for P2PKH, bitcoincash:p... or p... for P2SH)
|
|
63
|
+
*
|
|
64
|
+
* CashAddr checksum implementation based on:
|
|
65
|
+
* @see https://github.com/ealmansi/cashaddrjs (MIT License)
|
|
66
|
+
* @see https://github.com/bitcoincashorg/bitcoincash.org/blob/master/spec/cashaddr.md
|
|
67
|
+
*/
|
|
68
|
+
function validateBchAddress(address) {
|
|
69
|
+
if (/^1[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address) || /^3[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address)) return true;
|
|
70
|
+
return validateBchCashAddr(address);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Validates Bitcoin Cash CashAddr format
|
|
74
|
+
* CashAddr uses a modified Bech32 encoding with polymod checksum
|
|
75
|
+
*/
|
|
76
|
+
function validateBchCashAddr(address) {
|
|
77
|
+
let normalized = address.toLowerCase();
|
|
78
|
+
if (!normalized.includes(":")) normalized = `bitcoincash:${normalized}`;
|
|
79
|
+
if (!normalized.startsWith("bitcoincash:")) return false;
|
|
80
|
+
const payload = normalized.slice(12);
|
|
81
|
+
if (!payload.startsWith("q") && !payload.startsWith("p")) return false;
|
|
82
|
+
const CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
|
|
83
|
+
for (const char of payload) if (!CHARSET.includes(char)) return false;
|
|
84
|
+
if (payload.length !== 42 && payload.length !== 61) return false;
|
|
85
|
+
return verifyBchChecksum(normalized);
|
|
86
|
+
}
|
|
87
|
+
function verifyBchChecksum(address) {
|
|
88
|
+
const CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
|
|
89
|
+
const colonIndex = address.indexOf(":");
|
|
90
|
+
const prefix = address.slice(0, colonIndex);
|
|
91
|
+
const payload = address.slice(colonIndex + 1);
|
|
92
|
+
const prefixData = [];
|
|
93
|
+
for (const char of prefix) prefixData.push(char.charCodeAt(0) & 31);
|
|
94
|
+
prefixData.push(0);
|
|
95
|
+
const payloadData = [];
|
|
96
|
+
for (const char of payload) {
|
|
97
|
+
const idx = CHARSET.indexOf(char);
|
|
98
|
+
if (idx === -1) return false;
|
|
99
|
+
payloadData.push(idx);
|
|
100
|
+
}
|
|
101
|
+
const values = [...prefixData, ...payloadData];
|
|
102
|
+
let c = 1n;
|
|
103
|
+
for (const d of values) {
|
|
104
|
+
const c0 = c >> 35n;
|
|
105
|
+
c = (c & 34359738367n) << 5n ^ BigInt(d);
|
|
106
|
+
if (c0 & 1n) c ^= 656907472481n;
|
|
107
|
+
if (c0 & 2n) c ^= 522768456162n;
|
|
108
|
+
if (c0 & 4n) c ^= 1044723512260n;
|
|
109
|
+
if (c0 & 8n) c ^= 748107326120n;
|
|
110
|
+
if (c0 & 16n) c ^= 130178868336n;
|
|
111
|
+
}
|
|
112
|
+
return (c ^ 1n) === 0n;
|
|
113
|
+
}
|
|
114
|
+
function validateSolAddress(address) {
|
|
115
|
+
try {
|
|
116
|
+
return _solana_web3_js.PublicKey.isOnCurve(address);
|
|
117
|
+
} catch {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function validateDogeAddress(address) {
|
|
122
|
+
return /^[DA][1-9A-HJ-NP-Za-km-z]{25,33}$/.test(address);
|
|
123
|
+
}
|
|
124
|
+
function validateXrpAddress(address) {
|
|
125
|
+
return (0, ripple_address_codec.isValidClassicAddress)(address) || (0, ripple_address_codec.isValidXAddress)(address);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Validates Zcash addresses
|
|
129
|
+
* Supports:
|
|
130
|
+
* - Transparent addresses (t1, t3)
|
|
131
|
+
* - TEX addresses (tex1)
|
|
132
|
+
*/
|
|
133
|
+
function validateZcashAddress(address) {
|
|
134
|
+
if (address.startsWith("t1") || address.startsWith("t3")) return /^t[13][a-km-zA-HJ-NP-Z1-9]{33}$/.test(address);
|
|
135
|
+
const expectedHrp = "tex";
|
|
136
|
+
if (address.startsWith(`${expectedHrp}1`)) try {
|
|
137
|
+
const decoded = _scure_base.bech32m.decodeToBytes(address);
|
|
138
|
+
if (decoded.prefix !== expectedHrp) return false;
|
|
139
|
+
return decoded.bytes.length === 20;
|
|
140
|
+
} catch {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
const uaHrp = "u";
|
|
144
|
+
if (address.startsWith(`${uaHrp}1`)) try {
|
|
145
|
+
return _scure_base.bech32m.decodeToBytes(address).prefix === uaHrp;
|
|
146
|
+
} catch {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Validates Tron addresses
|
|
153
|
+
* Supports:
|
|
154
|
+
* - hex addresses
|
|
155
|
+
* - base58 addresses
|
|
156
|
+
* https://developers.tron.network/docs/account
|
|
157
|
+
*/
|
|
158
|
+
function validateTronAddress(address) {
|
|
159
|
+
return validateTronBase58Address(address) || validateTronHexAddress(address);
|
|
160
|
+
}
|
|
161
|
+
function validateTronBase58Address(address) {
|
|
162
|
+
try {
|
|
163
|
+
const decoded = _scure_base.base58.decode(address);
|
|
164
|
+
if (decoded.length !== 25) return false;
|
|
165
|
+
const data = decoded.slice(0, 21);
|
|
166
|
+
const checksum = decoded.slice(21);
|
|
167
|
+
const expectedChecksum = (0, _noble_hashes_sha2.sha256)((0, _noble_hashes_sha2.sha256)(data)).slice(0, 4);
|
|
168
|
+
for (let i = 0; i < 4; i++) if (checksum[i] !== expectedChecksum[i]) return false;
|
|
169
|
+
return data[0] === 65;
|
|
170
|
+
} catch {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function validateTronHexAddress(address) {
|
|
175
|
+
try {
|
|
176
|
+
const decoded = _scure_base.hex.decode(address);
|
|
177
|
+
return decoded.length === 21 && decoded[0] === 65;
|
|
178
|
+
} catch {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function validateTonAddress(address) {
|
|
183
|
+
return /^[EU]Q[0-9A-Za-z_-]{46}$/.test(address);
|
|
184
|
+
}
|
|
185
|
+
function validateSuiAddress(address) {
|
|
186
|
+
return /^(?:0x)?[a-fA-F0-9]{64}$/.test(address);
|
|
187
|
+
}
|
|
188
|
+
function validateStellarAddress(address) {
|
|
189
|
+
return /^G[A-Z0-9]{55}$/.test(address);
|
|
190
|
+
}
|
|
191
|
+
function validateAptosAddress(address) {
|
|
192
|
+
return /^0x[a-fA-F0-9]{64}$/.test(address);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Validates Cardano mainnet addresses (Base + Enterprise)
|
|
196
|
+
* Returns true if valid, false if invalid
|
|
197
|
+
*/
|
|
198
|
+
function validateCardanoAddress(address) {
|
|
199
|
+
try {
|
|
200
|
+
const { prefix, words } = _scure_base.bech32.decode(address, 120);
|
|
201
|
+
if (prefix !== "addr") return false;
|
|
202
|
+
const addrType = _scure_base.bech32.fromWords(words)[0] >> 4;
|
|
203
|
+
return addrType >= 0 && addrType <= 7;
|
|
204
|
+
} catch {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Validates Starknet addresses
|
|
210
|
+
* Starknet addresses are felt252 (252-bit field elements) represented as
|
|
211
|
+
* hex strings with 0x prefix (up to 64 hex characters)
|
|
212
|
+
*/
|
|
213
|
+
function validateStarknetAddress(address) {
|
|
214
|
+
return /^0x[a-fA-F0-9]{1,64}$/.test(address);
|
|
215
|
+
}
|
|
216
|
+
function validateLitecoinAddress(address) {
|
|
217
|
+
const first = address[0];
|
|
218
|
+
if (first === "L") return validateLitecoinBase58Address(address, 48);
|
|
219
|
+
if (first === "M") return validateLitecoinBase58Address(address, 50);
|
|
220
|
+
if (first === "3") return validateLitecoinBase58Address(address, 5);
|
|
221
|
+
if (!address.toLowerCase().startsWith("ltc1")) return false;
|
|
222
|
+
return validateLitecoinBech32Address(address);
|
|
223
|
+
}
|
|
224
|
+
function validateLitecoinBase58Address(address, expectedVersion) {
|
|
225
|
+
let decoded;
|
|
226
|
+
try {
|
|
227
|
+
decoded = _scure_base.base58.decode(address);
|
|
228
|
+
} catch {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
if (decoded.length !== 25) return false;
|
|
232
|
+
if (decoded[0] !== expectedVersion) return false;
|
|
233
|
+
const payload = decoded.subarray(0, 21);
|
|
234
|
+
const checksum = decoded.subarray(21, 25);
|
|
235
|
+
const expectedChecksum = (0, _noble_hashes_sha2.sha256)((0, _noble_hashes_sha2.sha256)(payload)).subarray(0, 4);
|
|
236
|
+
for (let i = 0; i < 4; i++) if (checksum[i] !== expectedChecksum[i]) return false;
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
function validateLitecoinBech32Address(address) {
|
|
240
|
+
let decoded;
|
|
241
|
+
let isBech32m = false;
|
|
242
|
+
try {
|
|
243
|
+
decoded = _scure_base.bech32.decode(address);
|
|
244
|
+
} catch {
|
|
245
|
+
try {
|
|
246
|
+
decoded = _scure_base.bech32m.decode(address);
|
|
247
|
+
isBech32m = true;
|
|
248
|
+
} catch {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (decoded.prefix.toLowerCase() !== "ltc") return false;
|
|
253
|
+
const { words } = decoded;
|
|
254
|
+
if (!words || words.length < 1) return false;
|
|
255
|
+
const version = words[0];
|
|
256
|
+
if (version == null || version < 0 || version > 16) return false;
|
|
257
|
+
const progLen = _scure_base.bech32.fromWords(words.slice(1)).length;
|
|
258
|
+
if (progLen < 2 || progLen > 40) return false;
|
|
259
|
+
if (version === 0) {
|
|
260
|
+
if (isBech32m) return false;
|
|
261
|
+
return progLen === 20 || progLen === 32;
|
|
262
|
+
}
|
|
263
|
+
if (version === 1) {
|
|
264
|
+
if (!isBech32m) return false;
|
|
265
|
+
return progLen === 32;
|
|
266
|
+
}
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
//#endregion
|
|
271
|
+
exports.validateAddress = validateAddress;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Chain } from "./caip2.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/validateAddress.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Validates that an address matches the expected format for a given blockchain.
|
|
7
|
+
*
|
|
8
|
+
* Note: This validates address FORMAT only. Specific bridges may have
|
|
9
|
+
* additional requirements (e.g., supported address types, memo requirements).
|
|
10
|
+
* A valid format does not guarantee a bridge will accept the address.
|
|
11
|
+
*/
|
|
12
|
+
declare function validateAddress(address: string, blockchain: Chain): boolean;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { validateAddress };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Chain } from "./caip2.js";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/validateAddress.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Validates that an address matches the expected format for a given blockchain.
|
|
7
|
+
*
|
|
8
|
+
* Note: This validates address FORMAT only. Specific bridges may have
|
|
9
|
+
* additional requirements (e.g., supported address types, memo requirements).
|
|
10
|
+
* A valid format does not guarantee a bridge will accept the address.
|
|
11
|
+
*/
|
|
12
|
+
declare function validateAddress(address: string, blockchain: Chain): boolean;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { validateAddress };
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { Chains } from "./caip2.js";
|
|
2
|
+
import { utils } from "lampamazaza-internal-utils";
|
|
3
|
+
import { isAddress } from "viem";
|
|
4
|
+
import { sha256 } from "@noble/hashes/sha2";
|
|
5
|
+
import { base58, bech32, bech32m, hex } from "@scure/base";
|
|
6
|
+
import { PublicKey } from "@solana/web3.js";
|
|
7
|
+
import { isValidClassicAddress, isValidXAddress } from "ripple-address-codec";
|
|
8
|
+
|
|
9
|
+
//#region src/lib/validateAddress.ts
|
|
10
|
+
/**
|
|
11
|
+
* Validates that an address matches the expected format for a given blockchain.
|
|
12
|
+
*
|
|
13
|
+
* Note: This validates address FORMAT only. Specific bridges may have
|
|
14
|
+
* additional requirements (e.g., supported address types, memo requirements).
|
|
15
|
+
* A valid format does not guarantee a bridge will accept the address.
|
|
16
|
+
*/
|
|
17
|
+
function validateAddress(address, blockchain) {
|
|
18
|
+
switch (blockchain) {
|
|
19
|
+
case Chains.Near: return utils.validateNearAddress(address);
|
|
20
|
+
case Chains.Bitcoin: return validateBtcAddress(address);
|
|
21
|
+
case Chains.BitcoinCash: return validateBchAddress(address);
|
|
22
|
+
case Chains.Solana: return validateSolAddress(address);
|
|
23
|
+
case Chains.Dogecoin: return validateDogeAddress(address);
|
|
24
|
+
case Chains.Litecoin: return validateLitecoinAddress(address);
|
|
25
|
+
case Chains.XRPL: return validateXrpAddress(address);
|
|
26
|
+
case Chains.Zcash: return validateZcashAddress(address);
|
|
27
|
+
case Chains.Tron: return validateTronAddress(address);
|
|
28
|
+
case Chains.TON: return validateTonAddress(address);
|
|
29
|
+
case Chains.Sui: return validateSuiAddress(address);
|
|
30
|
+
case Chains.Stellar: return validateStellarAddress(address);
|
|
31
|
+
case Chains.Aptos: return validateAptosAddress(address);
|
|
32
|
+
case Chains.Cardano: return validateCardanoAddress(address);
|
|
33
|
+
case Chains.Starknet: return validateStarknetAddress(address);
|
|
34
|
+
case Chains.Ethereum:
|
|
35
|
+
case Chains.Optimism:
|
|
36
|
+
case Chains.BNB:
|
|
37
|
+
case Chains.Gnosis:
|
|
38
|
+
case Chains.Polygon:
|
|
39
|
+
case Chains.Monad:
|
|
40
|
+
case Chains.LayerX:
|
|
41
|
+
case Chains.Adi:
|
|
42
|
+
case Chains.Base:
|
|
43
|
+
case Chains.Arbitrum:
|
|
44
|
+
case Chains.Avalanche:
|
|
45
|
+
case Chains.Berachain:
|
|
46
|
+
case Chains.Plasma:
|
|
47
|
+
case Chains.Scroll: return validateEthAddress(address);
|
|
48
|
+
default: return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function validateEthAddress(address) {
|
|
52
|
+
return isAddress(address, { strict: true });
|
|
53
|
+
}
|
|
54
|
+
function validateBtcAddress(address) {
|
|
55
|
+
return /^1[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address) || /^3[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address) || /^bc1[02-9ac-hj-np-z]{11,87}$/.test(address) || /^bc1p[02-9ac-hj-np-z]{42,87}$/.test(address);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Validates Bitcoin Cash addresses
|
|
59
|
+
* Supports:
|
|
60
|
+
* - Legacy addresses (1... for P2PKH, 3... for P2SH) - shared with Bitcoin
|
|
61
|
+
* - CashAddr format (bitcoincash:q... or q... for P2PKH, bitcoincash:p... or p... for P2SH)
|
|
62
|
+
*
|
|
63
|
+
* CashAddr checksum implementation based on:
|
|
64
|
+
* @see https://github.com/ealmansi/cashaddrjs (MIT License)
|
|
65
|
+
* @see https://github.com/bitcoincashorg/bitcoincash.org/blob/master/spec/cashaddr.md
|
|
66
|
+
*/
|
|
67
|
+
function validateBchAddress(address) {
|
|
68
|
+
if (/^1[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address) || /^3[1-9A-HJ-NP-Za-km-z]{25,34}$/.test(address)) return true;
|
|
69
|
+
return validateBchCashAddr(address);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Validates Bitcoin Cash CashAddr format
|
|
73
|
+
* CashAddr uses a modified Bech32 encoding with polymod checksum
|
|
74
|
+
*/
|
|
75
|
+
function validateBchCashAddr(address) {
|
|
76
|
+
let normalized = address.toLowerCase();
|
|
77
|
+
if (!normalized.includes(":")) normalized = `bitcoincash:${normalized}`;
|
|
78
|
+
if (!normalized.startsWith("bitcoincash:")) return false;
|
|
79
|
+
const payload = normalized.slice(12);
|
|
80
|
+
if (!payload.startsWith("q") && !payload.startsWith("p")) return false;
|
|
81
|
+
const CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
|
|
82
|
+
for (const char of payload) if (!CHARSET.includes(char)) return false;
|
|
83
|
+
if (payload.length !== 42 && payload.length !== 61) return false;
|
|
84
|
+
return verifyBchChecksum(normalized);
|
|
85
|
+
}
|
|
86
|
+
function verifyBchChecksum(address) {
|
|
87
|
+
const CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
|
|
88
|
+
const colonIndex = address.indexOf(":");
|
|
89
|
+
const prefix = address.slice(0, colonIndex);
|
|
90
|
+
const payload = address.slice(colonIndex + 1);
|
|
91
|
+
const prefixData = [];
|
|
92
|
+
for (const char of prefix) prefixData.push(char.charCodeAt(0) & 31);
|
|
93
|
+
prefixData.push(0);
|
|
94
|
+
const payloadData = [];
|
|
95
|
+
for (const char of payload) {
|
|
96
|
+
const idx = CHARSET.indexOf(char);
|
|
97
|
+
if (idx === -1) return false;
|
|
98
|
+
payloadData.push(idx);
|
|
99
|
+
}
|
|
100
|
+
const values = [...prefixData, ...payloadData];
|
|
101
|
+
let c = 1n;
|
|
102
|
+
for (const d of values) {
|
|
103
|
+
const c0 = c >> 35n;
|
|
104
|
+
c = (c & 34359738367n) << 5n ^ BigInt(d);
|
|
105
|
+
if (c0 & 1n) c ^= 656907472481n;
|
|
106
|
+
if (c0 & 2n) c ^= 522768456162n;
|
|
107
|
+
if (c0 & 4n) c ^= 1044723512260n;
|
|
108
|
+
if (c0 & 8n) c ^= 748107326120n;
|
|
109
|
+
if (c0 & 16n) c ^= 130178868336n;
|
|
110
|
+
}
|
|
111
|
+
return (c ^ 1n) === 0n;
|
|
112
|
+
}
|
|
113
|
+
function validateSolAddress(address) {
|
|
114
|
+
try {
|
|
115
|
+
return PublicKey.isOnCurve(address);
|
|
116
|
+
} catch {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function validateDogeAddress(address) {
|
|
121
|
+
return /^[DA][1-9A-HJ-NP-Za-km-z]{25,33}$/.test(address);
|
|
122
|
+
}
|
|
123
|
+
function validateXrpAddress(address) {
|
|
124
|
+
return isValidClassicAddress(address) || isValidXAddress(address);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Validates Zcash addresses
|
|
128
|
+
* Supports:
|
|
129
|
+
* - Transparent addresses (t1, t3)
|
|
130
|
+
* - TEX addresses (tex1)
|
|
131
|
+
*/
|
|
132
|
+
function validateZcashAddress(address) {
|
|
133
|
+
if (address.startsWith("t1") || address.startsWith("t3")) return /^t[13][a-km-zA-HJ-NP-Z1-9]{33}$/.test(address);
|
|
134
|
+
const expectedHrp = "tex";
|
|
135
|
+
if (address.startsWith(`${expectedHrp}1`)) try {
|
|
136
|
+
const decoded = bech32m.decodeToBytes(address);
|
|
137
|
+
if (decoded.prefix !== expectedHrp) return false;
|
|
138
|
+
return decoded.bytes.length === 20;
|
|
139
|
+
} catch {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
const uaHrp = "u";
|
|
143
|
+
if (address.startsWith(`${uaHrp}1`)) try {
|
|
144
|
+
return bech32m.decodeToBytes(address).prefix === uaHrp;
|
|
145
|
+
} catch {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Validates Tron addresses
|
|
152
|
+
* Supports:
|
|
153
|
+
* - hex addresses
|
|
154
|
+
* - base58 addresses
|
|
155
|
+
* https://developers.tron.network/docs/account
|
|
156
|
+
*/
|
|
157
|
+
function validateTronAddress(address) {
|
|
158
|
+
return validateTronBase58Address(address) || validateTronHexAddress(address);
|
|
159
|
+
}
|
|
160
|
+
function validateTronBase58Address(address) {
|
|
161
|
+
try {
|
|
162
|
+
const decoded = base58.decode(address);
|
|
163
|
+
if (decoded.length !== 25) return false;
|
|
164
|
+
const data = decoded.slice(0, 21);
|
|
165
|
+
const checksum = decoded.slice(21);
|
|
166
|
+
const expectedChecksum = sha256(sha256(data)).slice(0, 4);
|
|
167
|
+
for (let i = 0; i < 4; i++) if (checksum[i] !== expectedChecksum[i]) return false;
|
|
168
|
+
return data[0] === 65;
|
|
169
|
+
} catch {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function validateTronHexAddress(address) {
|
|
174
|
+
try {
|
|
175
|
+
const decoded = hex.decode(address);
|
|
176
|
+
return decoded.length === 21 && decoded[0] === 65;
|
|
177
|
+
} catch {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function validateTonAddress(address) {
|
|
182
|
+
return /^[EU]Q[0-9A-Za-z_-]{46}$/.test(address);
|
|
183
|
+
}
|
|
184
|
+
function validateSuiAddress(address) {
|
|
185
|
+
return /^(?:0x)?[a-fA-F0-9]{64}$/.test(address);
|
|
186
|
+
}
|
|
187
|
+
function validateStellarAddress(address) {
|
|
188
|
+
return /^G[A-Z0-9]{55}$/.test(address);
|
|
189
|
+
}
|
|
190
|
+
function validateAptosAddress(address) {
|
|
191
|
+
return /^0x[a-fA-F0-9]{64}$/.test(address);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Validates Cardano mainnet addresses (Base + Enterprise)
|
|
195
|
+
* Returns true if valid, false if invalid
|
|
196
|
+
*/
|
|
197
|
+
function validateCardanoAddress(address) {
|
|
198
|
+
try {
|
|
199
|
+
const { prefix, words } = bech32.decode(address, 120);
|
|
200
|
+
if (prefix !== "addr") return false;
|
|
201
|
+
const addrType = bech32.fromWords(words)[0] >> 4;
|
|
202
|
+
return addrType >= 0 && addrType <= 7;
|
|
203
|
+
} catch {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Validates Starknet addresses
|
|
209
|
+
* Starknet addresses are felt252 (252-bit field elements) represented as
|
|
210
|
+
* hex strings with 0x prefix (up to 64 hex characters)
|
|
211
|
+
*/
|
|
212
|
+
function validateStarknetAddress(address) {
|
|
213
|
+
return /^0x[a-fA-F0-9]{1,64}$/.test(address);
|
|
214
|
+
}
|
|
215
|
+
function validateLitecoinAddress(address) {
|
|
216
|
+
const first = address[0];
|
|
217
|
+
if (first === "L") return validateLitecoinBase58Address(address, 48);
|
|
218
|
+
if (first === "M") return validateLitecoinBase58Address(address, 50);
|
|
219
|
+
if (first === "3") return validateLitecoinBase58Address(address, 5);
|
|
220
|
+
if (!address.toLowerCase().startsWith("ltc1")) return false;
|
|
221
|
+
return validateLitecoinBech32Address(address);
|
|
222
|
+
}
|
|
223
|
+
function validateLitecoinBase58Address(address, expectedVersion) {
|
|
224
|
+
let decoded;
|
|
225
|
+
try {
|
|
226
|
+
decoded = base58.decode(address);
|
|
227
|
+
} catch {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
if (decoded.length !== 25) return false;
|
|
231
|
+
if (decoded[0] !== expectedVersion) return false;
|
|
232
|
+
const payload = decoded.subarray(0, 21);
|
|
233
|
+
const checksum = decoded.subarray(21, 25);
|
|
234
|
+
const expectedChecksum = sha256(sha256(payload)).subarray(0, 4);
|
|
235
|
+
for (let i = 0; i < 4; i++) if (checksum[i] !== expectedChecksum[i]) return false;
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
function validateLitecoinBech32Address(address) {
|
|
239
|
+
let decoded;
|
|
240
|
+
let isBech32m = false;
|
|
241
|
+
try {
|
|
242
|
+
decoded = bech32.decode(address);
|
|
243
|
+
} catch {
|
|
244
|
+
try {
|
|
245
|
+
decoded = bech32m.decode(address);
|
|
246
|
+
isBech32m = true;
|
|
247
|
+
} catch {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (decoded.prefix.toLowerCase() !== "ltc") return false;
|
|
252
|
+
const { words } = decoded;
|
|
253
|
+
if (!words || words.length < 1) return false;
|
|
254
|
+
const version = words[0];
|
|
255
|
+
if (version == null || version < 0 || version > 16) return false;
|
|
256
|
+
const progLen = bech32.fromWords(words.slice(1)).length;
|
|
257
|
+
if (progLen < 2 || progLen > 40) return false;
|
|
258
|
+
if (version === 0) {
|
|
259
|
+
if (isBech32m) return false;
|
|
260
|
+
return progLen === 20 || progLen === 32;
|
|
261
|
+
}
|
|
262
|
+
if (version === 1) {
|
|
263
|
+
if (!isBech32m) return false;
|
|
264
|
+
return progLen === 32;
|
|
265
|
+
}
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
//#endregion
|
|
270
|
+
export { validateAddress };
|