@railgun-community/waku-broadcaster-client-web 9.1.0 → 9.2.0-rc.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/fees/broadcaster-fee-cache.d.ts +1 -1
- package/dist/fees/broadcaster-fee-cache.js +2 -2
- package/dist/fees/broadcaster-fee-cache.js.map +1 -1
- package/dist/fees/handle-authorized-fees-message.js +4 -1
- package/dist/fees/handle-authorized-fees-message.js.map +1 -1
- package/dist/fees/handle-fees-message.js +2 -1
- package/dist/fees/handle-fees-message.js.map +1 -1
- package/dist/search/best-broadcaster.d.ts +4 -4
- package/dist/search/best-broadcaster.js +8 -8
- package/dist/search/best-broadcaster.js.map +1 -1
- package/dist/transact/broadcaster-transaction.d.ts +15 -1
- package/dist/transact/broadcaster-transaction.js +51 -8
- package/dist/transact/broadcaster-transaction.js.map +1 -1
- package/dist/utils/broadcaster-util.d.ts +1 -1
- package/dist/utils/broadcaster-util.js +12 -7
- package/dist/utils/broadcaster-util.js.map +1 -1
- package/dist/waku/waku-broadcaster-waku-core-base.d.ts +1 -1
- package/dist/waku/waku-broadcaster-waku-core-base.js +50 -44
- package/dist/waku/waku-broadcaster-waku-core-base.js.map +1 -1
- package/dist/waku-broadcaster-client.d.ts +5 -5
- package/dist/waku-broadcaster-client.js +13 -13
- package/dist/waku-broadcaster-client.js.map +1 -1
- package/package.json +5 -5
|
@@ -22,7 +22,7 @@ export declare class BroadcasterFeeCache {
|
|
|
22
22
|
static resetCache(chain: Chain): void;
|
|
23
23
|
static feesForChain(chain: Chain): Optional<BroadcasterFeeNetworkCacheMap>;
|
|
24
24
|
static feesForToken(chain: Chain, tokenAddress: string): Optional<BroadcasterFeeNetworkTokenCacheMap>;
|
|
25
|
-
static supportsToken(chain: Chain, tokenAddress: string, useRelayAdapt: boolean): boolean;
|
|
25
|
+
static supportsToken(chain: Chain, tokenAddress: string, useRelayAdapt: boolean, use7702Only?: boolean): boolean;
|
|
26
26
|
static addAuthorizedFees(signerAddress: string, tokenFeeMap: MapType<CachedTokenFee>): void;
|
|
27
27
|
private static updateAverageAuthorizedFees;
|
|
28
28
|
static getAuthorizedFee(tokenAddress: string): Optional<CachedTokenFee>;
|
|
@@ -69,7 +69,7 @@ export class BroadcasterFeeCache {
|
|
|
69
69
|
static feesForToken(chain, tokenAddress) {
|
|
70
70
|
return this.feesForChain(chain)?.forToken[tokenAddress.toLowerCase()];
|
|
71
71
|
}
|
|
72
|
-
static supportsToken(chain, tokenAddress, useRelayAdapt) {
|
|
72
|
+
static supportsToken(chain, tokenAddress, useRelayAdapt, use7702Only = false) {
|
|
73
73
|
const feesForToken = this.feesForToken(chain, tokenAddress);
|
|
74
74
|
if (!feesForToken) {
|
|
75
75
|
return false;
|
|
@@ -79,7 +79,7 @@ export class BroadcasterFeeCache {
|
|
|
79
79
|
const cachedFees = filteredRailgunAddresses
|
|
80
80
|
.map(railgunAddress => Object.values(feesForToken.forBroadcaster[railgunAddress].forIdentifier))
|
|
81
81
|
.flat();
|
|
82
|
-
const availableUnexpiredFee = cachedFees.find(cachedFee => !cachedFeeUnavailableOrExpired(cachedFee, chain, useRelayAdapt));
|
|
82
|
+
const availableUnexpiredFee = cachedFees.find(cachedFee => !cachedFeeUnavailableOrExpired(cachedFee, chain, useRelayAdapt, use7702Only));
|
|
83
83
|
return availableUnexpiredFee != null;
|
|
84
84
|
}
|
|
85
85
|
static addAuthorizedFees(signerAddress, tokenFeeMap) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broadcaster-fee-cache.js","sourceRoot":"","sources":["../../src/fees/broadcaster-fee-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CachedTokenFee,\n Chain,\n networkForChain,\n} from '@railgun-community/shared-models';\nimport { AddressFilter } from '../filters/address-filter.js';\nimport { BroadcasterConfig } from '../models/broadcaster-config.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport {\n nameForBroadcaster,\n cachedFeeExpired,\n DEFAULT_BROADCASTER_IDENTIFIER,\n invalidBroadcasterVersion,\n cachedFeeUnavailableOrExpired,\n} from '../utils/broadcaster-util.js';\n\n// {forNetwork: {forToken: {forBroadcaster: (fee, updatedAt)}}}\ntype BroadcasterFeeNetworkTokenBroadcasterCacheMap = {\n forIdentifier: MapType<CachedTokenFee>;\n};\ntype BroadcasterFeeNetworkTokenCacheMap = {\n forBroadcaster: MapType<BroadcasterFeeNetworkTokenBroadcasterCacheMap>;\n};\ntype BroadcasterFeeNetworkCacheMap = {\n forToken: MapType<BroadcasterFeeNetworkTokenCacheMap>;\n};\nexport type BroadcasterFeeCacheState = {\n forNetwork: MapType<BroadcasterFeeNetworkCacheMap>;\n};\n\nexport class BroadcasterFeeCache {\n private static cache: BroadcasterFeeCacheState = { forNetwork: {} };\n // signerAddress -> tokenAddress -> fee\n private static authorizedFees: MapType<MapType<CachedTokenFee>> = {};\n // tokenAddress -> fee (average)\n private static averageAuthorizedFees: MapType<CachedTokenFee> = {};\n static lastSubscribedFeeMessageReceivedAt: Optional<number>;\n private static poiActiveListKeys: Optional<string[]>;\n\n static init(poiActiveListKeys: string[]) {\n this.poiActiveListKeys = poiActiveListKeys;\n this.lastSubscribedFeeMessageReceivedAt = Date.now();\n }\n\n static addTokenFees(\n chain: Chain,\n railgunAddress: string,\n feeExpiration: number,\n tokenFeeMap: MapType<CachedTokenFee>,\n identifier: Optional<string>,\n version: string,\n requiredPOIListKeys: string[],\n ) {\n const network = networkForChain(chain);\n if (!network) {\n return;\n }\n\n if (!this.poiActiveListKeys) {\n throw new Error(\n 'Must define active POI list keys before adding any fees.',\n );\n }\n for (const listKey of requiredPOIListKeys) {\n if (!this.poiActiveListKeys.includes(listKey)) {\n BroadcasterDebug.log(\n `[Fees] Broadcaster ${railgunAddress} requires POI list key ${listKey}, which is not active.`,\n );\n return;\n }\n }\n\n const broadcasterName = nameForBroadcaster(railgunAddress, identifier);\n const networkName = network.name;\n\n if (invalidBroadcasterVersion(version)) {\n BroadcasterDebug.log(\n `[Fees] Broadcaster version ${version} invalid (req ${BroadcasterConfig.MINIMUM_BROADCASTER_VERSION}-${BroadcasterConfig.MAXIMUM_BROADCASTER_VERSION}): ${broadcasterName}`,\n );\n return;\n }\n\n if (cachedFeeExpired(feeExpiration)) {\n BroadcasterDebug.log(\n `[Fees] Fees expired for ${networkName} (${broadcasterName})`,\n );\n return;\n }\n\n const tokenAddresses = Object.keys(tokenFeeMap);\n BroadcasterDebug.log(\n `[Fees] Updating fees for ${networkName} (${broadcasterName}): ${tokenAddresses.length} tokens`,\n );\n\n this.cache.forNetwork[networkName] ??= { forToken: {} };\n\n const tokenAddressesLowercase = tokenAddresses.map(address =>\n address.toLowerCase(),\n );\n tokenAddressesLowercase.forEach(tokenAddress => {\n this.cache.forNetwork[networkName].forToken[tokenAddress] ??= {\n forBroadcaster: {},\n };\n this.cache.forNetwork[networkName].forToken[tokenAddress].forBroadcaster[\n railgunAddress\n ] ??= { forIdentifier: {} };\n\n this.cache.forNetwork[networkName].forToken[tokenAddress].forBroadcaster[\n railgunAddress\n ].forIdentifier[identifier ?? DEFAULT_BROADCASTER_IDENTIFIER] =\n tokenFeeMap[tokenAddress];\n });\n BroadcasterFeeCache.lastSubscribedFeeMessageReceivedAt = Date.now();\n }\n\n static resetCache(chain: Chain) {\n const network = networkForChain(chain);\n if (!network) {\n return;\n }\n this.cache.forNetwork ??= {};\n delete this.cache.forNetwork[network.name];\n }\n\n static feesForChain(chain: Chain): Optional<BroadcasterFeeNetworkCacheMap> {\n const network = networkForChain(chain);\n if (!network) {\n throw new Error('Chain not found.');\n }\n return this.cache.forNetwork[network.name];\n }\n\n static feesForToken(\n chain: Chain,\n tokenAddress: string,\n ): Optional<BroadcasterFeeNetworkTokenCacheMap> {\n return this.feesForChain(chain)?.forToken[tokenAddress.toLowerCase()];\n }\n\n static supportsToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ): boolean {\n const feesForToken = this.feesForToken(chain, tokenAddress);\n if (!feesForToken) {\n return false;\n }\n\n const railgunAddresses = Object.keys(feesForToken.forBroadcaster);\n const filteredRailgunAddresses = AddressFilter.filter(railgunAddresses);\n\n const cachedFees: CachedTokenFee[] = filteredRailgunAddresses\n .map(railgunAddress =>\n Object.values(\n feesForToken.forBroadcaster[railgunAddress].forIdentifier,\n ),\n )\n .flat();\n\n const availableUnexpiredFee = cachedFees.find(\n cachedFee =>\n !cachedFeeUnavailableOrExpired(cachedFee, chain, useRelayAdapt),\n );\n return availableUnexpiredFee != null;\n }\n\n static addAuthorizedFees(\n signerAddress: string,\n tokenFeeMap: MapType<CachedTokenFee>,\n ) {\n const newFees = Object.entries(tokenFeeMap);\n const signerAddressLC = signerAddress.toLowerCase();\n this.authorizedFees[signerAddressLC] ??= {};\n\n const updatedTokens: string[] = [];\n\n for (const [tokenAddress, feeMap] of newFees) {\n const tokenAddressLC = tokenAddress.toLowerCase();\n const existing = this.authorizedFees[signerAddressLC][tokenAddressLC];\n if (existing && existing.expiration >= feeMap.expiration) {\n continue;\n }\n this.authorizedFees[signerAddressLC][tokenAddressLC] = feeMap;\n updatedTokens.push(tokenAddressLC);\n }\n this.updateAverageAuthorizedFees(updatedTokens);\n }\n\n private static updateAverageAuthorizedFees(tokenAddresses: string[]) {\n const trustedSigners = BroadcasterConfig.trustedFeeSigner;\n const isTrustedSignerConfigured =\n trustedSigners != null &&\n (typeof trustedSigners === 'string' || trustedSigners.length > 0);\n\n tokenAddresses.forEach(tokenAddressLC => {\n const authorizedFeesForToken: CachedTokenFee[] = [];\n\n Object.keys(this.authorizedFees).forEach(signerAddress => {\n if (isTrustedSignerConfigured) {\n if (typeof trustedSigners === 'string') {\n if (signerAddress !== trustedSigners.toLowerCase()) {\n return;\n }\n } else if (Array.isArray(trustedSigners)) {\n if (\n !trustedSigners\n .map(s => s.toLowerCase())\n .includes(signerAddress.toLowerCase())\n ) {\n return;\n }\n }\n }\n\n const fee = this.authorizedFees[signerAddress][tokenAddressLC];\n if (fee) {\n if (cachedFeeExpired(fee.expiration)) {\n delete this.authorizedFees[signerAddress][tokenAddressLC];\n return;\n }\n authorizedFeesForToken.push(fee);\n }\n });\n\n if (authorizedFeesForToken.length === 0) {\n delete this.averageAuthorizedFees[tokenAddressLC];\n return;\n }\n\n if (authorizedFeesForToken.length === 1) {\n this.averageAuthorizedFees[tokenAddressLC] = authorizedFeesForToken[0];\n return;\n }\n\n let totalFee = 0n;\n authorizedFeesForToken.forEach(fee => {\n totalFee += BigInt(fee.feePerUnitGas);\n });\n const averageFee = totalFee / BigInt(authorizedFeesForToken.length);\n\n const baseFee = authorizedFeesForToken[0];\n this.averageAuthorizedFees[tokenAddressLC] = {\n ...baseFee,\n feePerUnitGas: '0x' + averageFee.toString(16),\n };\n });\n }\n\n static getAuthorizedFee(tokenAddress: string): Optional<CachedTokenFee> {\n return this.averageAuthorizedFees[tokenAddress.toLowerCase()];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"broadcaster-fee-cache.js","sourceRoot":"","sources":["../../src/fees/broadcaster-fee-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CachedTokenFee,\n Chain,\n networkForChain,\n} from '@railgun-community/shared-models';\nimport { AddressFilter } from '../filters/address-filter.js';\nimport { BroadcasterConfig } from '../models/broadcaster-config.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport {\n nameForBroadcaster,\n cachedFeeExpired,\n DEFAULT_BROADCASTER_IDENTIFIER,\n invalidBroadcasterVersion,\n cachedFeeUnavailableOrExpired,\n} from '../utils/broadcaster-util.js';\n\n// {forNetwork: {forToken: {forBroadcaster: (fee, updatedAt)}}}\ntype BroadcasterFeeNetworkTokenBroadcasterCacheMap = {\n forIdentifier: MapType<CachedTokenFee>;\n};\ntype BroadcasterFeeNetworkTokenCacheMap = {\n forBroadcaster: MapType<BroadcasterFeeNetworkTokenBroadcasterCacheMap>;\n};\ntype BroadcasterFeeNetworkCacheMap = {\n forToken: MapType<BroadcasterFeeNetworkTokenCacheMap>;\n};\nexport type BroadcasterFeeCacheState = {\n forNetwork: MapType<BroadcasterFeeNetworkCacheMap>;\n};\n\nexport class BroadcasterFeeCache {\n private static cache: BroadcasterFeeCacheState = { forNetwork: {} };\n // signerAddress -> tokenAddress -> fee\n private static authorizedFees: MapType<MapType<CachedTokenFee>> = {};\n // tokenAddress -> fee (average)\n private static averageAuthorizedFees: MapType<CachedTokenFee> = {};\n static lastSubscribedFeeMessageReceivedAt: Optional<number>;\n private static poiActiveListKeys: Optional<string[]>;\n\n static init(poiActiveListKeys: string[]) {\n this.poiActiveListKeys = poiActiveListKeys;\n this.lastSubscribedFeeMessageReceivedAt = Date.now();\n }\n\n static addTokenFees(\n chain: Chain,\n railgunAddress: string,\n feeExpiration: number,\n tokenFeeMap: MapType<CachedTokenFee>,\n identifier: Optional<string>,\n version: string,\n requiredPOIListKeys: string[],\n ) {\n const network = networkForChain(chain);\n if (!network) {\n return;\n }\n\n if (!this.poiActiveListKeys) {\n throw new Error(\n 'Must define active POI list keys before adding any fees.',\n );\n }\n for (const listKey of requiredPOIListKeys) {\n if (!this.poiActiveListKeys.includes(listKey)) {\n BroadcasterDebug.log(\n `[Fees] Broadcaster ${railgunAddress} requires POI list key ${listKey}, which is not active.`,\n );\n return;\n }\n }\n\n const broadcasterName = nameForBroadcaster(railgunAddress, identifier);\n const networkName = network.name;\n\n if (invalidBroadcasterVersion(version)) {\n BroadcasterDebug.log(\n `[Fees] Broadcaster version ${version} invalid (req ${BroadcasterConfig.MINIMUM_BROADCASTER_VERSION}-${BroadcasterConfig.MAXIMUM_BROADCASTER_VERSION}): ${broadcasterName}`,\n );\n return;\n }\n\n if (cachedFeeExpired(feeExpiration)) {\n BroadcasterDebug.log(\n `[Fees] Fees expired for ${networkName} (${broadcasterName})`,\n );\n return;\n }\n\n const tokenAddresses = Object.keys(tokenFeeMap);\n BroadcasterDebug.log(\n `[Fees] Updating fees for ${networkName} (${broadcasterName}): ${tokenAddresses.length} tokens`,\n );\n\n this.cache.forNetwork[networkName] ??= { forToken: {} };\n\n const tokenAddressesLowercase = tokenAddresses.map(address =>\n address.toLowerCase(),\n );\n tokenAddressesLowercase.forEach(tokenAddress => {\n this.cache.forNetwork[networkName].forToken[tokenAddress] ??= {\n forBroadcaster: {},\n };\n this.cache.forNetwork[networkName].forToken[tokenAddress].forBroadcaster[\n railgunAddress\n ] ??= { forIdentifier: {} };\n\n this.cache.forNetwork[networkName].forToken[tokenAddress].forBroadcaster[\n railgunAddress\n ].forIdentifier[identifier ?? DEFAULT_BROADCASTER_IDENTIFIER] =\n tokenFeeMap[tokenAddress];\n });\n BroadcasterFeeCache.lastSubscribedFeeMessageReceivedAt = Date.now();\n }\n\n static resetCache(chain: Chain) {\n const network = networkForChain(chain);\n if (!network) {\n return;\n }\n this.cache.forNetwork ??= {};\n delete this.cache.forNetwork[network.name];\n }\n\n static feesForChain(chain: Chain): Optional<BroadcasterFeeNetworkCacheMap> {\n const network = networkForChain(chain);\n if (!network) {\n throw new Error('Chain not found.');\n }\n return this.cache.forNetwork[network.name];\n }\n\n static feesForToken(\n chain: Chain,\n tokenAddress: string,\n ): Optional<BroadcasterFeeNetworkTokenCacheMap> {\n return this.feesForChain(chain)?.forToken[tokenAddress.toLowerCase()];\n }\n\n static supportsToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n use7702Only = false,\n ): boolean {\n const feesForToken = this.feesForToken(chain, tokenAddress);\n if (!feesForToken) {\n return false;\n }\n\n const railgunAddresses = Object.keys(feesForToken.forBroadcaster);\n const filteredRailgunAddresses = AddressFilter.filter(railgunAddresses);\n\n const cachedFees: CachedTokenFee[] = filteredRailgunAddresses\n .map(railgunAddress =>\n Object.values(\n feesForToken.forBroadcaster[railgunAddress].forIdentifier,\n ),\n )\n .flat();\n\n const availableUnexpiredFee = cachedFees.find(\n cachedFee =>\n !cachedFeeUnavailableOrExpired(\n cachedFee,\n chain,\n useRelayAdapt,\n use7702Only,\n ),\n );\n return availableUnexpiredFee != null;\n }\n\n static addAuthorizedFees(\n signerAddress: string,\n tokenFeeMap: MapType<CachedTokenFee>,\n ) {\n const newFees = Object.entries(tokenFeeMap);\n const signerAddressLC = signerAddress.toLowerCase();\n this.authorizedFees[signerAddressLC] ??= {};\n\n const updatedTokens: string[] = [];\n\n for (const [tokenAddress, feeMap] of newFees) {\n const tokenAddressLC = tokenAddress.toLowerCase();\n const existing = this.authorizedFees[signerAddressLC][tokenAddressLC];\n if (existing && existing.expiration >= feeMap.expiration) {\n continue;\n }\n this.authorizedFees[signerAddressLC][tokenAddressLC] = feeMap;\n updatedTokens.push(tokenAddressLC);\n }\n this.updateAverageAuthorizedFees(updatedTokens);\n }\n\n private static updateAverageAuthorizedFees(tokenAddresses: string[]) {\n const trustedSigners = BroadcasterConfig.trustedFeeSigner;\n const isTrustedSignerConfigured =\n trustedSigners != null &&\n (typeof trustedSigners === 'string' || trustedSigners.length > 0);\n\n tokenAddresses.forEach(tokenAddressLC => {\n const authorizedFeesForToken: CachedTokenFee[] = [];\n\n Object.keys(this.authorizedFees).forEach(signerAddress => {\n if (isTrustedSignerConfigured) {\n if (typeof trustedSigners === 'string') {\n if (signerAddress !== trustedSigners.toLowerCase()) {\n return;\n }\n } else if (Array.isArray(trustedSigners)) {\n if (\n !trustedSigners\n .map(s => s.toLowerCase())\n .includes(signerAddress.toLowerCase())\n ) {\n return;\n }\n }\n }\n\n const fee = this.authorizedFees[signerAddress][tokenAddressLC];\n if (fee) {\n if (cachedFeeExpired(fee.expiration)) {\n delete this.authorizedFees[signerAddress][tokenAddressLC];\n return;\n }\n authorizedFeesForToken.push(fee);\n }\n });\n\n if (authorizedFeesForToken.length === 0) {\n delete this.averageAuthorizedFees[tokenAddressLC];\n return;\n }\n\n if (authorizedFeesForToken.length === 1) {\n this.averageAuthorizedFees[tokenAddressLC] = authorizedFeesForToken[0];\n return;\n }\n\n let totalFee = 0n;\n authorizedFeesForToken.forEach(fee => {\n totalFee += BigInt(fee.feePerUnitGas);\n });\n const averageFee = totalFee / BigInt(authorizedFeesForToken.length);\n\n const baseFee = authorizedFeesForToken[0];\n this.averageAuthorizedFees[tokenAddressLC] = {\n ...baseFee,\n feePerUnitGas: '0x' + averageFee.toString(16),\n };\n });\n }\n\n static getAuthorizedFee(tokenAddress: string): Optional<CachedTokenFee> {\n return this.averageAuthorizedFees[tokenAddress.toLowerCase()];\n }\n}\n"]}
|
|
@@ -8,6 +8,8 @@ export const handleAuthorizedFees = (feeMessageData, signerAddress) => {
|
|
|
8
8
|
}
|
|
9
9
|
const tokenFeeMap = {};
|
|
10
10
|
const tokenAddresses = Object.keys(feeMessageData.fees);
|
|
11
|
+
const relayAdapt = feeMessageData.relayAdapt ?? feeMessageData.relayAdapt7702;
|
|
12
|
+
const relayAdapt7702 = feeMessageData.relayAdapt7702 ?? feeMessageData.relayAdapt;
|
|
11
13
|
tokenAddresses.forEach(tokenAddress => {
|
|
12
14
|
const feePerUnitGas = feeMessageData.fees[tokenAddress];
|
|
13
15
|
if (feePerUnitGas) {
|
|
@@ -16,7 +18,8 @@ export const handleAuthorizedFees = (feeMessageData, signerAddress) => {
|
|
|
16
18
|
expiration: feeMessageData.feeExpiration,
|
|
17
19
|
feesID: feeMessageData.feesID,
|
|
18
20
|
availableWallets: feeMessageData.availableWallets,
|
|
19
|
-
relayAdapt
|
|
21
|
+
relayAdapt,
|
|
22
|
+
relayAdapt7702,
|
|
20
23
|
reliability: feeMessageData.reliability,
|
|
21
24
|
};
|
|
22
25
|
tokenFeeMap[tokenAddress] = cachedFee;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-authorized-fees-message.js","sourceRoot":"","sources":["../../src/fees/handle-authorized-fees-message.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,cAAyC,EACzC,aAAqB,EACrB,EAAE;IACF,IAAI,CAAC;QACH,IAAI,gBAAgB,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;YACnD,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAA4B,EAAE,CAAC;QAChD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACxD,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;YACpC,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACxD,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAmB;oBAChC,aAAa;oBACb,UAAU,EAAE,cAAc,CAAC,aAAa;oBACxC,MAAM,EAAE,cAAc,CAAC,MAAM;oBAC7B,gBAAgB,EAAE,cAAc,CAAC,gBAAgB;oBACjD,UAAU,
|
|
1
|
+
{"version":3,"file":"handle-authorized-fees-message.js","sourceRoot":"","sources":["../../src/fees/handle-authorized-fees-message.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,cAAyC,EACzC,aAAqB,EACrB,EAAE;IACF,IAAI,CAAC;QACH,IAAI,gBAAgB,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;YACnD,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAA4B,EAAE,CAAC;QAChD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,IAAI,cAAc,CAAC,cAAc,CAAC;QAC9E,MAAM,cAAc,GAClB,cAAc,CAAC,cAAc,IAAI,cAAc,CAAC,UAAU,CAAC;QAC7D,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;YACpC,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACxD,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAmB;oBAChC,aAAa;oBACb,UAAU,EAAE,cAAc,CAAC,aAAa;oBACxC,MAAM,EAAE,cAAc,CAAC,MAAM;oBAC7B,gBAAgB,EAAE,cAAc,CAAC,gBAAgB;oBACjD,UAAU;oBACV,cAAc;oBACd,WAAW,EAAE,cAAc,CAAC,WAAW;iBACxC,CAAC;gBACF,WAAW,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;YACxC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,mBAAmB,CAAC,iBAAiB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YAClE,gBAAgB,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gBAAgB,CAAC,KAAK,CAAC,GAAY,CAAC,CAAC;IACvC,CAAC;AACH,CAAC,CAAC","sourcesContent":["import {\n BroadcasterFeeMessageData,\n CachedTokenFee,\n} from '@railgun-community/shared-models';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { BroadcasterFeeCache } from './broadcaster-fee-cache.js';\nimport { cachedFeeExpired } from '../utils/broadcaster-util.js';\n\nexport const handleAuthorizedFees = (\n feeMessageData: BroadcasterFeeMessageData,\n signerAddress: string,\n) => {\n try {\n if (cachedFeeExpired(feeMessageData.feeExpiration)) {\n return;\n }\n\n const tokenFeeMap: MapType<CachedTokenFee> = {};\n const tokenAddresses = Object.keys(feeMessageData.fees);\n const relayAdapt = feeMessageData.relayAdapt ?? feeMessageData.relayAdapt7702;\n const relayAdapt7702 =\n feeMessageData.relayAdapt7702 ?? feeMessageData.relayAdapt;\n tokenAddresses.forEach(tokenAddress => {\n const feePerUnitGas = feeMessageData.fees[tokenAddress];\n if (feePerUnitGas) {\n const cachedFee: CachedTokenFee = {\n feePerUnitGas,\n expiration: feeMessageData.feeExpiration,\n feesID: feeMessageData.feesID,\n availableWallets: feeMessageData.availableWallets,\n relayAdapt,\n relayAdapt7702,\n reliability: feeMessageData.reliability,\n };\n tokenFeeMap[tokenAddress] = cachedFee;\n }\n });\n\n if (Object.keys(tokenFeeMap).length > 0) {\n BroadcasterFeeCache.addAuthorizedFees(signerAddress, tokenFeeMap);\n BroadcasterDebug.log('Updated Authorized Fees');\n }\n } catch (err) {\n BroadcasterDebug.error(err as Error);\n }\n};\n"]}
|
|
@@ -117,7 +117,8 @@ const updateFeesForBroadcaster = (chain, feeMessageData) => {
|
|
|
117
117
|
expiration: feeMessageData.feeExpiration,
|
|
118
118
|
feesID: feeMessageData.feesID,
|
|
119
119
|
availableWallets: feeMessageData.availableWallets,
|
|
120
|
-
relayAdapt: feeMessageData.relayAdapt,
|
|
120
|
+
relayAdapt: feeMessageData.relayAdapt ?? feeMessageData.relayAdapt7702,
|
|
121
|
+
relayAdapt7702: feeMessageData.relayAdapt7702 ?? feeMessageData.relayAdapt,
|
|
121
122
|
reliability: feeMessageData.reliability,
|
|
122
123
|
};
|
|
123
124
|
tokenFeeMap[tokenAddress] = cachedFee;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-fees-message.js","sourceRoot":"","sources":["../../src/fees/handle-fees-message.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n verifyBroadcasterSignature,\n getRailgunWalletAddressData,\n} from '@railgun-community/wallet';\nimport {\n CachedTokenFee,\n Chain,\n BroadcasterFeeMessageData,\n} from '@railgun-community/shared-models';\nimport crypto from 'crypto';\nimport { type IMessage } from '@waku/sdk';\nimport { contentTopics } from '../waku/waku-topics.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { BroadcasterConfig } from '../models/broadcaster-config.js';\nimport { BroadcasterFeeCache } from './broadcaster-fee-cache.js';\nimport { invalidBroadcasterVersion } from '../utils/broadcaster-util.js';\nimport { bytesToUtf8, hexToUTF8String } from '../utils/conversion.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport { handleAuthorizedFees } from './handle-authorized-fees-message.js';\n\nconst isExpiredTimestamp = (\n timestamp: Optional<Date>,\n expirationFeeTimestamp: Optional<Date>,\n) => {\n if (!timestamp || !expirationFeeTimestamp) {\n return false;\n }\n let messageTimestamp = timestamp;\n if (messageTimestamp.getFullYear() === 1970) {\n // Waku timestamp bug. -- should be no longer an issue. \n messageTimestamp = new Date(messageTimestamp.getTime() * 1000);\n }\n // Expired if message originated > 45 seconds ago.\n // check if fee expires within 45 seconds; if it doesn't ignore it.\n const nowTime = Date.now();\n const expirationMsec = nowTime - 45 * 1000;\n const expirationFeeMsec = nowTime + 45 * 1000;\n const timestampExpired = messageTimestamp.getTime() < expirationMsec;\n if (timestampExpired) {\n BroadcasterDebug.log(\n `Broadcaster Fee STALE: Difference was ${(Date.now() - messageTimestamp.getTime()) / 1000\n }s`,\n );\n } else {\n BroadcasterDebug.log(\n `Broadcaster Fee receipt SUCCESS in ${(Date.now() - messageTimestamp.getTime()) / 1000\n }s`,\n );\n }\n const feeExpired = expirationFeeTimestamp.getTime() < expirationFeeMsec;\n return timestampExpired && feeExpired;\n};\n\nexport const handleBroadcasterFeesMessage = async (\n chain: Chain,\n message: IMessage,\n contentTopic: string,\n) => {\n try {\n if (!isDefined(message.payload)) {\n BroadcasterDebug.log('Skipping Broadcaster fees message: NO PAYLOAD');\n return;\n }\n if (contentTopic !== contentTopics.fees(chain)) {\n BroadcasterDebug.log('Skipping Broadcaster fees message: WRONG TOPIC');\n return;\n }\n const payload = bytesToUtf8(message.payload);\n const { data, signature } = JSON.parse(payload) as {\n data: string;\n signature: string;\n };\n const utf8String = hexToUTF8String(data);\n const feeMessageData = JSON.parse(utf8String) as BroadcasterFeeMessageData;\n const feeExpirationTime = new Date(feeMessageData.feeExpiration);\n if (isExpiredTimestamp(message.timestamp, feeExpirationTime)) {\n BroadcasterDebug.log('Skipping fee message. Timestamp Expired.');\n return;\n }\n\n if (!isDefined(crypto.subtle) && BroadcasterConfig.IS_DEV) {\n BroadcasterDebug.log(\n 'Skipping Broadcaster fee validation in DEV. `crypto.subtle` does not exist (not secure: use https or localhost). ',\n );\n updateFeesForBroadcaster(chain, feeMessageData);\n return;\n }\n\n if (invalidBroadcasterVersion(feeMessageData.version)) {\n BroadcasterDebug.log(\n `Skipping Broadcaster outside version range: ${feeMessageData.version}, ${feeMessageData.railgunAddress}`,\n );\n return;\n }\n\n const { railgunAddress } = feeMessageData;\n const { viewingPublicKey } = getRailgunWalletAddressData(railgunAddress);\n const verified = await verifyBroadcasterSignature(\n signature,\n data,\n viewingPublicKey,\n );\n if (!verified) {\n return;\n }\n\n updateFeesForBroadcaster(chain, feeMessageData);\n } catch (cause) {\n if (!(cause instanceof Error)) {\n throw new Error('Unexpected non-error thrown', { cause });\n }\n }\n};\n\nconst updateFeesForBroadcaster = (\n chain: Chain,\n feeMessageData: BroadcasterFeeMessageData,\n) => {\n const tokenFeeMap: MapType<CachedTokenFee> = {};\n const tokenAddresses = Object.keys(feeMessageData.fees);\n\n let isTrustedSigner = false;\n if (BroadcasterConfig.trustedFeeSigner) {\n if (typeof BroadcasterConfig.trustedFeeSigner === 'string') {\n isTrustedSigner =\n feeMessageData.railgunAddress.toLowerCase() ===\n BroadcasterConfig.trustedFeeSigner.toLowerCase();\n } else {\n isTrustedSigner = BroadcasterConfig.trustedFeeSigner.map(s =>\n s.toLowerCase(),\n ).includes(feeMessageData.railgunAddress.toLowerCase());\n }\n }\n\n if (isTrustedSigner) {\n handleAuthorizedFees(feeMessageData, feeMessageData.railgunAddress);\n }\n\n tokenAddresses.forEach(tokenAddress => {\n const feePerUnitGas = feeMessageData.fees[tokenAddress];\n if (feePerUnitGas) {\n if (!isTrustedSigner && BroadcasterConfig.trustedFeeSigner) {\n const authorizedFee = BroadcasterFeeCache.getAuthorizedFee(\n tokenAddress.toLowerCase(),\n );\n if (authorizedFee) {\n const authorizedFeeAmount = BigInt(authorizedFee.feePerUnitGas);\n const varianceLower =\n (authorizedFeeAmount *\n BigInt(\n Math.round(\n BroadcasterConfig.authorizedFeeVariancePercentageLower * 100,\n ),\n )) /\n 100n;\n const varianceUpper =\n (authorizedFeeAmount *\n BigInt(\n Math.round(\n BroadcasterConfig.authorizedFeeVariancePercentageUpper * 100,\n ),\n )) /\n 100n;\n const minFee = authorizedFeeAmount - varianceLower;\n const maxFee = authorizedFeeAmount + varianceUpper;\n\n const feeAmount = BigInt(feePerUnitGas);\n if (feeAmount < minFee || feeAmount > maxFee) {\n return;\n }\n } else {\n // No authorized fee, and we require one.\n return;\n }\n }\n\n const cachedFee: CachedTokenFee = {\n feePerUnitGas,\n expiration: feeMessageData.feeExpiration,\n feesID: feeMessageData.feesID,\n availableWallets: feeMessageData.availableWallets,\n relayAdapt: feeMessageData.relayAdapt,\n reliability: feeMessageData.reliability,\n };\n tokenFeeMap[tokenAddress] = cachedFee;\n }\n });\n\n if (Object.keys(tokenFeeMap).length > 0) {\n BroadcasterFeeCache.addTokenFees(\n chain,\n feeMessageData.railgunAddress,\n feeMessageData.feeExpiration,\n tokenFeeMap,\n feeMessageData.identifier,\n feeMessageData.version,\n feeMessageData.requiredPOIListKeys ?? [],\n );\n }\n};\n"]}
|
|
1
|
+
{"version":3,"file":"handle-fees-message.js","sourceRoot":"","sources":["../../src/fees/handle-fees-message.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n verifyBroadcasterSignature,\n getRailgunWalletAddressData,\n} from '@railgun-community/wallet';\nimport {\n CachedTokenFee,\n Chain,\n BroadcasterFeeMessageData,\n} from '@railgun-community/shared-models';\nimport crypto from 'crypto';\nimport { type IMessage } from '@waku/sdk';\nimport { contentTopics } from '../waku/waku-topics.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { BroadcasterConfig } from '../models/broadcaster-config.js';\nimport { BroadcasterFeeCache } from './broadcaster-fee-cache.js';\nimport { invalidBroadcasterVersion } from '../utils/broadcaster-util.js';\nimport { bytesToUtf8, hexToUTF8String } from '../utils/conversion.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport { handleAuthorizedFees } from './handle-authorized-fees-message.js';\n\nconst isExpiredTimestamp = (\n timestamp: Optional<Date>,\n expirationFeeTimestamp: Optional<Date>,\n) => {\n if (!timestamp || !expirationFeeTimestamp) {\n return false;\n }\n let messageTimestamp = timestamp;\n if (messageTimestamp.getFullYear() === 1970) {\n // Waku timestamp bug. -- should be no longer an issue. \n messageTimestamp = new Date(messageTimestamp.getTime() * 1000);\n }\n // Expired if message originated > 45 seconds ago.\n // check if fee expires within 45 seconds; if it doesn't ignore it.\n const nowTime = Date.now();\n const expirationMsec = nowTime - 45 * 1000;\n const expirationFeeMsec = nowTime + 45 * 1000;\n const timestampExpired = messageTimestamp.getTime() < expirationMsec;\n if (timestampExpired) {\n BroadcasterDebug.log(\n `Broadcaster Fee STALE: Difference was ${(Date.now() - messageTimestamp.getTime()) / 1000\n }s`,\n );\n } else {\n BroadcasterDebug.log(\n `Broadcaster Fee receipt SUCCESS in ${(Date.now() - messageTimestamp.getTime()) / 1000\n }s`,\n );\n }\n const feeExpired = expirationFeeTimestamp.getTime() < expirationFeeMsec;\n return timestampExpired && feeExpired;\n};\n\nexport const handleBroadcasterFeesMessage = async (\n chain: Chain,\n message: IMessage,\n contentTopic: string,\n) => {\n try {\n if (!isDefined(message.payload)) {\n BroadcasterDebug.log('Skipping Broadcaster fees message: NO PAYLOAD');\n return;\n }\n if (contentTopic !== contentTopics.fees(chain)) {\n BroadcasterDebug.log('Skipping Broadcaster fees message: WRONG TOPIC');\n return;\n }\n const payload = bytesToUtf8(message.payload);\n const { data, signature } = JSON.parse(payload) as {\n data: string;\n signature: string;\n };\n const utf8String = hexToUTF8String(data);\n const feeMessageData = JSON.parse(utf8String) as BroadcasterFeeMessageData;\n const feeExpirationTime = new Date(feeMessageData.feeExpiration);\n if (isExpiredTimestamp(message.timestamp, feeExpirationTime)) {\n BroadcasterDebug.log('Skipping fee message. Timestamp Expired.');\n return;\n }\n\n if (!isDefined(crypto.subtle) && BroadcasterConfig.IS_DEV) {\n BroadcasterDebug.log(\n 'Skipping Broadcaster fee validation in DEV. `crypto.subtle` does not exist (not secure: use https or localhost). ',\n );\n updateFeesForBroadcaster(chain, feeMessageData);\n return;\n }\n\n if (invalidBroadcasterVersion(feeMessageData.version)) {\n BroadcasterDebug.log(\n `Skipping Broadcaster outside version range: ${feeMessageData.version}, ${feeMessageData.railgunAddress}`,\n );\n return;\n }\n\n const { railgunAddress } = feeMessageData;\n const { viewingPublicKey } = getRailgunWalletAddressData(railgunAddress);\n const verified = await verifyBroadcasterSignature(\n signature,\n data,\n viewingPublicKey,\n );\n if (!verified) {\n return;\n }\n\n updateFeesForBroadcaster(chain, feeMessageData);\n } catch (cause) {\n if (!(cause instanceof Error)) {\n throw new Error('Unexpected non-error thrown', { cause });\n }\n }\n};\n\nconst updateFeesForBroadcaster = (\n chain: Chain,\n feeMessageData: BroadcasterFeeMessageData,\n) => {\n const tokenFeeMap: MapType<CachedTokenFee> = {};\n const tokenAddresses = Object.keys(feeMessageData.fees);\n\n let isTrustedSigner = false;\n if (BroadcasterConfig.trustedFeeSigner) {\n if (typeof BroadcasterConfig.trustedFeeSigner === 'string') {\n isTrustedSigner =\n feeMessageData.railgunAddress.toLowerCase() ===\n BroadcasterConfig.trustedFeeSigner.toLowerCase();\n } else {\n isTrustedSigner = BroadcasterConfig.trustedFeeSigner.map(s =>\n s.toLowerCase(),\n ).includes(feeMessageData.railgunAddress.toLowerCase());\n }\n }\n\n if (isTrustedSigner) {\n handleAuthorizedFees(feeMessageData, feeMessageData.railgunAddress);\n }\n\n tokenAddresses.forEach(tokenAddress => {\n const feePerUnitGas = feeMessageData.fees[tokenAddress];\n if (feePerUnitGas) {\n if (!isTrustedSigner && BroadcasterConfig.trustedFeeSigner) {\n const authorizedFee = BroadcasterFeeCache.getAuthorizedFee(\n tokenAddress.toLowerCase(),\n );\n if (authorizedFee) {\n const authorizedFeeAmount = BigInt(authorizedFee.feePerUnitGas);\n const varianceLower =\n (authorizedFeeAmount *\n BigInt(\n Math.round(\n BroadcasterConfig.authorizedFeeVariancePercentageLower * 100,\n ),\n )) /\n 100n;\n const varianceUpper =\n (authorizedFeeAmount *\n BigInt(\n Math.round(\n BroadcasterConfig.authorizedFeeVariancePercentageUpper * 100,\n ),\n )) /\n 100n;\n const minFee = authorizedFeeAmount - varianceLower;\n const maxFee = authorizedFeeAmount + varianceUpper;\n\n const feeAmount = BigInt(feePerUnitGas);\n if (feeAmount < minFee || feeAmount > maxFee) {\n return;\n }\n } else {\n // No authorized fee, and we require one.\n return;\n }\n }\n\n const cachedFee: CachedTokenFee = {\n feePerUnitGas,\n expiration: feeMessageData.feeExpiration,\n feesID: feeMessageData.feesID,\n availableWallets: feeMessageData.availableWallets,\n relayAdapt:\n feeMessageData.relayAdapt ?? feeMessageData.relayAdapt7702,\n relayAdapt7702:\n feeMessageData.relayAdapt7702 ?? feeMessageData.relayAdapt,\n reliability: feeMessageData.reliability,\n };\n tokenFeeMap[tokenAddress] = cachedFee;\n }\n });\n\n if (Object.keys(tokenFeeMap).length > 0) {\n BroadcasterFeeCache.addTokenFees(\n chain,\n feeMessageData.railgunAddress,\n feeMessageData.feeExpiration,\n tokenFeeMap,\n feeMessageData.identifier,\n feeMessageData.version,\n feeMessageData.requiredPOIListKeys ?? [],\n );\n }\n};\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Chain, SelectedBroadcaster } from '@railgun-community/shared-models';
|
|
2
2
|
export declare class BroadcasterSearch {
|
|
3
|
-
static findBroadcastersForToken(chain: Chain, tokenAddress: string, useRelayAdapt: boolean, ignoreMissingAuthorizedFee?: boolean): Optional<SelectedBroadcaster[]>;
|
|
4
|
-
static findAllBroadcastersForChain(chain: Chain, useRelayAdapt: boolean, ignoreMissingAuthorizedFee?: boolean): Optional<SelectedBroadcaster[]>;
|
|
5
|
-
static findRandomBroadcasterForToken(chain: Chain, tokenAddress: string, useRelayAdapt: boolean, percentageThreshold: number): Optional<SelectedBroadcaster>;
|
|
6
|
-
static findBestBroadcaster(chain: Chain, tokenAddress: string, useRelayAdapt: boolean): Optional<SelectedBroadcaster>;
|
|
3
|
+
static findBroadcastersForToken(chain: Chain, tokenAddress: string, useRelayAdapt: boolean, ignoreMissingAuthorizedFee?: boolean, use7702Only?: boolean): Optional<SelectedBroadcaster[]>;
|
|
4
|
+
static findAllBroadcastersForChain(chain: Chain, useRelayAdapt: boolean, ignoreMissingAuthorizedFee?: boolean, use7702Only?: boolean): Optional<SelectedBroadcaster[]>;
|
|
5
|
+
static findRandomBroadcasterForToken(chain: Chain, tokenAddress: string, useRelayAdapt: boolean, percentageThreshold: number, use7702Only?: boolean): Optional<SelectedBroadcaster>;
|
|
6
|
+
static findBestBroadcaster(chain: Chain, tokenAddress: string, useRelayAdapt: boolean, use7702Only?: boolean): Optional<SelectedBroadcaster>;
|
|
7
7
|
}
|
|
@@ -12,7 +12,7 @@ const SelectedBroadcasterAscendingFee = (a, b) => {
|
|
|
12
12
|
return feeAmount > BigInt(0) ? 1 : -1;
|
|
13
13
|
};
|
|
14
14
|
export class BroadcasterSearch {
|
|
15
|
-
static findBroadcastersForToken(chain, tokenAddress, useRelayAdapt, ignoreMissingAuthorizedFee = false) {
|
|
15
|
+
static findBroadcastersForToken(chain, tokenAddress, useRelayAdapt, ignoreMissingAuthorizedFee = false, use7702Only = false) {
|
|
16
16
|
const tokenAddressLowercase = tokenAddress.toLowerCase();
|
|
17
17
|
const broadcasterTokenFees = BroadcasterFeeCache.feesForChain(chain)?.forToken[tokenAddressLowercase]
|
|
18
18
|
?.forBroadcaster;
|
|
@@ -51,7 +51,7 @@ export class BroadcasterSearch {
|
|
|
51
51
|
const identifiers = Object.keys(broadcasterTokenFees[broadcasterAddress].forIdentifier);
|
|
52
52
|
identifiers.forEach((identifier) => {
|
|
53
53
|
const nextCachedFee = broadcasterTokenFees[broadcasterAddress].forIdentifier[identifier];
|
|
54
|
-
if (cachedFeeUnavailableOrExpired(nextCachedFee, chain, useRelayAdapt)) {
|
|
54
|
+
if (cachedFeeUnavailableOrExpired(nextCachedFee, chain, useRelayAdapt, use7702Only)) {
|
|
55
55
|
return;
|
|
56
56
|
}
|
|
57
57
|
if (isDefined(minFee) && isDefined(maxFee)) {
|
|
@@ -71,7 +71,7 @@ export class BroadcasterSearch {
|
|
|
71
71
|
selectedBroadcasters.sort((a, b) => b.tokenFee.reliability - a.tokenFee.reliability);
|
|
72
72
|
return selectedBroadcasters;
|
|
73
73
|
}
|
|
74
|
-
static findAllBroadcastersForChain(chain, useRelayAdapt, ignoreMissingAuthorizedFee = false) {
|
|
74
|
+
static findAllBroadcastersForChain(chain, useRelayAdapt, ignoreMissingAuthorizedFee = false, use7702Only = false) {
|
|
75
75
|
const broadcasterTokenFees = BroadcasterFeeCache.feesForChain(chain)?.forToken;
|
|
76
76
|
if (!isDefined(broadcasterTokenFees)) {
|
|
77
77
|
return undefined;
|
|
@@ -79,7 +79,7 @@ export class BroadcasterSearch {
|
|
|
79
79
|
const allTokens = Object.keys(broadcasterTokenFees);
|
|
80
80
|
const selectedBroadcasters = [];
|
|
81
81
|
allTokens.forEach((tokenAddress) => {
|
|
82
|
-
const broadcastersForToken = this.findBroadcastersForToken(chain, tokenAddress, useRelayAdapt, ignoreMissingAuthorizedFee);
|
|
82
|
+
const broadcastersForToken = this.findBroadcastersForToken(chain, tokenAddress, useRelayAdapt, ignoreMissingAuthorizedFee, use7702Only);
|
|
83
83
|
if (!broadcastersForToken) {
|
|
84
84
|
return;
|
|
85
85
|
}
|
|
@@ -88,12 +88,12 @@ export class BroadcasterSearch {
|
|
|
88
88
|
selectedBroadcasters.sort(SelectedBroadcasterAscendingFee);
|
|
89
89
|
return selectedBroadcasters;
|
|
90
90
|
}
|
|
91
|
-
static findRandomBroadcasterForToken(chain, tokenAddress, useRelayAdapt, percentageThreshold) {
|
|
91
|
+
static findRandomBroadcasterForToken(chain, tokenAddress, useRelayAdapt, percentageThreshold, use7702Only = false) {
|
|
92
92
|
const broadcasterTokenFees = BroadcasterFeeCache.feesForChain(chain)?.forToken;
|
|
93
93
|
if (!isDefined(broadcasterTokenFees)) {
|
|
94
94
|
return undefined;
|
|
95
95
|
}
|
|
96
|
-
const broadcastersForToken = this.findBroadcastersForToken(chain, tokenAddress, useRelayAdapt);
|
|
96
|
+
const broadcastersForToken = this.findBroadcastersForToken(chain, tokenAddress, useRelayAdapt, false, use7702Only);
|
|
97
97
|
if (!isDefined(broadcastersForToken)) {
|
|
98
98
|
return undefined;
|
|
99
99
|
}
|
|
@@ -107,12 +107,12 @@ export class BroadcasterSearch {
|
|
|
107
107
|
const randomIndex = Math.floor(Math.random() * eligibleBroadcasters.length);
|
|
108
108
|
return eligibleBroadcasters[randomIndex];
|
|
109
109
|
}
|
|
110
|
-
static findBestBroadcaster(chain, tokenAddress, useRelayAdapt) {
|
|
110
|
+
static findBestBroadcaster(chain, tokenAddress, useRelayAdapt, use7702Only = false) {
|
|
111
111
|
const broadcasterTokenFees = BroadcasterFeeCache.feesForChain(chain)?.forToken;
|
|
112
112
|
if (!isDefined(broadcasterTokenFees)) {
|
|
113
113
|
return undefined;
|
|
114
114
|
}
|
|
115
|
-
const broadcastersForToken = this.findBroadcastersForToken(chain, tokenAddress, useRelayAdapt);
|
|
115
|
+
const broadcastersForToken = this.findBroadcastersForToken(chain, tokenAddress, useRelayAdapt, false, use7702Only);
|
|
116
116
|
if (!isDefined(broadcastersForToken)) {
|
|
117
117
|
return undefined;
|
|
118
118
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"best-broadcaster.js","sourceRoot":"","sources":["../../src/search/best-broadcaster.ts"],"names":[],"mappings":"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","sourcesContent":["import { Chain, SelectedBroadcaster } from '@railgun-community/shared-models';\nimport { BroadcasterFeeCache } from '../fees/broadcaster-fee-cache.js';\nimport { AddressFilter } from '../filters/address-filter.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport {\n cachedFeeUnavailableOrExpired,\n shortenAddress,\n} from '../utils/broadcaster-util.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport { BroadcasterConfig } from '../models/broadcaster-config.js';\n\nconst SelectedBroadcasterAscendingFee = (\n a: SelectedBroadcaster,\n b: SelectedBroadcaster,\n) => {\n const feeAmount =\n BigInt(a.tokenFee.feePerUnitGas) - BigInt(b.tokenFee.feePerUnitGas);\n if (feeAmount === BigInt(0)) {\n return b.tokenFee.reliability - a.tokenFee.reliability;\n }\n return feeAmount > BigInt(0) ? 1 : -1;\n};\nexport class BroadcasterSearch {\n static findBroadcastersForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ignoreMissingAuthorizedFee = false,\n ): Optional<SelectedBroadcaster[]> {\n const tokenAddressLowercase = tokenAddress.toLowerCase();\n const broadcasterTokenFees =\n BroadcasterFeeCache.feesForChain(chain)?.forToken[tokenAddressLowercase]\n ?.forBroadcaster;\n if (!isDefined(broadcasterTokenFees)) {\n return undefined;\n }\n\n const unfilteredAddresses = Object.keys(broadcasterTokenFees);\n const broadcasterAddresses = AddressFilter.filter(unfilteredAddresses);\n if (unfilteredAddresses.length !== broadcasterAddresses.length) {\n const removedAddresses = unfilteredAddresses.filter(\n address => !broadcasterAddresses.includes(address),\n );\n BroadcasterDebug.log(\n `Filtered RAILGUN broadcaster addresses ${removedAddresses.length\n }: ${removedAddresses\n .map(address => shortenAddress(address))\n .join(', ')}`,\n );\n }\n\n const selectedBroadcasters: SelectedBroadcaster[] = [];\n\n const authorizedFee =\n BroadcasterFeeCache.getAuthorizedFee(tokenAddressLowercase);\n let minFee: bigint | undefined;\n let maxFee: bigint | undefined;\n\n if (BroadcasterConfig.trustedFeeSigner) {\n if (authorizedFee) {\n const authorizedFeeAmount = BigInt(authorizedFee.feePerUnitGas);\n const varianceLower =\n (authorizedFeeAmount *\n BigInt(\n Math.round(\n BroadcasterConfig.authorizedFeeVariancePercentageLower * 100,\n ),\n )) /\n 100n;\n const varianceUpper =\n (authorizedFeeAmount *\n BigInt(\n Math.round(\n BroadcasterConfig.authorizedFeeVariancePercentageUpper * 100,\n ),\n )) /\n 100n;\n minFee = authorizedFeeAmount - varianceLower;\n maxFee = authorizedFeeAmount + varianceUpper;\n } else if (!ignoreMissingAuthorizedFee) {\n return [];\n }\n }\n\n broadcasterAddresses.forEach((broadcasterAddress: string) => {\n const identifiers: string[] = Object.keys(\n broadcasterTokenFees[broadcasterAddress].forIdentifier,\n );\n identifiers.forEach((identifier: string) => {\n const nextCachedFee =\n broadcasterTokenFees[broadcasterAddress].forIdentifier[identifier];\n if (\n cachedFeeUnavailableOrExpired(nextCachedFee, chain, useRelayAdapt)\n ) {\n return;\n }\n\n if (isDefined(minFee) && isDefined(maxFee)) {\n const incomingFeeAmount = BigInt(nextCachedFee.feePerUnitGas);\n if (incomingFeeAmount < minFee || incomingFeeAmount > maxFee) {\n return;\n }\n }\n\n const selectedBroadcaster: SelectedBroadcaster = {\n railgunAddress: broadcasterAddress,\n tokenFee: nextCachedFee,\n tokenAddress,\n };\n selectedBroadcasters.push(selectedBroadcaster);\n });\n });\n\n // selectedBroadcasters.sort(SelectedBroadcasterAscendingFee);\n selectedBroadcasters.sort(\n (a, b) => b.tokenFee.reliability - a.tokenFee.reliability,\n );\n return selectedBroadcasters;\n }\n\n static findAllBroadcastersForChain(\n chain: Chain,\n useRelayAdapt: boolean,\n ignoreMissingAuthorizedFee = false,\n ): Optional<SelectedBroadcaster[]> {\n const broadcasterTokenFees =\n BroadcasterFeeCache.feesForChain(chain)?.forToken;\n if (!isDefined(broadcasterTokenFees)) {\n return undefined;\n }\n const allTokens = Object.keys(broadcasterTokenFees);\n const selectedBroadcasters: SelectedBroadcaster[] = [];\n allTokens.forEach((tokenAddress: string) => {\n const broadcastersForToken = this.findBroadcastersForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n ignoreMissingAuthorizedFee,\n );\n if (!broadcastersForToken) {\n return;\n }\n selectedBroadcasters.push(...broadcastersForToken);\n });\n selectedBroadcasters.sort(SelectedBroadcasterAscendingFee);\n return selectedBroadcasters;\n }\n\n static findRandomBroadcasterForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n percentageThreshold: number,\n ): Optional<SelectedBroadcaster> {\n const broadcasterTokenFees =\n BroadcasterFeeCache.feesForChain(chain)?.forToken;\n if (!isDefined(broadcasterTokenFees)) {\n return undefined;\n }\n\n const broadcastersForToken = this.findBroadcastersForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n if (!isDefined(broadcastersForToken)) {\n return undefined;\n }\n if (broadcastersForToken.length === 0) {\n return undefined;\n }\n\n const sortedBroadcasters = broadcastersForToken.sort(\n SelectedBroadcasterAscendingFee,\n );\n\n const minFee = BigInt(sortedBroadcasters[0].tokenFee.feePerUnitGas);\n const feeThreshold = (minFee * (100n + BigInt(percentageThreshold))) / 100n;\n const eligibleBroadcasters = sortedBroadcasters.filter(\n broadcaster => BigInt(broadcaster.tokenFee.feePerUnitGas) <= feeThreshold,\n );\n const randomIndex = Math.floor(Math.random() * eligibleBroadcasters.length);\n\n return eligibleBroadcasters[randomIndex];\n }\n\n static findBestBroadcaster(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster> {\n const broadcasterTokenFees =\n BroadcasterFeeCache.feesForChain(chain)?.forToken;\n if (!isDefined(broadcasterTokenFees)) {\n return undefined;\n }\n\n const broadcastersForToken = this.findBroadcastersForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n if (!isDefined(broadcastersForToken)) {\n return undefined;\n }\n\n const sortedBroadcasters = broadcastersForToken.sort(\n SelectedBroadcasterAscendingFee,\n );\n\n return sortedBroadcasters[0];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"best-broadcaster.js","sourceRoot":"","sources":["../../src/search/best-broadcaster.ts"],"names":[],"mappings":"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","sourcesContent":["import { Chain, SelectedBroadcaster } from '@railgun-community/shared-models';\nimport { BroadcasterFeeCache } from '../fees/broadcaster-fee-cache.js';\nimport { AddressFilter } from '../filters/address-filter.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport {\n cachedFeeUnavailableOrExpired,\n shortenAddress,\n} from '../utils/broadcaster-util.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport { BroadcasterConfig } from '../models/broadcaster-config.js';\n\nconst SelectedBroadcasterAscendingFee = (\n a: SelectedBroadcaster,\n b: SelectedBroadcaster,\n) => {\n const feeAmount =\n BigInt(a.tokenFee.feePerUnitGas) - BigInt(b.tokenFee.feePerUnitGas);\n if (feeAmount === BigInt(0)) {\n return b.tokenFee.reliability - a.tokenFee.reliability;\n }\n return feeAmount > BigInt(0) ? 1 : -1;\n};\nexport class BroadcasterSearch {\n static findBroadcastersForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ignoreMissingAuthorizedFee = false,\n use7702Only = false,\n ): Optional<SelectedBroadcaster[]> {\n const tokenAddressLowercase = tokenAddress.toLowerCase();\n const broadcasterTokenFees =\n BroadcasterFeeCache.feesForChain(chain)?.forToken[tokenAddressLowercase]\n ?.forBroadcaster;\n if (!isDefined(broadcasterTokenFees)) {\n return undefined;\n }\n\n const unfilteredAddresses = Object.keys(broadcasterTokenFees);\n const broadcasterAddresses = AddressFilter.filter(unfilteredAddresses);\n if (unfilteredAddresses.length !== broadcasterAddresses.length) {\n const removedAddresses = unfilteredAddresses.filter(\n address => !broadcasterAddresses.includes(address),\n );\n BroadcasterDebug.log(\n `Filtered RAILGUN broadcaster addresses ${removedAddresses.length\n }: ${removedAddresses\n .map(address => shortenAddress(address))\n .join(', ')}`,\n );\n }\n\n const selectedBroadcasters: SelectedBroadcaster[] = [];\n\n const authorizedFee =\n BroadcasterFeeCache.getAuthorizedFee(tokenAddressLowercase);\n let minFee: bigint | undefined;\n let maxFee: bigint | undefined;\n\n if (BroadcasterConfig.trustedFeeSigner) {\n if (authorizedFee) {\n const authorizedFeeAmount = BigInt(authorizedFee.feePerUnitGas);\n const varianceLower =\n (authorizedFeeAmount *\n BigInt(\n Math.round(\n BroadcasterConfig.authorizedFeeVariancePercentageLower * 100,\n ),\n )) /\n 100n;\n const varianceUpper =\n (authorizedFeeAmount *\n BigInt(\n Math.round(\n BroadcasterConfig.authorizedFeeVariancePercentageUpper * 100,\n ),\n )) /\n 100n;\n minFee = authorizedFeeAmount - varianceLower;\n maxFee = authorizedFeeAmount + varianceUpper;\n } else if (!ignoreMissingAuthorizedFee) {\n return [];\n }\n }\n\n broadcasterAddresses.forEach((broadcasterAddress: string) => {\n const identifiers: string[] = Object.keys(\n broadcasterTokenFees[broadcasterAddress].forIdentifier,\n );\n identifiers.forEach((identifier: string) => {\n const nextCachedFee =\n broadcasterTokenFees[broadcasterAddress].forIdentifier[identifier];\n if (\n cachedFeeUnavailableOrExpired(\n nextCachedFee,\n chain,\n useRelayAdapt,\n use7702Only,\n )\n ) {\n return;\n }\n\n if (isDefined(minFee) && isDefined(maxFee)) {\n const incomingFeeAmount = BigInt(nextCachedFee.feePerUnitGas);\n if (incomingFeeAmount < minFee || incomingFeeAmount > maxFee) {\n return;\n }\n }\n\n const selectedBroadcaster: SelectedBroadcaster = {\n railgunAddress: broadcasterAddress,\n tokenFee: nextCachedFee,\n tokenAddress,\n };\n selectedBroadcasters.push(selectedBroadcaster);\n });\n });\n\n // selectedBroadcasters.sort(SelectedBroadcasterAscendingFee);\n selectedBroadcasters.sort(\n (a, b) => b.tokenFee.reliability - a.tokenFee.reliability,\n );\n return selectedBroadcasters;\n }\n\n static findAllBroadcastersForChain(\n chain: Chain,\n useRelayAdapt: boolean,\n ignoreMissingAuthorizedFee = false,\n use7702Only = false,\n ): Optional<SelectedBroadcaster[]> {\n const broadcasterTokenFees =\n BroadcasterFeeCache.feesForChain(chain)?.forToken;\n if (!isDefined(broadcasterTokenFees)) {\n return undefined;\n }\n const allTokens = Object.keys(broadcasterTokenFees);\n const selectedBroadcasters: SelectedBroadcaster[] = [];\n allTokens.forEach((tokenAddress: string) => {\n const broadcastersForToken = this.findBroadcastersForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n ignoreMissingAuthorizedFee,\n use7702Only,\n );\n if (!broadcastersForToken) {\n return;\n }\n selectedBroadcasters.push(...broadcastersForToken);\n });\n selectedBroadcasters.sort(SelectedBroadcasterAscendingFee);\n return selectedBroadcasters;\n }\n\n static findRandomBroadcasterForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n percentageThreshold: number,\n use7702Only = false,\n ): Optional<SelectedBroadcaster> {\n const broadcasterTokenFees =\n BroadcasterFeeCache.feesForChain(chain)?.forToken;\n if (!isDefined(broadcasterTokenFees)) {\n return undefined;\n }\n\n const broadcastersForToken = this.findBroadcastersForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n false,\n use7702Only,\n );\n if (!isDefined(broadcastersForToken)) {\n return undefined;\n }\n if (broadcastersForToken.length === 0) {\n return undefined;\n }\n\n const sortedBroadcasters = broadcastersForToken.sort(\n SelectedBroadcasterAscendingFee,\n );\n\n const minFee = BigInt(sortedBroadcasters[0].tokenFee.feePerUnitGas);\n const feeThreshold = (minFee * (100n + BigInt(percentageThreshold))) / 100n;\n const eligibleBroadcasters = sortedBroadcasters.filter(\n broadcaster => BigInt(broadcaster.tokenFee.feePerUnitGas) <= feeThreshold,\n );\n const randomIndex = Math.floor(Math.random() * eligibleBroadcasters.length);\n\n return eligibleBroadcasters[randomIndex];\n }\n\n static findBestBroadcaster(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n use7702Only = false,\n ): Optional<SelectedBroadcaster> {\n const broadcasterTokenFees =\n BroadcasterFeeCache.feesForChain(chain)?.forToken;\n if (!isDefined(broadcasterTokenFees)) {\n return undefined;\n }\n\n const broadcastersForToken = this.findBroadcastersForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n false,\n use7702Only,\n );\n if (!isDefined(broadcastersForToken)) {\n return undefined;\n }\n\n const sortedBroadcasters = broadcastersForToken.sort(\n SelectedBroadcasterAscendingFee,\n );\n\n return sortedBroadcasters[0];\n }\n}\n"]}
|
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import { Chain, PreTransactionPOIsPerTxidLeafPerList, TXIDVersion } from '@railgun-community/shared-models';
|
|
2
|
+
import type { AuthorizationLike, BigNumberish } from 'ethers';
|
|
3
|
+
type LegacyAuthorizationInput = {
|
|
4
|
+
address: string;
|
|
5
|
+
nonce: BigNumberish;
|
|
6
|
+
chainId: BigNumberish;
|
|
7
|
+
r: string;
|
|
8
|
+
s: string;
|
|
9
|
+
yParity: 0 | 1;
|
|
10
|
+
};
|
|
11
|
+
type AuthorizationInput = AuthorizationLike | LegacyAuthorizationInput;
|
|
2
12
|
export declare class BroadcasterTransaction {
|
|
3
13
|
private messageData;
|
|
4
14
|
private contentTopic;
|
|
@@ -6,7 +16,10 @@ export declare class BroadcasterTransaction {
|
|
|
6
16
|
private chain;
|
|
7
17
|
private nullifiers;
|
|
8
18
|
private constructor();
|
|
9
|
-
static create(txidVersionForInputs: TXIDVersion, to: string, data: string, broadcasterRailgunAddress: string, broadcasterFeesID: string, chain: Chain, nullifiers: string[], overallBatchMinGasPrice: bigint, useRelayAdapt: boolean, preTransactionPOIsPerTxidLeafPerList: PreTransactionPOIsPerTxidLeafPerList
|
|
19
|
+
static create(txidVersionForInputs: TXIDVersion, to: string, data: string, broadcasterRailgunAddress: string, broadcasterFeesID: string, chain: Chain, nullifiers: string[], overallBatchMinGasPrice: bigint, useRelayAdapt: boolean, preTransactionPOIsPerTxidLeafPerList: PreTransactionPOIsPerTxidLeafPerList, authorization?: AuthorizationInput, type4FeeOverrides?: {
|
|
20
|
+
maxFeePerGas: bigint;
|
|
21
|
+
maxPriorityFeePerGas: bigint;
|
|
22
|
+
}): Promise<BroadcasterTransaction>;
|
|
10
23
|
private static encryptTransaction;
|
|
11
24
|
private findMatchingNullifierTxid;
|
|
12
25
|
private getTransactionResponse;
|
|
@@ -14,3 +27,4 @@ export declare class BroadcasterTransaction {
|
|
|
14
27
|
send(): Promise<string>;
|
|
15
28
|
private broadcast;
|
|
16
29
|
}
|
|
30
|
+
export {};
|
|
@@ -7,7 +7,33 @@ import { isDefined } from '../utils/is-defined.js';
|
|
|
7
7
|
import { WakuBroadcasterWakuCore } from '../waku/waku-broadcaster-waku-core.js';
|
|
8
8
|
import { contentTopics } from '../waku/waku-topics.js';
|
|
9
9
|
import { BroadcasterTransactResponse, } from './broadcaster-transact-response.js';
|
|
10
|
-
import { getAddress, isHexString } from 'ethers';
|
|
10
|
+
import { authorizationify, getAddress, isHexString } from 'ethers';
|
|
11
|
+
const normalizeAuthorizationLike = (authorization) => {
|
|
12
|
+
if (typeof authorization === 'object' &&
|
|
13
|
+
authorization != null &&
|
|
14
|
+
'signature' in authorization) {
|
|
15
|
+
return authorization;
|
|
16
|
+
}
|
|
17
|
+
const legacy = authorization;
|
|
18
|
+
return {
|
|
19
|
+
chainId: legacy.chainId,
|
|
20
|
+
nonce: legacy.nonce,
|
|
21
|
+
address: legacy.address,
|
|
22
|
+
signature: {
|
|
23
|
+
r: legacy.r,
|
|
24
|
+
s: legacy.s,
|
|
25
|
+
yParity: legacy.yParity,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
const ensureBigIntJSONSerializable = () => {
|
|
30
|
+
const proto = BigInt.prototype;
|
|
31
|
+
if (proto.toJSON == null) {
|
|
32
|
+
proto.toJSON = function () {
|
|
33
|
+
return this.toString();
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
};
|
|
11
37
|
var BroadcastRetryState;
|
|
12
38
|
(function (BroadcastRetryState) {
|
|
13
39
|
BroadcastRetryState["RetryTransact"] = "RetryTransact";
|
|
@@ -38,24 +64,23 @@ export class BroadcasterTransaction {
|
|
|
38
64
|
this.nullifiers = nullifiers;
|
|
39
65
|
BroadcasterTransactResponse.setSharedKey(encryptedDataResponse.sharedKey);
|
|
40
66
|
}
|
|
41
|
-
static async create(txidVersionForInputs, to, data, broadcasterRailgunAddress, broadcasterFeesID, chain, nullifiers, overallBatchMinGasPrice, useRelayAdapt, preTransactionPOIsPerTxidLeafPerList) {
|
|
42
|
-
const encryptedDataResponse = await this.encryptTransaction(txidVersionForInputs, to, data, broadcasterRailgunAddress, broadcasterFeesID, chain, overallBatchMinGasPrice, useRelayAdapt, preTransactionPOIsPerTxidLeafPerList);
|
|
67
|
+
static async create(txidVersionForInputs, to, data, broadcasterRailgunAddress, broadcasterFeesID, chain, nullifiers, overallBatchMinGasPrice, useRelayAdapt, preTransactionPOIsPerTxidLeafPerList, authorization, type4FeeOverrides) {
|
|
68
|
+
const encryptedDataResponse = await this.encryptTransaction(txidVersionForInputs, to, data, broadcasterRailgunAddress, broadcasterFeesID, chain, overallBatchMinGasPrice, useRelayAdapt, preTransactionPOIsPerTxidLeafPerList, authorization, type4FeeOverrides);
|
|
43
69
|
return new BroadcasterTransaction(encryptedDataResponse, txidVersionForInputs, chain, nullifiers);
|
|
44
70
|
}
|
|
45
|
-
static async encryptTransaction(txidVersionForInputs, to, data, broadcasterRailgunAddress, broadcasterFeesID, chain, overallBatchMinGasPrice, useRelayAdapt, preTransactionPOIsPerTxidLeafPerList) {
|
|
71
|
+
static async encryptTransaction(txidVersionForInputs, to, data, broadcasterRailgunAddress, broadcasterFeesID, chain, overallBatchMinGasPrice, useRelayAdapt, preTransactionPOIsPerTxidLeafPerList, authorization, type4FeeOverrides) {
|
|
46
72
|
if (!isHexString(data)) {
|
|
47
73
|
throw new Error('Data field must be a hex string.');
|
|
48
74
|
}
|
|
75
|
+
ensureBigIntJSONSerializable();
|
|
49
76
|
const { viewingPublicKey: broadcasterViewingKey } = getRailgunWalletAddressData(broadcasterRailgunAddress);
|
|
50
|
-
const
|
|
51
|
-
transactType: BroadcasterTransactRequestType.COMMON,
|
|
77
|
+
const baseTransactData = {
|
|
52
78
|
txidVersion: txidVersionForInputs,
|
|
53
79
|
to: getAddress(to),
|
|
54
80
|
data,
|
|
55
81
|
broadcasterViewingKey: bytesToHex(broadcasterViewingKey),
|
|
56
82
|
chainID: chain.id,
|
|
57
83
|
chainType: chain.type,
|
|
58
|
-
minGasPrice: overallBatchMinGasPrice.toString(),
|
|
59
84
|
feesID: broadcasterFeesID,
|
|
60
85
|
useRelayAdapt,
|
|
61
86
|
devLog: BroadcasterConfig.IS_DEV,
|
|
@@ -63,6 +88,25 @@ export class BroadcasterTransaction {
|
|
|
63
88
|
maxVersion: BroadcasterConfig.MAXIMUM_BROADCASTER_VERSION,
|
|
64
89
|
preTransactionPOIsPerTxidLeafPerList,
|
|
65
90
|
};
|
|
91
|
+
const transactData = authorization
|
|
92
|
+
? (() => {
|
|
93
|
+
if (!type4FeeOverrides) {
|
|
94
|
+
throw new Error('EIP-7702 transact requires explicit type4FeeOverrides (maxFeePerGas/maxPriorityFeePerGas).');
|
|
95
|
+
}
|
|
96
|
+
const resolvedAuthorization = authorizationify(normalizeAuthorizationLike(authorization));
|
|
97
|
+
return {
|
|
98
|
+
...baseTransactData,
|
|
99
|
+
transactType: BroadcasterTransactRequestType.TX7702,
|
|
100
|
+
maxFeePerGas: type4FeeOverrides.maxFeePerGas.toString(),
|
|
101
|
+
maxPriorityFeePerGas: type4FeeOverrides.maxPriorityFeePerGas.toString(),
|
|
102
|
+
authorization: resolvedAuthorization,
|
|
103
|
+
};
|
|
104
|
+
})()
|
|
105
|
+
: {
|
|
106
|
+
...baseTransactData,
|
|
107
|
+
transactType: BroadcasterTransactRequestType.COMMON,
|
|
108
|
+
minGasPrice: overallBatchMinGasPrice.toString(),
|
|
109
|
+
};
|
|
66
110
|
const encryptedDataResponse = await encryptDataWithSharedKey(transactData, broadcasterViewingKey);
|
|
67
111
|
return encryptedDataResponse;
|
|
68
112
|
}
|
|
@@ -126,7 +170,6 @@ export class BroadcasterTransaction {
|
|
|
126
170
|
}
|
|
127
171
|
const pollIterations = SECONDS_PER_RETRY / POLL_DELAY_SECONDS;
|
|
128
172
|
const responseTopic = contentTopics.transactResponse(this.chain);
|
|
129
|
-
await WakuBroadcasterWakuCore.retrieveHistoricalForTopic(responseTopic);
|
|
130
173
|
const response = await poll(async () => this.getTransactionResponse(), (result) => result != null, POLL_DELAY_SECONDS * 1000, pollIterations);
|
|
131
174
|
if (isDefined(response)) {
|
|
132
175
|
if (isDefined(response.txHash)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broadcaster-transaction.js","sourceRoot":"","sources":["../../src/transact/broadcaster-transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getRailgunWalletAddressData,\n encryptDataWithSharedKey,\n getCompletedTxidFromNullifiers,\n} from '@railgun-community/wallet';\nimport {\n Chain,\n EncryptDataWithSharedKeyResponse,\n poll,\n PreTransactionPOIsPerTxidLeafPerList,\n BroadcasterEncryptedMethodParams,\n BroadcasterRawParamsTransact,\n TXIDVersion,\n BroadcasterTransactRequestType,\n} from '@railgun-community/shared-models';\nimport { BroadcasterConfig } from '../models/broadcaster-config.js';\nimport { bytesToHex } from '../utils/conversion.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport { WakuBroadcasterWakuCore } from '../waku/waku-broadcaster-waku-core.js';\nimport { contentTopics } from '../waku/waku-topics.js';\nimport {\n WakuTransactResponse,\n BroadcasterTransactResponse,\n} from './broadcaster-transact-response.js';\nimport { getAddress, isHexString } from 'ethers';\n\n//\n// Transact: Encryption Flow\n//\n// Client:\n// 1. Generates random 16 bytes: `responseKey` and adds to transact data\n// 2. Generates a `sharedKey` from a random `privkey` and the Broadcaster's `pubkey`\n// 3. Encrypts the transact data asymmetrically, using `sharedKey` (`encryptedData = encrypt(transactData, sharedKey)`)\n// 4. Includes `publicKey` and `encryptedData` in transact message\n// 5. Sends the message\n//\n// Broadcaster:\n// 1. Decrypts the `encryptedData` using Broadcaster privkey and `sharedKey` (if error, it's not addressed to us)\n// 2. Processes transaction\n// 3. Encrypts response (`txHash` or `error`) using `responseKey` (symmetric: AES-GCM-256)\n// 4. Sends back encrypted response on transact-response: {encryptedData}\n//\n// Client:\n// 1. Catches all `transact-response`'s after sending a transaction.\n// 2. Decrypts each using the `responseKey`. (If error, not addressed to us)\n// 3. After successful decryption, parses `txHash` or `error`.\n//\n\nenum BroadcastRetryState {\n RetryTransact = 'RetryTransact',\n Wait = 'Wait',\n Timeout = 'Timeout',\n}\n\ntype BroadcastMessageData = {\n method: string;\n params: BroadcasterEncryptedMethodParams;\n};\n\n// NOTE: Broadcaster default transaction-send timeout is 45 seconds.\nconst SECONDS_PER_RETRY = 2;\nconst POLL_DELAY_SECONDS = 0.1;\nconst RETRY_TRANSACTION_SECONDS = 20;\nconst POST_ALERT_TOTAL_WAITING_SECONDS = 120;\n\nexport class BroadcasterTransaction {\n private messageData: BroadcastMessageData;\n private contentTopic: string;\n private txidVersionForInputs: TXIDVersion;\n private chain: Chain;\n private nullifiers: string[];\n\n private constructor(\n encryptedDataResponse: EncryptDataWithSharedKeyResponse,\n txidVersionForInputs: TXIDVersion,\n chain: Chain,\n nullifiers: string[],\n ) {\n this.messageData = {\n method: 'transact',\n params: {\n pubkey: encryptedDataResponse.randomPubKey,\n encryptedData: encryptedDataResponse.encryptedData,\n },\n };\n this.contentTopic = contentTopics.transact(chain);\n this.txidVersionForInputs = txidVersionForInputs;\n this.chain = chain;\n this.nullifiers = nullifiers;\n BroadcasterTransactResponse.setSharedKey(encryptedDataResponse.sharedKey);\n }\n\n static async create(\n txidVersionForInputs: TXIDVersion,\n to: string,\n data: string,\n broadcasterRailgunAddress: string,\n broadcasterFeesID: string,\n chain: Chain,\n nullifiers: string[],\n overallBatchMinGasPrice: bigint,\n useRelayAdapt: boolean,\n preTransactionPOIsPerTxidLeafPerList: PreTransactionPOIsPerTxidLeafPerList,\n ): Promise<BroadcasterTransaction> {\n const encryptedDataResponse = await this.encryptTransaction(\n txidVersionForInputs,\n to,\n data,\n broadcasterRailgunAddress,\n broadcasterFeesID,\n chain,\n overallBatchMinGasPrice,\n useRelayAdapt,\n preTransactionPOIsPerTxidLeafPerList,\n );\n return new BroadcasterTransaction(\n encryptedDataResponse,\n txidVersionForInputs,\n chain,\n nullifiers,\n );\n }\n\n private static async encryptTransaction(\n txidVersionForInputs: TXIDVersion,\n to: string,\n data: string,\n broadcasterRailgunAddress: string,\n broadcasterFeesID: string,\n chain: Chain,\n overallBatchMinGasPrice: bigint,\n useRelayAdapt: boolean,\n preTransactionPOIsPerTxidLeafPerList: PreTransactionPOIsPerTxidLeafPerList,\n ): Promise<EncryptDataWithSharedKeyResponse> {\n if (!isHexString(data)) {\n throw new Error('Data field must be a hex string.');\n }\n\n const { viewingPublicKey: broadcasterViewingKey } =\n getRailgunWalletAddressData(broadcasterRailgunAddress);\n\n const transactData: BroadcasterRawParamsTransact = {\n transactType: BroadcasterTransactRequestType.COMMON,\n txidVersion: txidVersionForInputs,\n to: getAddress(to),\n data,\n broadcasterViewingKey: bytesToHex(broadcasterViewingKey),\n chainID: chain.id,\n chainType: chain.type,\n minGasPrice: overallBatchMinGasPrice.toString(),\n feesID: broadcasterFeesID,\n useRelayAdapt,\n devLog: BroadcasterConfig.IS_DEV,\n minVersion: BroadcasterConfig.MINIMUM_BROADCASTER_VERSION,\n maxVersion: BroadcasterConfig.MAXIMUM_BROADCASTER_VERSION,\n preTransactionPOIsPerTxidLeafPerList,\n };\n\n const encryptedDataResponse = await encryptDataWithSharedKey(\n transactData,\n broadcasterViewingKey,\n );\n\n return encryptedDataResponse;\n }\n\n private async findMatchingNullifierTxid(): Promise<Optional<string>> {\n try {\n const { txid } = await getCompletedTxidFromNullifiers(\n this.txidVersionForInputs,\n this.chain,\n this.nullifiers,\n );\n return txid;\n } catch (cause) {\n if (!(cause instanceof Error)) {\n throw new Error('Unexpected non-error thrown', { cause });\n }\n BroadcasterDebug.error(\n new Error('Failed to find matching nullifier txid', { cause }),\n );\n return undefined;\n }\n }\n\n private async getTransactionResponse(): Promise<\n Optional<WakuTransactResponse>\n > {\n if (BroadcasterTransactResponse.storedTransactionResponse) {\n return BroadcasterTransactResponse.storedTransactionResponse;\n }\n\n const nullifiersTxid = await this.findMatchingNullifierTxid();\n if (isDefined(nullifiersTxid)) {\n return {\n id: 'nullifier-transaction',\n txHash: nullifiersTxid,\n };\n }\n\n return undefined;\n }\n\n private getBroadcastRetryState(retryNumber: number): BroadcastRetryState {\n const retrySeconds = retryNumber * SECONDS_PER_RETRY;\n if (retrySeconds <= RETRY_TRANSACTION_SECONDS) {\n return BroadcastRetryState.RetryTransact;\n }\n if (retrySeconds >= POST_ALERT_TOTAL_WAITING_SECONDS) {\n return BroadcastRetryState.Timeout;\n }\n return BroadcastRetryState.Wait;\n }\n\n async send(): Promise<string> {\n return this.broadcast();\n }\n\n private async broadcast(retryNumber = 0): Promise<string> {\n const broadcastRetryState = this.getBroadcastRetryState(retryNumber);\n switch (broadcastRetryState) {\n case BroadcastRetryState.RetryTransact:\n // 0-20 seconds.\n BroadcasterDebug.log(\n `Broadcast Waku message: ${this.messageData.method} via ${this.contentTopic}`,\n );\n try {\n await WakuBroadcasterWakuCore.broadcastMessage(\n this.messageData,\n this.contentTopic,\n );\n } catch (err) {\n if (err instanceof Error) {\n BroadcasterDebug.log(`Broadcast error: ${err.message}`);\n }\n }\n break;\n case BroadcastRetryState.Wait:\n // 21-60 seconds.\n // Do nothing.\n break;\n case BroadcastRetryState.Timeout:\n // Exactly 60 seconds.\n throw new Error('Request timed out.');\n }\n\n // 15 iterations (1.5 sec total, iterate every 100ms).\n const pollIterations = SECONDS_PER_RETRY / POLL_DELAY_SECONDS;\n\n const responseTopic = contentTopics.transactResponse(this.chain);\n await WakuBroadcasterWakuCore.retrieveHistoricalForTopic(responseTopic);\n\n const response: Optional<WakuTransactResponse> = await poll(\n async () => this.getTransactionResponse(),\n (result: Optional<WakuTransactResponse>) => result != null,\n POLL_DELAY_SECONDS * 1000,\n pollIterations,\n );\n if (isDefined(response)) {\n if (isDefined(response.txHash)) {\n BroadcasterTransactResponse.clearSharedKey();\n return response.txHash;\n }\n if (isDefined(response.error)) {\n BroadcasterDebug.log(`Broadcast error: ${response.error}`);\n BroadcasterTransactResponse.clearSharedKey();\n throw new Error('Received response error from broadcaster.', {\n cause: new Error(response.error),\n });\n }\n }\n\n // Retry.\n return this.broadcast(retryNumber + 1);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"broadcaster-transaction.js","sourceRoot":"","sources":["../../src/transact/broadcaster-transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getRailgunWalletAddressData,\n encryptDataWithSharedKey,\n getCompletedTxidFromNullifiers,\n} from '@railgun-community/wallet';\nimport {\n Chain,\n EncryptDataWithSharedKeyResponse,\n poll,\n PreTransactionPOIsPerTxidLeafPerList,\n BroadcasterEncryptedMethodParams,\n TXIDVersion,\n BroadcasterTransactRequestType,\n BroadcasterRawParamsTransactCommon,\n BroadcasterTransactRequestRaw,\n} from '@railgun-community/shared-models';\nimport { BroadcasterConfig } from '../models/broadcaster-config.js';\nimport { bytesToHex } from '../utils/conversion.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport { WakuBroadcasterWakuCore } from '../waku/waku-broadcaster-waku-core.js';\nimport { contentTopics } from '../waku/waku-topics.js';\nimport {\n WakuTransactResponse,\n BroadcasterTransactResponse,\n} from './broadcaster-transact-response.js';\nimport { authorizationify, getAddress, isHexString } from 'ethers';\nimport type { Authorization, AuthorizationLike, BigNumberish } from 'ethers';\n\ntype LegacyAuthorizationInput = {\n address: string;\n nonce: BigNumberish;\n chainId: BigNumberish;\n r: string;\n s: string;\n yParity: 0 | 1;\n};\n\ntype AuthorizationInput = AuthorizationLike | LegacyAuthorizationInput;\n\nconst normalizeAuthorizationLike = (\n authorization: AuthorizationInput,\n): AuthorizationLike => {\n if (\n typeof authorization === 'object' &&\n authorization != null &&\n 'signature' in authorization\n ) {\n return authorization as AuthorizationLike;\n }\n\n const legacy = authorization as LegacyAuthorizationInput;\n return {\n chainId: legacy.chainId,\n nonce: legacy.nonce,\n address: legacy.address,\n signature: {\n r: legacy.r,\n s: legacy.s,\n yParity: legacy.yParity,\n },\n };\n};\n\nconst ensureBigIntJSONSerializable = () => {\n // JSON.stringify throws on bigint by default.\n // The Broadcaster transact payload may include bigint fields (e.g. EIP-7702 Authorization).\n const proto = BigInt.prototype as any;\n if (proto.toJSON == null) {\n proto.toJSON = function () {\n return this.toString();\n };\n }\n};\n\n//\n// Transact: Encryption Flow\n//\n// Client:\n// 1. Generates random 16 bytes: `responseKey` and adds to transact data\n// 2. Generates a `sharedKey` from a random `privkey` and the Broadcaster's `pubkey`\n// 3. Encrypts the transact data asymmetrically, using `sharedKey` (`encryptedData = encrypt(transactData, sharedKey)`)\n// 4. Includes `publicKey` and `encryptedData` in transact message\n// 5. Sends the message\n//\n// Broadcaster:\n// 1. Decrypts the `encryptedData` using Broadcaster privkey and `sharedKey` (if error, it's not addressed to us)\n// 2. Processes transaction\n// 3. Encrypts response (`txHash` or `error`) using `responseKey` (symmetric: AES-GCM-256)\n// 4. Sends back encrypted response on transact-response: {encryptedData}\n//\n// Client:\n// 1. Catches all `transact-response`'s after sending a transaction.\n// 2. Decrypts each using the `responseKey`. (If error, not addressed to us)\n// 3. After successful decryption, parses `txHash` or `error`.\n//\n\nenum BroadcastRetryState {\n RetryTransact = 'RetryTransact',\n Wait = 'Wait',\n Timeout = 'Timeout',\n}\n\ntype BroadcastMessageData = {\n method: string;\n params: BroadcasterEncryptedMethodParams;\n};\n\n// NOTE: Broadcaster default transaction-send timeout is 45 seconds.\nconst SECONDS_PER_RETRY = 2;\nconst POLL_DELAY_SECONDS = 0.1;\nconst RETRY_TRANSACTION_SECONDS = 20;\nconst POST_ALERT_TOTAL_WAITING_SECONDS = 120;\n\nexport class BroadcasterTransaction {\n private messageData: BroadcastMessageData;\n private contentTopic: string;\n private txidVersionForInputs: TXIDVersion;\n private chain: Chain;\n private nullifiers: string[];\n\n private constructor(\n encryptedDataResponse: EncryptDataWithSharedKeyResponse,\n txidVersionForInputs: TXIDVersion,\n chain: Chain,\n nullifiers: string[],\n ) {\n this.messageData = {\n method: 'transact',\n params: {\n pubkey: encryptedDataResponse.randomPubKey,\n encryptedData: encryptedDataResponse.encryptedData,\n },\n };\n this.contentTopic = contentTopics.transact(chain);\n this.txidVersionForInputs = txidVersionForInputs;\n this.chain = chain;\n this.nullifiers = nullifiers;\n BroadcasterTransactResponse.setSharedKey(encryptedDataResponse.sharedKey);\n }\n\n static async create(\n txidVersionForInputs: TXIDVersion,\n to: string,\n data: string,\n broadcasterRailgunAddress: string,\n broadcasterFeesID: string,\n chain: Chain,\n nullifiers: string[],\n overallBatchMinGasPrice: bigint,\n useRelayAdapt: boolean,\n preTransactionPOIsPerTxidLeafPerList: PreTransactionPOIsPerTxidLeafPerList,\n authorization?: AuthorizationInput,\n type4FeeOverrides?: { maxFeePerGas: bigint; maxPriorityFeePerGas: bigint },\n ): Promise<BroadcasterTransaction> {\n const encryptedDataResponse = await this.encryptTransaction(\n txidVersionForInputs,\n to,\n data,\n broadcasterRailgunAddress,\n broadcasterFeesID,\n chain,\n overallBatchMinGasPrice,\n useRelayAdapt,\n preTransactionPOIsPerTxidLeafPerList,\n authorization,\n type4FeeOverrides,\n );\n return new BroadcasterTransaction(\n encryptedDataResponse,\n txidVersionForInputs,\n chain,\n nullifiers,\n );\n }\n\n private static async encryptTransaction(\n txidVersionForInputs: TXIDVersion,\n to: string,\n data: string,\n broadcasterRailgunAddress: string,\n broadcasterFeesID: string,\n chain: Chain,\n overallBatchMinGasPrice: bigint,\n useRelayAdapt: boolean,\n preTransactionPOIsPerTxidLeafPerList: PreTransactionPOIsPerTxidLeafPerList,\n authorization?: AuthorizationInput,\n type4FeeOverrides?: { maxFeePerGas: bigint; maxPriorityFeePerGas: bigint },\n ): Promise<EncryptDataWithSharedKeyResponse> {\n if (!isHexString(data)) {\n throw new Error('Data field must be a hex string.');\n }\n\n ensureBigIntJSONSerializable();\n\n const { viewingPublicKey: broadcasterViewingKey } =\n getRailgunWalletAddressData(broadcasterRailgunAddress);\n\n const baseTransactData: BroadcasterTransactRequestRaw = {\n txidVersion: txidVersionForInputs,\n to: getAddress(to),\n data,\n broadcasterViewingKey: bytesToHex(broadcasterViewingKey),\n chainID: chain.id,\n chainType: chain.type,\n feesID: broadcasterFeesID,\n useRelayAdapt,\n devLog: BroadcasterConfig.IS_DEV,\n minVersion: BroadcasterConfig.MINIMUM_BROADCASTER_VERSION,\n maxVersion: BroadcasterConfig.MAXIMUM_BROADCASTER_VERSION,\n preTransactionPOIsPerTxidLeafPerList,\n };\n\n type BroadcasterRawParamsTransactERC7702Local = BroadcasterTransactRequestRaw & {\n transactType: BroadcasterTransactRequestType.TX7702;\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n authorization: Authorization;\n };\n\n const transactData: BroadcasterRawParamsTransactCommon | BroadcasterRawParamsTransactERC7702Local =\n authorization\n ? (() => {\n if (!type4FeeOverrides) {\n throw new Error(\n 'EIP-7702 transact requires explicit type4FeeOverrides (maxFeePerGas/maxPriorityFeePerGas).',\n );\n }\n\n const resolvedAuthorization = authorizationify(\n normalizeAuthorizationLike(authorization),\n );\n\n return {\n ...baseTransactData,\n transactType: BroadcasterTransactRequestType.TX7702,\n maxFeePerGas: type4FeeOverrides.maxFeePerGas.toString(),\n maxPriorityFeePerGas:\n type4FeeOverrides.maxPriorityFeePerGas.toString(),\n authorization: resolvedAuthorization,\n };\n })()\n : {\n ...baseTransactData,\n transactType: BroadcasterTransactRequestType.COMMON,\n minGasPrice: overallBatchMinGasPrice.toString(),\n };\n\n const encryptedDataResponse = await encryptDataWithSharedKey(\n transactData,\n broadcasterViewingKey,\n );\n\n return encryptedDataResponse;\n }\n\n private async findMatchingNullifierTxid(): Promise<Optional<string>> {\n try {\n const { txid } = await getCompletedTxidFromNullifiers(\n this.txidVersionForInputs,\n this.chain,\n this.nullifiers,\n );\n return txid;\n } catch (cause) {\n if (!(cause instanceof Error)) {\n throw new Error('Unexpected non-error thrown', { cause });\n }\n BroadcasterDebug.error(\n new Error('Failed to find matching nullifier txid', { cause }),\n );\n return undefined;\n }\n }\n\n private async getTransactionResponse(): Promise<\n Optional<WakuTransactResponse>\n > {\n if (BroadcasterTransactResponse.storedTransactionResponse) {\n return BroadcasterTransactResponse.storedTransactionResponse;\n }\n\n const nullifiersTxid = await this.findMatchingNullifierTxid();\n if (isDefined(nullifiersTxid)) {\n return {\n id: 'nullifier-transaction',\n txHash: nullifiersTxid,\n };\n }\n\n return undefined;\n }\n\n private getBroadcastRetryState(retryNumber: number): BroadcastRetryState {\n const retrySeconds = retryNumber * SECONDS_PER_RETRY;\n if (retrySeconds <= RETRY_TRANSACTION_SECONDS) {\n return BroadcastRetryState.RetryTransact;\n }\n if (retrySeconds >= POST_ALERT_TOTAL_WAITING_SECONDS) {\n return BroadcastRetryState.Timeout;\n }\n return BroadcastRetryState.Wait;\n }\n\n async send(): Promise<string> {\n return this.broadcast();\n }\n\n private async broadcast(retryNumber = 0): Promise<string> {\n const broadcastRetryState = this.getBroadcastRetryState(retryNumber);\n switch (broadcastRetryState) {\n case BroadcastRetryState.RetryTransact:\n // 0-20 seconds.\n BroadcasterDebug.log(\n `Broadcast Waku message: ${this.messageData.method} via ${this.contentTopic}`,\n );\n try {\n await WakuBroadcasterWakuCore.broadcastMessage(\n this.messageData,\n this.contentTopic,\n );\n } catch (err) {\n if (err instanceof Error) {\n BroadcasterDebug.log(`Broadcast error: ${err.message}`);\n }\n }\n break;\n case BroadcastRetryState.Wait:\n // 21-60 seconds.\n // Do nothing.\n break;\n case BroadcastRetryState.Timeout:\n // Exactly 60 seconds.\n throw new Error('Request timed out.');\n }\n\n // 15 iterations (1.5 sec total, iterate every 100ms).\n const pollIterations = SECONDS_PER_RETRY / POLL_DELAY_SECONDS;\n\n const responseTopic = contentTopics.transactResponse(this.chain);\n // await WakuBroadcasterWakuCore.retrieveHistoricalForTopic(responseTopic);\n\n const response: Optional<WakuTransactResponse> = await poll(\n async () => this.getTransactionResponse(),\n (result: Optional<WakuTransactResponse>) => result != null,\n POLL_DELAY_SECONDS * 1000,\n pollIterations,\n );\n if (isDefined(response)) {\n if (isDefined(response.txHash)) {\n BroadcasterTransactResponse.clearSharedKey();\n return response.txHash;\n }\n if (isDefined(response.error)) {\n BroadcasterDebug.log(`Broadcast error: ${response.error}`);\n BroadcasterTransactResponse.clearSharedKey();\n throw new Error('Received response error from broadcaster.', {\n cause: new Error(response.error),\n });\n }\n }\n\n // Retry.\n return this.broadcast(retryNumber + 1);\n }\n}\n"]}
|
|
@@ -4,4 +4,4 @@ export declare const shortenAddress: (address: string) => string;
|
|
|
4
4
|
export declare const nameForBroadcaster: (railgunAddress: string, identifier: Optional<string>) => string;
|
|
5
5
|
export declare const cachedFeeExpired: (feeExpiration: number) => boolean;
|
|
6
6
|
export declare const invalidBroadcasterVersion: (version: Optional<string>) => boolean;
|
|
7
|
-
export declare const cachedFeeUnavailableOrExpired: (cachedFee: CachedTokenFee, chain: Chain, useRelayAdapt: boolean) => boolean;
|
|
7
|
+
export declare const cachedFeeUnavailableOrExpired: (cachedFee: CachedTokenFee, chain: Chain, useRelayAdapt: boolean, use7702Only?: boolean) => boolean;
|
|
@@ -23,18 +23,23 @@ export const invalidBroadcasterVersion = (version) => {
|
|
|
23
23
|
return (versionCompare(version ?? '0.0.0', BroadcasterConfig.MINIMUM_BROADCASTER_VERSION) < 0 ||
|
|
24
24
|
versionCompare(version ?? '0.0.0', BroadcasterConfig.MAXIMUM_BROADCASTER_VERSION) > 0);
|
|
25
25
|
};
|
|
26
|
-
export const cachedFeeUnavailableOrExpired = (cachedFee, chain, useRelayAdapt) => {
|
|
26
|
+
export const cachedFeeUnavailableOrExpired = (cachedFee, chain, useRelayAdapt, use7702Only = false) => {
|
|
27
27
|
if (useRelayAdapt) {
|
|
28
|
-
const relayAdapt = cachedFee.relayAdapt;
|
|
29
|
-
if (!relayAdapt) {
|
|
30
|
-
return true;
|
|
31
|
-
}
|
|
32
28
|
const network = networkForChain(chain);
|
|
33
29
|
if (!network) {
|
|
34
30
|
throw new Error(`Unrecognized chain ${chain}`);
|
|
35
31
|
}
|
|
36
|
-
const
|
|
37
|
-
|
|
32
|
+
const relayAdapt = use7702Only
|
|
33
|
+
? cachedFee.relayAdapt7702
|
|
34
|
+
: cachedFee.relayAdapt;
|
|
35
|
+
if (!relayAdapt) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
const expectedRelayAdapt = use7702Only
|
|
39
|
+
? [network.relayAdapt7702Contract, ...network.relayAdapt7702History]
|
|
40
|
+
: network.relayAdaptHistory;
|
|
41
|
+
if (expectedRelayAdapt.length > 0 &&
|
|
42
|
+
!expectedRelayAdapt.includes(relayAdapt)) {
|
|
38
43
|
return true;
|
|
39
44
|
}
|
|
40
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broadcaster-util.js","sourceRoot":"","sources":["../../src/utils/broadcaster-util.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,eAAe,EACf,cAAc,GACf,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAE1C,MAAM,CAAC,MAAM,8BAA8B,GAAG,SAAS,CAAC;AAExD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAU,EAAE;IACxD,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,cAAsB,EACtB,UAA4B,EAC5B,EAAE;IACF,MAAM,YAAY,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IACpD,IAAI,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,YAAY,KAAK,UAAU,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,aAAqB,EAAE,EAAE;IAGxD,OAAO,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,2BAA2B,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,OAAyB,EAAE,EAAE;IACrE,OAAO,CACL,cAAc,CACZ,OAAO,IAAI,OAAO,EAClB,iBAAiB,CAAC,2BAA2B,CAC9C,GAAG,CAAC;QACL,cAAc,CACZ,OAAO,IAAI,OAAO,EAClB,iBAAiB,CAAC,2BAA2B,CAC9C,GAAG,CAAC,CACN,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,SAAyB,EACzB,KAAY,EACZ,aAAsB,EACtB,EAAE;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,
|
|
1
|
+
{"version":3,"file":"broadcaster-util.js","sourceRoot":"","sources":["../../src/utils/broadcaster-util.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,eAAe,EACf,cAAc,GACf,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAE1C,MAAM,CAAC,MAAM,8BAA8B,GAAG,SAAS,CAAC;AAExD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAU,EAAE;IACxD,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,cAAsB,EACtB,UAA4B,EAC5B,EAAE;IACF,MAAM,YAAY,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IACpD,IAAI,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,YAAY,KAAK,UAAU,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,aAAqB,EAAE,EAAE;IAGxD,OAAO,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,2BAA2B,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,OAAyB,EAAE,EAAE;IACrE,OAAO,CACL,cAAc,CACZ,OAAO,IAAI,OAAO,EAClB,iBAAiB,CAAC,2BAA2B,CAC9C,GAAG,CAAC;QACL,cAAc,CACZ,OAAO,IAAI,OAAO,EAClB,iBAAiB,CAAC,2BAA2B,CAC9C,GAAG,CAAC,CACN,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,SAAyB,EACzB,KAAY,EACZ,aAAsB,EACtB,WAAW,GAAG,KAAK,EACnB,EAAE;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,UAAU,GAAG,WAAW;YAC5B,CAAC,CAAC,SAAS,CAAC,cAAc;YAC1B,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC;QACzB,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,kBAAkB,GAAG,WAAW;YAEpC,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;YACpE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAE9B,IACE,kBAAkB,CAAC,MAAM,GAAG,CAAC;YAC7B,CAAC,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,EACxC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,gBAAgB,KAAK,CAAC,EAAE,CAAC;QAErC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC","sourcesContent":["import {\n CachedTokenFee,\n Chain,\n networkForChain,\n versionCompare,\n} from '@railgun-community/shared-models';\nimport { BroadcasterConfig } from '../models/broadcaster-config.js';\nimport { isDefined } from './is-defined.js';\n\nconst FEE_EXPIRATION_MINIMUM_MSEC = 40000;\n\nexport const DEFAULT_BROADCASTER_IDENTIFIER = 'default';\n\nexport const shortenAddress = (address: string): string => {\n if (address.length < 13) {\n return address;\n }\n // 12 chars separated by '...'\n return `${address.slice(0, 8)}...${address.slice(-4)}`;\n};\n\nexport const nameForBroadcaster = (\n railgunAddress: string,\n identifier: Optional<string>,\n) => {\n const shortAddress = shortenAddress(railgunAddress);\n if (isDefined(identifier)) {\n return `${shortAddress}: ${identifier}`;\n }\n return shortAddress;\n};\n\nexport const cachedFeeExpired = (feeExpiration: number) => {\n // Minimum of 40sec until expiration, in order to run the proof and submit.\n // If submitted after feeCacheID expires, it risks \"Bad token fee\" error from Broadcaster.\n return feeExpiration < Date.now() + FEE_EXPIRATION_MINIMUM_MSEC;\n};\n\nexport const invalidBroadcasterVersion = (version: Optional<string>) => {\n return (\n versionCompare(\n version ?? '0.0.0',\n BroadcasterConfig.MINIMUM_BROADCASTER_VERSION,\n ) < 0 ||\n versionCompare(\n version ?? '0.0.0',\n BroadcasterConfig.MAXIMUM_BROADCASTER_VERSION,\n ) > 0\n );\n};\n\nexport const cachedFeeUnavailableOrExpired = (\n cachedFee: CachedTokenFee,\n chain: Chain,\n useRelayAdapt: boolean,\n use7702Only = false,\n) => {\n if (useRelayAdapt) {\n const network = networkForChain(chain);\n if (!network) {\n throw new Error(`Unrecognized chain ${chain}`);\n }\n\n const relayAdapt = use7702Only\n ? cachedFee.relayAdapt7702\n : cachedFee.relayAdapt;\n if (!relayAdapt) {\n return true;\n }\n\n const expectedRelayAdapt = use7702Only\n // TODO: remove when all models are fully configured.\n ? [network.relayAdapt7702Contract, ...network.relayAdapt7702History]\n : network.relayAdaptHistory;\n // TODO: switch back when all testing and migration to new adapt has completed.\n if (\n expectedRelayAdapt.length > 0 &&\n !expectedRelayAdapt.includes(relayAdapt)\n ) {\n return true;\n }\n }\n\n if (cachedFee.availableWallets === 0) {\n // No available wallets.\n return true;\n }\n\n if (cachedFeeExpired(cachedFee.expiration)) {\n return true;\n }\n\n return false;\n};\n"]}
|
|
@@ -8,6 +8,7 @@ export declare abstract class WakuBroadcasterWakuCoreBase {
|
|
|
8
8
|
protected static pubSubTopic: string;
|
|
9
9
|
protected static additionalDirectPeers: string[];
|
|
10
10
|
protected static peerDiscoveryTimeout: number;
|
|
11
|
+
protected static defaultShard: import("../models/constants.js").WakuShardInfo;
|
|
11
12
|
static restartCount: number;
|
|
12
13
|
static initWaku(chain: Chain): Promise<void>;
|
|
13
14
|
static pollHistoricalTopics(): Promise<void>;
|
|
@@ -56,7 +57,6 @@ export declare abstract class WakuBroadcasterWakuCoreBase {
|
|
|
56
57
|
};
|
|
57
58
|
contentTopics: string[];
|
|
58
59
|
}>;
|
|
59
|
-
private static getLightPushAcceptedCount;
|
|
60
60
|
static broadcastMessage(data: object, topic: string): Promise<void>;
|
|
61
61
|
static retrieveHistoricalForTopic(topic: string): Promise<void>;
|
|
62
62
|
}
|
|
@@ -4,7 +4,7 @@ import { BroadcasterDebug } from '../utils/broadcaster-debug.js';
|
|
|
4
4
|
import { utf8ToBytes } from '../utils/conversion.js';
|
|
5
5
|
import { isDefined } from '../utils/is-defined.js';
|
|
6
6
|
import { createEncoder, createDecoder, } from '@waku/sdk';
|
|
7
|
-
import { WAKU_RAILGUN_PUB_SUB_TOPIC, } from '../models/constants.js';
|
|
7
|
+
import { WAKU_RAILGUN_DEFAULT_SHARD, WAKU_RAILGUN_PUB_SUB_TOPIC, } from '../models/constants.js';
|
|
8
8
|
import { BroadcasterFeeCache } from '../fees/broadcaster-fee-cache.js';
|
|
9
9
|
import { BroadcasterConfig } from '../models/broadcaster-config.js';
|
|
10
10
|
import { getWakuHealthSnapshot } from './waku-healthcheck.js';
|
|
@@ -15,6 +15,7 @@ export class WakuBroadcasterWakuCoreBase {
|
|
|
15
15
|
static pubSubTopic = WAKU_RAILGUN_PUB_SUB_TOPIC;
|
|
16
16
|
static additionalDirectPeers = [];
|
|
17
17
|
static peerDiscoveryTimeout = 60000;
|
|
18
|
+
static defaultShard = WAKU_RAILGUN_DEFAULT_SHARD;
|
|
18
19
|
static restartCount = 0;
|
|
19
20
|
static async initWaku(chain) {
|
|
20
21
|
try {
|
|
@@ -60,12 +61,9 @@ export class WakuBroadcasterWakuCoreBase {
|
|
|
60
61
|
}
|
|
61
62
|
static setBroadcasterOptions(broadcasterOptions) {
|
|
62
63
|
BroadcasterConfig.trustedFeeSigner = broadcasterOptions.trustedFeeSigner;
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
pubSubTopic: broadcasterOptions.pubSubTopic,
|
|
67
|
-
});
|
|
68
|
-
this.pubSubTopic = BroadcasterConfig.pubSubTopic;
|
|
64
|
+
if (isDefined(broadcasterOptions.pubSubTopic)) {
|
|
65
|
+
this.pubSubTopic = broadcasterOptions.pubSubTopic;
|
|
66
|
+
}
|
|
69
67
|
if (broadcasterOptions.additionalDirectPeers) {
|
|
70
68
|
this.additionalDirectPeers =
|
|
71
69
|
broadcasterOptions.additionalDirectPeers;
|
|
@@ -114,34 +112,20 @@ export class WakuBroadcasterWakuCoreBase {
|
|
|
114
112
|
waku: this.waku,
|
|
115
113
|
});
|
|
116
114
|
}
|
|
117
|
-
static getLightPushAcceptedCount(result) {
|
|
118
|
-
if (Array.isArray(result.successes)) {
|
|
119
|
-
return result.successes.length;
|
|
120
|
-
}
|
|
121
|
-
if (Array.isArray(result.recipients)) {
|
|
122
|
-
return result.recipients.length;
|
|
123
|
-
}
|
|
124
|
-
return 0;
|
|
125
|
-
}
|
|
126
115
|
static async broadcastMessage(data, topic) {
|
|
127
116
|
if (!this.waku) {
|
|
128
117
|
throw new Error('Waku not initialized');
|
|
129
118
|
}
|
|
130
119
|
const encoder = createEncoder({
|
|
131
120
|
contentTopic: topic,
|
|
132
|
-
routingInfo:
|
|
121
|
+
routingInfo: WAKU_RAILGUN_DEFAULT_SHARD
|
|
133
122
|
});
|
|
134
123
|
const payload = utf8ToBytes(JSON.stringify(data));
|
|
135
124
|
const result = await this.waku.lightPush.send(encoder, {
|
|
136
125
|
payload,
|
|
137
126
|
});
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
if (failures.length > 0) {
|
|
141
|
-
if (acceptedCount > 0) {
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
throw new Error('Failed to send message');
|
|
127
|
+
if (result.failures && result.failures.length > 0) {
|
|
128
|
+
throw new Error(`Failed to send message: ${result.failures.map(f => f.error).join(', ')}`);
|
|
145
129
|
}
|
|
146
130
|
}
|
|
147
131
|
static async retrieveHistoricalForTopic(topic) {
|
|
@@ -153,38 +137,60 @@ export class WakuBroadcasterWakuCoreBase {
|
|
|
153
137
|
BroadcasterDebug.log(`No callback found for topic: ${topic}`);
|
|
154
138
|
return;
|
|
155
139
|
}
|
|
156
|
-
const decoder = createDecoder(topic,
|
|
140
|
+
const decoder = createDecoder(topic, WAKU_RAILGUN_DEFAULT_SHARD);
|
|
157
141
|
try {
|
|
158
142
|
const startTime = new Date();
|
|
159
|
-
startTime.setTime(Date.now() -
|
|
143
|
+
startTime.setTime(Date.now() - BroadcasterConfig.historicalLookBackTime);
|
|
160
144
|
const endTime = new Date(Date.now());
|
|
161
|
-
const
|
|
145
|
+
const optionsBase = {
|
|
162
146
|
includeData: true,
|
|
163
|
-
pubsubTopic:
|
|
147
|
+
pubsubTopic: this.pubSubTopic,
|
|
164
148
|
contentTopics: [topic],
|
|
165
149
|
paginationForward: true,
|
|
166
150
|
};
|
|
151
|
+
const runQuery = async (options) => {
|
|
152
|
+
const generator = this.waku.store.queryGenerator([decoder], options);
|
|
153
|
+
for await (const messagesPromises of generator) {
|
|
154
|
+
messagesPromises.reverse();
|
|
155
|
+
for (const messagePromise of messagesPromises) {
|
|
156
|
+
if (isDefined(messagePromise)) {
|
|
157
|
+
const message = await messagePromise;
|
|
158
|
+
if (isDefined(message)) {
|
|
159
|
+
callback(message);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
};
|
|
167
165
|
const lastMessage = WakuObservers.getLastMessage(topic);
|
|
168
166
|
if (lastMessage) {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
167
|
+
try {
|
|
168
|
+
const cursor = this.waku.store.createCursor(lastMessage);
|
|
169
|
+
await runQuery({
|
|
170
|
+
...optionsBase,
|
|
171
|
+
paginationCursor: cursor,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
if (err instanceof Error && err.message.includes('cursor not found')) {
|
|
176
|
+
BroadcasterDebug.log(`Historical cursor invalid (${topic}); retrying with time window.`);
|
|
177
|
+
await runQuery({
|
|
178
|
+
...optionsBase,
|
|
179
|
+
timeStart: startTime,
|
|
180
|
+
timeEnd: endTime,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
throw err;
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
|
+
return;
|
|
187
188
|
}
|
|
189
|
+
await runQuery({
|
|
190
|
+
...optionsBase,
|
|
191
|
+
timeStart: startTime,
|
|
192
|
+
timeEnd: endTime,
|
|
193
|
+
});
|
|
188
194
|
}
|
|
189
195
|
catch (err) {
|
|
190
196
|
if (err instanceof Error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waku-broadcaster-waku-core-base.js","sourceRoot":"","sources":["../../src/waku/waku-broadcaster-waku-core-base.ts"],"names":[],"mappings":"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","sourcesContent":["import { Chain, delay } from '@railgun-community/shared-models';\nimport { WakuObservers } from './waku-observers.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { utf8ToBytes } from '../utils/conversion.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport {\n createEncoder,\n createDecoder,\n type LightNode,\n type IDecodedMessage,\n type QueryRequestParams,\n} from '@waku/sdk';\nimport { BroadcasterOptions } from '../models/index.js';\nimport {\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n} from '../models/constants.js';\nimport { BroadcasterFeeCache } from '../fees/broadcaster-fee-cache.js';\nimport { BroadcasterConfig } from '../models/broadcaster-config.js';\nimport { getWakuHealthSnapshot } from './waku-healthcheck.js';\n\nexport abstract class WakuBroadcasterWakuCoreBase {\n static hasError = false;\n static restartCallback: () => void;\n\n static waku: Optional<LightNode>;\n\n protected static pubSubTopic = WAKU_RAILGUN_PUB_SUB_TOPIC;\n protected static additionalDirectPeers: string[] = [];\n protected static peerDiscoveryTimeout = 60000;\n public static restartCount = 0;\n\n static async initWaku(chain: Chain): Promise<void> {\n try {\n await this.connect();\n if (!this.waku) {\n BroadcasterDebug.log('No waku instance found');\n return;\n }\n WakuObservers.resetCurrentChain();\n await WakuObservers.setObserversForChain(\n this.waku,\n chain,\n );\n\n this.pollHistoricalTopics()\n\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n BroadcasterDebug.error(err);\n throw err;\n }\n }\n\n static async pollHistoricalTopics() {\n BroadcasterDebug.log(\"Polling historical messages\")\n const topics = WakuObservers.getCurrentContentTopics();\n for (const topic of topics) {\n await this.retrieveHistoricalForTopic(topic);\n }\n await delay(10_000)\n }\n\n static setWakuRestartCallback(callback: () => void) {\n this.restartCallback = callback;\n }\n\n static async reinitWaku(chain: Chain) {\n if (\n isDefined(this.waku) &&\n this.waku.isStarted()\n ) {\n // Reset fees, which will reset status to \"Searching\".\n await this.disconnect();\n }\n BroadcasterFeeCache.resetCache(chain);\n BroadcasterDebug.log(\n `Reinit Waku, ${++this.restartCount}`,\n );\n await this.initWaku(chain);\n if (this.restartCallback) {\n this.restartCallback();\n }\n }\n\n static setBroadcasterOptions(broadcasterOptions: BroadcasterOptions) {\n BroadcasterConfig.trustedFeeSigner = broadcasterOptions.trustedFeeSigner;\n\n BroadcasterConfig.configureWakuNetwork({\n clusterId: broadcasterOptions.clusterId,\n shardId: broadcasterOptions.shardId,\n pubSubTopic: broadcasterOptions.pubSubTopic,\n });\n\n this.pubSubTopic = BroadcasterConfig.pubSubTopic;\n if (broadcasterOptions.additionalDirectPeers) {\n this.additionalDirectPeers =\n broadcasterOptions.additionalDirectPeers;\n }\n if (isDefined(broadcasterOptions.peerDiscoveryTimeout)) {\n this.peerDiscoveryTimeout =\n broadcasterOptions.peerDiscoveryTimeout;\n }\n if (isDefined(broadcasterOptions.feeExpirationTimeout)) {\n BroadcasterConfig.feeExpirationTimeout =\n broadcasterOptions.feeExpirationTimeout;\n }\n if (isDefined(broadcasterOptions.historicalLookBackTime)) {\n BroadcasterConfig.historicalLookBackTime = broadcasterOptions.historicalLookBackTime\n }\n }\n\n static async disconnect() {\n await WakuObservers.unsubscribe(this.waku);\n await this.waku?.stop();\n this.waku = undefined;\n }\n\n protected static connect(): Promise<void> {\n throw new Error(\"Method 'connect' must be implemented.\");\n }\n\n static getMeshPeerCount(): number {\n return 0;\n }\n\n static getPubSubPeerCount(): number {\n return 0;\n }\n\n static async getLightPushPeerCount(): Promise<number> {\n if (!this.waku) return 0;\n return this.waku.libp2p.getConnections().length;\n }\n\n static async getFilterPeerCount(): Promise<number> {\n if (!this.waku) return 0;\n return this.waku.libp2p.getConnections().length;\n }\n\n static async getHealthSnapshot() {\n return getWakuHealthSnapshot({\n hasError: this.hasError,\n peerDiscoveryTimeout: this.peerDiscoveryTimeout,\n restartCount: this.restartCount,\n waku: this.waku,\n });\n }\n\n private static getLightPushAcceptedCount(result: {\n successes?: unknown[];\n recipients?: unknown[];\n failures?: unknown[];\n }): number {\n if (Array.isArray(result.successes)) {\n return result.successes.length;\n }\n if (Array.isArray(result.recipients)) {\n return result.recipients.length;\n }\n return 0;\n }\n\n static async broadcastMessage(data: object, topic: string): Promise<void> {\n if (!this.waku) {\n throw new Error('Waku not initialized');\n }\n const encoder = createEncoder({\n contentTopic: topic,\n routingInfo: BroadcasterConfig.getWakuRoutingInfo(),\n });\n\n const payload = utf8ToBytes(JSON.stringify(data));\n\n const result = await this.waku.lightPush.send(encoder, {\n payload,\n });\n\n const acceptedCount = this.getLightPushAcceptedCount(result);\n const failures = result.failures ?? [];\n\n if (failures.length > 0) {\n if (acceptedCount > 0) {\n return;\n }\n\n throw new Error('Failed to send message');\n }\n }\n\n static async retrieveHistoricalForTopic(topic: string): Promise<void> {\n if (!this.waku) {\n return;\n }\n\n const callback = WakuObservers.getCallbackForTopic(topic);\n if (!callback) {\n BroadcasterDebug.log(`No callback found for topic: ${topic}`);\n return;\n }\n\n const decoder = createDecoder(topic, BroadcasterConfig.getWakuRoutingInfo());\n\n try {\n const startTime = new Date()\n // TODO: make a variable\n startTime.setTime(Date.now() - (BroadcasterConfig.historicalLookBackTime))\n const endTime = new Date(Date.now())\n const options: QueryRequestParams = {\n includeData: true,\n pubsubTopic: BroadcasterConfig.pubSubTopic,\n contentTopics: [topic],\n paginationForward: true,\n }\n const lastMessage = WakuObservers.getLastMessage(topic);\n if (lastMessage) {\n const cursor = this.waku.store.createCursor(lastMessage)\n options.paginationCursor = cursor\n } else {\n options.timeStart = startTime\n options.timeEnd = endTime\n }\n const generator = this.waku.store.queryGenerator([decoder], options);\n for await (const messagesPromises of generator) {\n messagesPromises.reverse()\n for (const messagePromise of messagesPromises) {\n if (isDefined(messagePromise)) {\n const message = await messagePromise\n if (isDefined(message)) {\n callback(message);\n }\n }\n }\n }\n } catch (err) {\n if (err instanceof Error) {\n BroadcasterDebug.log(\n `Error retrieving historical messages: ${err.message}`,\n );\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"waku-broadcaster-waku-core-base.js","sourceRoot":"","sources":["../../src/waku/waku-broadcaster-waku-core-base.ts"],"names":[],"mappings":"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","sourcesContent":["import { Chain, delay } from '@railgun-community/shared-models';\nimport { WakuObservers } from './waku-observers.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { utf8ToBytes } from '../utils/conversion.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport {\n createEncoder,\n createDecoder,\n type LightNode,\n type IDecodedMessage,\n type QueryRequestParams,\n} from '@waku/sdk';\nimport { BroadcasterOptions } from '../models/index.js';\nimport {\n WAKU_RAILGUN_DEFAULT_SHARD,\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n} from '../models/constants.js';\nimport { BroadcasterFeeCache } from '../fees/broadcaster-fee-cache.js';\nimport { BroadcasterConfig } from '../models/broadcaster-config.js';\nimport { getWakuHealthSnapshot } from './waku-healthcheck.js';\n\nexport abstract class WakuBroadcasterWakuCoreBase {\n static hasError = false;\n static restartCallback: () => void;\n\n static waku: Optional<LightNode>;\n\n protected static pubSubTopic = WAKU_RAILGUN_PUB_SUB_TOPIC;\n protected static additionalDirectPeers: string[] = [];\n protected static peerDiscoveryTimeout = 60000;\n protected static defaultShard = WAKU_RAILGUN_DEFAULT_SHARD;\n public static restartCount = 0;\n\n static async initWaku(chain: Chain): Promise<void> {\n try {\n await this.connect();\n if (!this.waku) {\n BroadcasterDebug.log('No waku instance found');\n return;\n }\n WakuObservers.resetCurrentChain();\n await WakuObservers.setObserversForChain(\n this.waku,\n chain,\n );\n\n this.pollHistoricalTopics()\n\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n BroadcasterDebug.error(err);\n throw err;\n }\n }\n\n static async pollHistoricalTopics() {\n BroadcasterDebug.log(\"Polling historical messages\")\n const topics = WakuObservers.getCurrentContentTopics();\n for (const topic of topics) {\n await this.retrieveHistoricalForTopic(topic);\n }\n await delay(10_000)\n }\n\n static setWakuRestartCallback(callback: () => void) {\n this.restartCallback = callback;\n }\n\n static async reinitWaku(chain: Chain) {\n if (\n isDefined(this.waku) &&\n this.waku.isStarted()\n ) {\n // Reset fees, which will reset status to \"Searching\".\n await this.disconnect();\n }\n BroadcasterFeeCache.resetCache(chain);\n BroadcasterDebug.log(\n `Reinit Waku, ${++this.restartCount}`,\n );\n await this.initWaku(chain);\n if (this.restartCallback) {\n this.restartCallback();\n }\n }\n\n static setBroadcasterOptions(broadcasterOptions: BroadcasterOptions) {\n BroadcasterConfig.trustedFeeSigner = broadcasterOptions.trustedFeeSigner;\n\n if (isDefined(broadcasterOptions.pubSubTopic)) {\n this.pubSubTopic = broadcasterOptions.pubSubTopic;\n }\n if (broadcasterOptions.additionalDirectPeers) {\n this.additionalDirectPeers =\n broadcasterOptions.additionalDirectPeers;\n }\n if (isDefined(broadcasterOptions.peerDiscoveryTimeout)) {\n this.peerDiscoveryTimeout =\n broadcasterOptions.peerDiscoveryTimeout;\n }\n if (isDefined(broadcasterOptions.feeExpirationTimeout)) {\n BroadcasterConfig.feeExpirationTimeout =\n broadcasterOptions.feeExpirationTimeout;\n }\n if (isDefined(broadcasterOptions.historicalLookBackTime)) {\n BroadcasterConfig.historicalLookBackTime = broadcasterOptions.historicalLookBackTime\n }\n }\n\n static async disconnect() {\n await WakuObservers.unsubscribe(this.waku);\n await this.waku?.stop();\n this.waku = undefined;\n }\n\n protected static connect(): Promise<void> {\n throw new Error(\"Method 'connect' must be implemented.\");\n }\n\n static getMeshPeerCount(): number {\n return 0;\n }\n\n static getPubSubPeerCount(): number {\n return 0;\n }\n\n static async getLightPushPeerCount(): Promise<number> {\n if (!this.waku) return 0;\n return this.waku.libp2p.getConnections().length;\n }\n\n static async getFilterPeerCount(): Promise<number> {\n if (!this.waku) return 0;\n return this.waku.libp2p.getConnections().length;\n }\n\n static async getHealthSnapshot() {\n return getWakuHealthSnapshot({\n hasError: this.hasError,\n peerDiscoveryTimeout: this.peerDiscoveryTimeout,\n restartCount: this.restartCount,\n waku: this.waku,\n });\n }\n\n\n\n static async broadcastMessage(data: object, topic: string): Promise<void> {\n if (!this.waku) {\n throw new Error('Waku not initialized');\n }\n const encoder = createEncoder({\n contentTopic: topic,\n routingInfo: WAKU_RAILGUN_DEFAULT_SHARD\n });\n\n const payload = utf8ToBytes(JSON.stringify(data));\n\n const result = await this.waku.lightPush.send(encoder, {\n payload,\n });\n\n if (result.failures && result.failures.length > 0) {\n throw new Error(`Failed to send message: ${result.failures.map(f => f.error).join(', ')}`);\n }\n }\n\n static async retrieveHistoricalForTopic(topic: string): Promise<void> {\n if (!this.waku) {\n return;\n }\n\n const callback = WakuObservers.getCallbackForTopic(topic);\n if (!callback) {\n BroadcasterDebug.log(`No callback found for topic: ${topic}`);\n return;\n }\n\n const decoder = createDecoder(topic, WAKU_RAILGUN_DEFAULT_SHARD);\n\n try {\n const startTime = new Date();\n startTime.setTime(Date.now() - BroadcasterConfig.historicalLookBackTime);\n const endTime = new Date(Date.now());\n\n const optionsBase: QueryRequestParams = {\n includeData: true,\n pubsubTopic: this.pubSubTopic,\n contentTopics: [topic],\n paginationForward: true,\n };\n\n const runQuery = async (options: QueryRequestParams) => {\n const generator = this.waku!.store.queryGenerator([decoder], options);\n for await (const messagesPromises of generator) {\n messagesPromises.reverse();\n for (const messagePromise of messagesPromises) {\n if (isDefined(messagePromise)) {\n const message = await messagePromise;\n if (isDefined(message)) {\n callback(message);\n }\n }\n }\n }\n };\n\n const lastMessage = WakuObservers.getLastMessage(topic);\n if (lastMessage) {\n try {\n const cursor = this.waku.store.createCursor(lastMessage);\n await runQuery({\n ...optionsBase,\n paginationCursor: cursor,\n });\n } catch (err) {\n // Cursor can be invalid after restart / archive pruning.\n if (err instanceof Error && err.message.includes('cursor not found')) {\n BroadcasterDebug.log(\n `Historical cursor invalid (${topic}); retrying with time window.`,\n );\n await runQuery({\n ...optionsBase,\n timeStart: startTime,\n timeEnd: endTime,\n });\n } else {\n throw err;\n }\n }\n return;\n }\n\n await runQuery({\n ...optionsBase,\n timeStart: startTime,\n timeEnd: endTime,\n });\n } catch (err) {\n if (err instanceof Error) {\n BroadcasterDebug.log(\n `Error retrieving historical messages: ${err.message}`,\n );\n }\n }\n }\n}\n"]}
|
|
@@ -17,13 +17,13 @@ export declare class WakuBroadcasterClient {
|
|
|
17
17
|
static getPubSubPeerCount(): number;
|
|
18
18
|
static getLightPushPeerCount(): Promise<number>;
|
|
19
19
|
static getFilterPeerCount(): Promise<number>;
|
|
20
|
-
static findBestBroadcaster(chain: Chain, tokenAddress: string, useRelayAdapt: boolean): Optional<SelectedBroadcaster>;
|
|
21
|
-
static findAllBroadcastersForChain(chain: Chain, useRelayAdapt: boolean): Optional<SelectedBroadcaster[]>;
|
|
22
|
-
static findRandomBroadcasterForToken(chain: Chain, tokenAddress: string, useRelayAdapt: boolean, percentageThreshold?: number): Optional<SelectedBroadcaster>;
|
|
23
|
-
static findBroadcastersForToken(chain: Chain, tokenAddress: string, useRelayAdapt: boolean): Optional<SelectedBroadcaster[]>;
|
|
20
|
+
static findBestBroadcaster(chain: Chain, tokenAddress: string, useRelayAdapt: boolean, use7702Only?: boolean): Optional<SelectedBroadcaster>;
|
|
21
|
+
static findAllBroadcastersForChain(chain: Chain, useRelayAdapt: boolean, use7702Only?: boolean): Optional<SelectedBroadcaster[]>;
|
|
22
|
+
static findRandomBroadcasterForToken(chain: Chain, tokenAddress: string, useRelayAdapt: boolean, percentageThreshold?: number, use7702Only?: boolean): Optional<SelectedBroadcaster>;
|
|
23
|
+
static findBroadcastersForToken(chain: Chain, tokenAddress: string, useRelayAdapt: boolean, use7702Only?: boolean): Optional<SelectedBroadcaster[]>;
|
|
24
24
|
static setAddressFilters(allowlist: Optional<string[]>, blocklist: Optional<string[]>): void;
|
|
25
25
|
static tryReconnect(): Promise<void>;
|
|
26
|
-
static supportsToken(chain: Chain, tokenAddress: string, useRelayAdapt: boolean): boolean;
|
|
26
|
+
static supportsToken(chain: Chain, tokenAddress: string, useRelayAdapt: boolean, use7702Only?: boolean): boolean;
|
|
27
27
|
private static restart;
|
|
28
28
|
private static pollStatus;
|
|
29
29
|
private static updateStatus;
|
|
@@ -85,29 +85,29 @@ export class WakuBroadcasterClient {
|
|
|
85
85
|
static async getFilterPeerCount() {
|
|
86
86
|
return await WakuBroadcasterWakuCore.getFilterPeerCount();
|
|
87
87
|
}
|
|
88
|
-
static findBestBroadcaster(chain, tokenAddress, useRelayAdapt) {
|
|
88
|
+
static findBestBroadcaster(chain, tokenAddress, useRelayAdapt, use7702Only = false) {
|
|
89
89
|
if (!WakuBroadcasterClient.started) {
|
|
90
90
|
return;
|
|
91
91
|
}
|
|
92
|
-
return BroadcasterSearch.findBestBroadcaster(chain, tokenAddress, useRelayAdapt);
|
|
92
|
+
return BroadcasterSearch.findBestBroadcaster(chain, tokenAddress, useRelayAdapt, use7702Only);
|
|
93
93
|
}
|
|
94
|
-
static findAllBroadcastersForChain(chain, useRelayAdapt) {
|
|
94
|
+
static findAllBroadcastersForChain(chain, useRelayAdapt, use7702Only = false) {
|
|
95
95
|
if (!WakuBroadcasterClient.started) {
|
|
96
96
|
return [];
|
|
97
97
|
}
|
|
98
|
-
return BroadcasterSearch.findAllBroadcastersForChain(chain, useRelayAdapt);
|
|
98
|
+
return BroadcasterSearch.findAllBroadcastersForChain(chain, useRelayAdapt, false, use7702Only);
|
|
99
99
|
}
|
|
100
|
-
static findRandomBroadcasterForToken(chain, tokenAddress, useRelayAdapt, percentageThreshold = 5) {
|
|
100
|
+
static findRandomBroadcasterForToken(chain, tokenAddress, useRelayAdapt, percentageThreshold = 5, use7702Only = false) {
|
|
101
101
|
if (!WakuBroadcasterClient.started) {
|
|
102
102
|
return;
|
|
103
103
|
}
|
|
104
|
-
return BroadcasterSearch.findRandomBroadcasterForToken(chain, tokenAddress, useRelayAdapt, percentageThreshold);
|
|
104
|
+
return BroadcasterSearch.findRandomBroadcasterForToken(chain, tokenAddress, useRelayAdapt, percentageThreshold, use7702Only);
|
|
105
105
|
}
|
|
106
|
-
static findBroadcastersForToken(chain, tokenAddress, useRelayAdapt) {
|
|
106
|
+
static findBroadcastersForToken(chain, tokenAddress, useRelayAdapt, use7702Only = false) {
|
|
107
107
|
if (!WakuBroadcasterClient.started) {
|
|
108
108
|
return;
|
|
109
109
|
}
|
|
110
|
-
return BroadcasterSearch.findBroadcastersForToken(chain, tokenAddress, useRelayAdapt);
|
|
110
|
+
return BroadcasterSearch.findBroadcastersForToken(chain, tokenAddress, useRelayAdapt, false, use7702Only);
|
|
111
111
|
}
|
|
112
112
|
static setAddressFilters(allowlist, blocklist) {
|
|
113
113
|
AddressFilter.setAllowlist(allowlist);
|
|
@@ -118,8 +118,8 @@ export class WakuBroadcasterClient {
|
|
|
118
118
|
WakuBroadcasterClient.updateStatus();
|
|
119
119
|
await WakuBroadcasterClient.restart();
|
|
120
120
|
}
|
|
121
|
-
static supportsToken(chain, tokenAddress, useRelayAdapt) {
|
|
122
|
-
return BroadcasterFeeCache.supportsToken(chain, tokenAddress, useRelayAdapt);
|
|
121
|
+
static supportsToken(chain, tokenAddress, useRelayAdapt, use7702Only = false) {
|
|
122
|
+
return BroadcasterFeeCache.supportsToken(chain, tokenAddress, useRelayAdapt, use7702Only);
|
|
123
123
|
}
|
|
124
124
|
static async restart() {
|
|
125
125
|
if (this.isRestarting || !this.started) {
|
|
@@ -150,8 +150,9 @@ export class WakuBroadcasterClient {
|
|
|
150
150
|
static updateStatus() {
|
|
151
151
|
const status = BroadcasterStatus.getBroadcasterConnectionStatus(this.chain);
|
|
152
152
|
this.statusCallback(this.chain, status);
|
|
153
|
-
if (
|
|
154
|
-
status === BroadcasterConnectionStatus.
|
|
153
|
+
if (!this.isRestarting &&
|
|
154
|
+
(status === BroadcasterConnectionStatus.Disconnected ||
|
|
155
|
+
status === BroadcasterConnectionStatus.Error)) {
|
|
155
156
|
this.restart();
|
|
156
157
|
}
|
|
157
158
|
return status;
|
|
@@ -190,7 +191,6 @@ export class WakuBroadcasterClient {
|
|
|
190
191
|
isRestarting: this.isRestarting,
|
|
191
192
|
chain,
|
|
192
193
|
status,
|
|
193
|
-
...await WakuBroadcasterWakuCore.getHealthSnapshot(),
|
|
194
194
|
};
|
|
195
195
|
BroadcasterDebug.log(this.formatHealthcheckLog(healthSnapshot));
|
|
196
196
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waku-broadcaster-client.js","sourceRoot":"","sources":["../src/waku-broadcaster-client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Chain,\n delay,\n POI_REQUIRED_LISTS,\n BroadcasterConnectionStatus,\n SelectedBroadcaster,\n isDefined,\n} from '@railgun-community/shared-models';\nimport { BroadcasterFeeCache } from './fees/broadcaster-fee-cache.js';\nimport { AddressFilter } from './filters/address-filter.js';\nimport {\n BroadcasterConnectionStatusCallback,\n BroadcasterDebugger,\n BroadcasterOptions,\n} from './models/export-models.js';\nimport { BroadcasterConfig } from './models/broadcaster-config.js';\nimport { BroadcasterSearch } from './search/best-broadcaster.js';\nimport { BroadcasterStatus } from './status/broadcaster-connection-status.js';\nimport { BroadcasterDebug } from './utils/broadcaster-debug.js';\nimport { WakuObservers } from './waku/waku-observers.js';\nimport { WakuBroadcasterWakuCore } from './waku/waku-broadcaster-waku-core.js';\nimport type { LightNode } from '@waku/sdk';\nimport { contentTopics } from './waku/waku-topics.js';\n\nexport class WakuBroadcasterClient {\n private static chain: Chain;\n private static statusCallback: BroadcasterConnectionStatusCallback;\n private static started = false;\n private static isRestarting = false;\n\n static pollDelay = 3_000;\n\n static async start(\n chain: Chain,\n broadcasterOptions: BroadcasterOptions,\n statusCallback: BroadcasterConnectionStatusCallback,\n broadcasterDebugger?: BroadcasterDebugger,\n ) {\n this.chain = chain;\n this.statusCallback = statusCallback;\n\n WakuBroadcasterWakuCore.setBroadcasterOptions(broadcasterOptions);\n\n if (isDefined(broadcasterOptions.broadcasterVersionRange)) {\n BroadcasterConfig.MINIMUM_BROADCASTER_VERSION =\n broadcasterOptions.broadcasterVersionRange.minVersion;\n BroadcasterConfig.MAXIMUM_BROADCASTER_VERSION =\n broadcasterOptions.broadcasterVersionRange.maxVersion;\n }\n\n BroadcasterConfig.configurePeerConnections({\n useDNSDiscovery: broadcasterOptions.useDNSDiscovery,\n useCustomDNS: broadcasterOptions.useCustomDNS,\n dnsDiscoveryUrls: broadcasterOptions.dnsDiscoveryUrls,\n additionalDirectPeers: broadcasterOptions.additionalDirectPeers,\n additionalPeers: broadcasterOptions.additionalPeers,\n storePeers: broadcasterOptions.storePeers,\n });\n BroadcasterConfig.setHealthcheckLoggingEnabled(\n broadcasterOptions.enableHealthcheckLogs ?? false,\n );\n\n if (isDefined(broadcasterDebugger)) {\n BroadcasterDebug.setDebugger(broadcasterDebugger);\n }\n\n BroadcasterFeeCache.init(\n broadcasterOptions.poiActiveListKeys ??\n POI_REQUIRED_LISTS.map(list => list.key),\n );\n\n try {\n this.started = false;\n await WakuBroadcasterWakuCore.initWaku(chain);\n this.started = true;\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.pollStatus();\n } catch (cause) {\n if (!(cause instanceof Error)) {\n throw new Error('Unexpected non-error thrown', { cause });\n }\n throw new Error('Cannot connect to Broadcaster network.', { cause });\n }\n }\n\n static async stop() {\n await WakuBroadcasterWakuCore.disconnect();\n this.started = false;\n this.updateStatus();\n }\n\n static isStarted() {\n return this.started;\n }\n\n static setHealthcheckLoggingEnabled(enabled: boolean) {\n BroadcasterConfig.setHealthcheckLoggingEnabled(enabled);\n }\n\n static async setChain(chain: Chain): Promise<void> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n WakuBroadcasterClient.chain = chain;\n await WakuObservers.setObserversForChain(\n WakuBroadcasterWakuCore.waku,\n chain,\n );\n WakuBroadcasterClient.updateStatus();\n }\n\n static getContentTopics(): string[] {\n return WakuObservers.getCurrentContentTopics();\n }\n\n static getMeshPeerCount(): number {\n return WakuBroadcasterWakuCore.getMeshPeerCount();\n }\n\n static getPubSubPeerCount(): number {\n return WakuBroadcasterWakuCore.getPubSubPeerCount();\n }\n\n static async getLightPushPeerCount(): Promise<number> {\n return await WakuBroadcasterWakuCore.getLightPushPeerCount();\n }\n\n static async getFilterPeerCount(): Promise<number> {\n return await WakuBroadcasterWakuCore.getFilterPeerCount();\n }\n /**\n * The function `findBestBroadcaster` finds the broadcaster with the lowest fees for a given chain and token.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network, a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster> object.\n */\n static findBestBroadcaster(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findBestBroadcaster(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n /**\n * The function `findAllBroadcastersForChain` returns an array of all available broadcasters fee-tokens for a given chain.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find all broadcasters for.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster[]> object.\n */\n static findAllBroadcastersForChain(\n chain: Chain,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster[]> {\n if (!WakuBroadcasterClient.started) {\n return [];\n }\n\n return BroadcasterSearch.findAllBroadcastersForChain(chain, useRelayAdapt);\n }\n\n /**\n * The function `findRandomBroadcasterForToken` selects a random broadcaster from a list of broadcasters that is based on\n * their fees for a specific token, and how much higher their fees are compared to the broadcaster with\n * the lowest fees.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network, a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @param {number} [percentageThreshold=5] - The `percentageThreshold` parameter is a number that\n * represents the maximum percentage increase in fees that a broadcaster can have compared to the broadcaster\n * with the lowest fees. For example, if the `percentageThreshold` is set to 5, it means that a\n * broadcaster can have a maximum of 5% higher fees than the broadcaster with the lowest fees and still be selected.\n * Defaults to 5.\n * @returns an Optional<SelectedBroadcaster> object.\n */\n static findRandomBroadcasterForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n percentageThreshold: number = 5,\n ): Optional<SelectedBroadcaster> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findRandomBroadcasterForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n percentageThreshold,\n );\n }\n\n /**\n * The function `findBroadcastersForToken` takes in a chain, token address, and a boolean flag, and\n * returns an array of selected broadcasters based on the provided parameters.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network; a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster[]> object.\n */\n static findBroadcastersForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster[]> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findBroadcastersForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n static setAddressFilters(\n allowlist: Optional<string[]>,\n blocklist: Optional<string[]>,\n ): void {\n AddressFilter.setAllowlist(allowlist);\n AddressFilter.setBlocklist(blocklist);\n }\n\n static async tryReconnect(): Promise<void> {\n // Reset fees, which will reset status to \"Searching\".\n BroadcasterFeeCache.resetCache(WakuBroadcasterClient.chain);\n WakuBroadcasterClient.updateStatus();\n\n await WakuBroadcasterClient.restart();\n }\n\n static supportsToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ) {\n return BroadcasterFeeCache.supportsToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n private static async restart(): Promise<void> {\n if (this.isRestarting || !this.started) {\n return;\n }\n this.isRestarting = true;\n try {\n BroadcasterDebug.log('Restarting Waku...');\n await WakuBroadcasterWakuCore.reinitWaku(this.chain);\n this.isRestarting = false;\n } catch (cause) {\n this.isRestarting = false;\n if (!(cause instanceof Error)) {\n return;\n }\n BroadcasterDebug.error(\n new Error('Error reinitializing Waku Broadcaster Client', { cause }),\n );\n }\n }\n\n /**\n * Start keep-alive poller which checks Broadcaster status every few seconds.\n */\n private static async pollStatus(): Promise<void> {\n const status = this.updateStatus();\n if (BroadcasterConfig.enableHealthcheckLogs) {\n await this.logHealthcheck(status);\n }\n await delay(WakuBroadcasterClient.pollDelay);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.pollStatus();\n }\n\n private static updateStatus(): BroadcasterConnectionStatus {\n const status = BroadcasterStatus.getBroadcasterConnectionStatus(this.chain);\n\n this.statusCallback(this.chain, status);\n if (\n status === BroadcasterConnectionStatus.Disconnected ||\n status === BroadcasterConnectionStatus.Error\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.restart();\n }\n\n return status;\n }\n\n private static formatHealthcheckLog(healthSnapshot: any): string {\n const discovery = healthSnapshot.discovery ?? {};\n const peerStore = discovery.peerStore ?? {};\n const connectedPeerDetails = discovery.connectedPeerDetails ?? [];\n\n const lines = [\n 'Waku healthcheck:',\n ` status: ${healthSnapshot.status}`,\n ` chain: ${healthSnapshot.chain}`,\n ` started: ${healthSnapshot.started}, restarting: ${healthSnapshot.isRestarting}, wakuStarted: ${healthSnapshot.isStarted}, error: ${healthSnapshot.hasError}`,\n ` routing: cluster=${healthSnapshot.routing.clusterId}, shard=${healthSnapshot.routing.shardId}, topic=${healthSnapshot.routing.pubsubTopic}`,\n ` configured peers: dns=${healthSnapshot.configuredPeers.dnsDiscoveryUrls.length}, bootstrap=${healthSnapshot.configuredPeers.bootstrapPeers.length}, store=${healthSnapshot.configuredPeers.storePeers.length}`,\n ` connections: ${healthSnapshot.connections.count} / peers=${healthSnapshot.connections.peers.join(', ') || 'none'}`,\n ` peer store: total=${peerStore.count ?? 0}, bootstrap=${peerStore.bootstrapCount ?? 0}, peer-exchange=${peerStore.peerExchangeCount ?? 0}`,\n ` connected peer-exchange support: ${peerStore.connectedPeersSupportingPeerExchange?.join(', ') || 'none'}`,\n ` content topics: ${healthSnapshot.contentTopics.join(', ') || 'none'}`,\n ];\n\n if (connectedPeerDetails.length) {\n lines.push(' connected peer details:');\n for (const peer of connectedPeerDetails) {\n lines.push(\n ` - ${peer.peerId} | px=${peer.supportsPeerExchange} | tags=${peer.tags.join(', ') || 'none'} | protocols=${peer.protocols.join(', ') || 'none'}`,\n );\n }\n }\n\n return lines.join('\\n');\n }\n\n private static async logHealthcheck(status: BroadcasterConnectionStatus) {\n const chain = this.chain\n ? `${this.chain.type}:${this.chain.id}`\n : 'undefined';\n const healthSnapshot = {\n pollDelay: this.pollDelay,\n started: this.started,\n isRestarting: this.isRestarting,\n chain,\n status,\n ...await WakuBroadcasterWakuCore.getHealthSnapshot(),\n };\n\n BroadcasterDebug.log(this.formatHealthcheckLog(healthSnapshot));\n }\n\n // Waku Transport functions\n static async addTransportSubscription(\n waku: Optional<LightNode>,\n topic: string,\n callback: (message: any) => void,\n ): Promise<void> {\n await WakuObservers.addTransportSubscription(\n WakuBroadcasterWakuCore.waku,\n topic,\n callback,\n );\n }\n\n static async sendTransport(data: object, topic: string): Promise<void> {\n const customTopic = contentTopics.encrypted(topic);\n try {\n\n await WakuBroadcasterWakuCore.broadcastMessage(data, customTopic);\n } catch (e) {\n BroadcasterDebug.log(\n `SendTransport error: ${e.message}`\n )\n }\n }\n\n static getWakuCore(): Optional<LightNode> {\n return WakuBroadcasterWakuCore.waku;\n }\n\n static setRestartCallback(callback: () => void): void {\n WakuBroadcasterWakuCore.setWakuRestartCallback(callback);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"waku-broadcaster-client.js","sourceRoot":"","sources":["../src/waku-broadcaster-client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Chain,\n delay,\n POI_REQUIRED_LISTS,\n BroadcasterConnectionStatus,\n SelectedBroadcaster,\n isDefined,\n} from '@railgun-community/shared-models';\nimport { BroadcasterFeeCache } from './fees/broadcaster-fee-cache.js';\nimport { AddressFilter } from './filters/address-filter.js';\nimport {\n BroadcasterConnectionStatusCallback,\n BroadcasterDebugger,\n BroadcasterOptions,\n} from './models/export-models.js';\nimport { BroadcasterConfig } from './models/broadcaster-config.js';\nimport { BroadcasterSearch } from './search/best-broadcaster.js';\nimport { BroadcasterStatus } from './status/broadcaster-connection-status.js';\nimport { BroadcasterDebug } from './utils/broadcaster-debug.js';\nimport { WakuObservers } from './waku/waku-observers.js';\nimport { WakuBroadcasterWakuCore } from './waku/waku-broadcaster-waku-core.js';\nimport type { LightNode } from '@waku/sdk';\nimport { contentTopics } from './waku/waku-topics.js';\n\nexport class WakuBroadcasterClient {\n private static chain: Chain;\n private static statusCallback: BroadcasterConnectionStatusCallback;\n private static started = false;\n private static isRestarting = false;\n\n static pollDelay = 3_000;\n\n static async start(\n chain: Chain,\n broadcasterOptions: BroadcasterOptions,\n statusCallback: BroadcasterConnectionStatusCallback,\n broadcasterDebugger?: BroadcasterDebugger,\n ) {\n this.chain = chain;\n this.statusCallback = statusCallback;\n\n WakuBroadcasterWakuCore.setBroadcasterOptions(broadcasterOptions);\n\n if (isDefined(broadcasterOptions.broadcasterVersionRange)) {\n BroadcasterConfig.MINIMUM_BROADCASTER_VERSION =\n broadcasterOptions.broadcasterVersionRange.minVersion;\n BroadcasterConfig.MAXIMUM_BROADCASTER_VERSION =\n broadcasterOptions.broadcasterVersionRange.maxVersion;\n }\n\n BroadcasterConfig.configurePeerConnections({\n useDNSDiscovery: broadcasterOptions.useDNSDiscovery,\n useCustomDNS: broadcasterOptions.useCustomDNS,\n dnsDiscoveryUrls: broadcasterOptions.dnsDiscoveryUrls,\n additionalDirectPeers: broadcasterOptions.additionalDirectPeers,\n additionalPeers: broadcasterOptions.additionalPeers,\n storePeers: broadcasterOptions.storePeers,\n });\n BroadcasterConfig.setHealthcheckLoggingEnabled(\n broadcasterOptions.enableHealthcheckLogs ?? false,\n );\n\n if (isDefined(broadcasterDebugger)) {\n BroadcasterDebug.setDebugger(broadcasterDebugger);\n }\n\n BroadcasterFeeCache.init(\n broadcasterOptions.poiActiveListKeys ??\n POI_REQUIRED_LISTS.map(list => list.key),\n );\n\n try {\n this.started = false;\n await WakuBroadcasterWakuCore.initWaku(chain);\n this.started = true;\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.pollStatus();\n } catch (cause) {\n if (!(cause instanceof Error)) {\n throw new Error('Unexpected non-error thrown', { cause });\n }\n throw new Error('Cannot connect to Broadcaster network.', { cause });\n }\n }\n\n static async stop() {\n await WakuBroadcasterWakuCore.disconnect();\n this.started = false;\n this.updateStatus();\n }\n\n static isStarted() {\n return this.started;\n }\n\n static setHealthcheckLoggingEnabled(enabled: boolean) {\n BroadcasterConfig.setHealthcheckLoggingEnabled(enabled);\n }\n\n static async setChain(chain: Chain): Promise<void> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n WakuBroadcasterClient.chain = chain;\n await WakuObservers.setObserversForChain(\n WakuBroadcasterWakuCore.waku,\n chain,\n );\n WakuBroadcasterClient.updateStatus();\n }\n\n static getContentTopics(): string[] {\n return WakuObservers.getCurrentContentTopics();\n }\n\n static getMeshPeerCount(): number {\n return WakuBroadcasterWakuCore.getMeshPeerCount();\n }\n\n static getPubSubPeerCount(): number {\n return WakuBroadcasterWakuCore.getPubSubPeerCount();\n }\n\n static async getLightPushPeerCount(): Promise<number> {\n return await WakuBroadcasterWakuCore.getLightPushPeerCount();\n }\n\n static async getFilterPeerCount(): Promise<number> {\n return await WakuBroadcasterWakuCore.getFilterPeerCount();\n }\n /**\n * The function `findBestBroadcaster` finds the broadcaster with the lowest fees for a given chain and token.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network, a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster> object.\n */\n static findBestBroadcaster(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n use7702Only = false,\n ): Optional<SelectedBroadcaster> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findBestBroadcaster(\n chain,\n tokenAddress,\n useRelayAdapt,\n use7702Only,\n );\n }\n\n /**\n * The function `findAllBroadcastersForChain` returns an array of all available broadcasters fee-tokens for a given chain.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find all broadcasters for.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster[]> object.\n */\n static findAllBroadcastersForChain(\n chain: Chain,\n useRelayAdapt: boolean,\n use7702Only = false,\n ): Optional<SelectedBroadcaster[]> {\n if (!WakuBroadcasterClient.started) {\n return [];\n }\n\n return BroadcasterSearch.findAllBroadcastersForChain(\n chain,\n useRelayAdapt,\n false,\n use7702Only,\n );\n }\n\n /**\n * The function `findRandomBroadcasterForToken` selects a random broadcaster from a list of broadcasters that is based on\n * their fees for a specific token, and how much higher their fees are compared to the broadcaster with\n * the lowest fees.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network, a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @param {number} [percentageThreshold=5] - The `percentageThreshold` parameter is a number that\n * represents the maximum percentage increase in fees that a broadcaster can have compared to the broadcaster\n * with the lowest fees. For example, if the `percentageThreshold` is set to 5, it means that a\n * broadcaster can have a maximum of 5% higher fees than the broadcaster with the lowest fees and still be selected.\n * Defaults to 5.\n * @returns an Optional<SelectedBroadcaster> object.\n */\n static findRandomBroadcasterForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n percentageThreshold: number = 5,\n use7702Only = false,\n ): Optional<SelectedBroadcaster> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findRandomBroadcasterForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n percentageThreshold,\n use7702Only,\n );\n }\n\n /**\n * The function `findBroadcastersForToken` takes in a chain, token address, and a boolean flag, and\n * returns an array of selected broadcasters based on the provided parameters.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network; a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster[]> object.\n */\n static findBroadcastersForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n use7702Only = false,\n ): Optional<SelectedBroadcaster[]> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findBroadcastersForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n false,\n use7702Only,\n );\n }\n\n static setAddressFilters(\n allowlist: Optional<string[]>,\n blocklist: Optional<string[]>,\n ): void {\n AddressFilter.setAllowlist(allowlist);\n AddressFilter.setBlocklist(blocklist);\n }\n\n static async tryReconnect(): Promise<void> {\n // Reset fees, which will reset status to \"Searching\".\n BroadcasterFeeCache.resetCache(WakuBroadcasterClient.chain);\n WakuBroadcasterClient.updateStatus();\n\n await WakuBroadcasterClient.restart();\n }\n\n static supportsToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n use7702Only = false,\n ) {\n return BroadcasterFeeCache.supportsToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n use7702Only,\n );\n }\n\n private static async restart(): Promise<void> {\n if (this.isRestarting || !this.started) {\n return;\n }\n this.isRestarting = true;\n try {\n BroadcasterDebug.log('Restarting Waku...');\n await WakuBroadcasterWakuCore.reinitWaku(this.chain);\n this.isRestarting = false;\n } catch (cause) {\n this.isRestarting = false;\n if (!(cause instanceof Error)) {\n return;\n }\n BroadcasterDebug.error(\n new Error('Error reinitializing Waku Broadcaster Client', { cause }),\n );\n }\n }\n\n /**\n * Start keep-alive poller which checks Broadcaster status every few seconds.\n */\n private static async pollStatus(): Promise<void> {\n const status = this.updateStatus();\n if (BroadcasterConfig.enableHealthcheckLogs) {\n await this.logHealthcheck(status);\n }\n await delay(WakuBroadcasterClient.pollDelay);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.pollStatus();\n }\n\n private static updateStatus(): BroadcasterConnectionStatus {\n const status = BroadcasterStatus.getBroadcasterConnectionStatus(this.chain);\n this.statusCallback(this.chain, status);\n if (\n !this.isRestarting &&\n (status === BroadcasterConnectionStatus.Disconnected ||\n status === BroadcasterConnectionStatus.Error)\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.restart();\n }\n\n return status;\n }\n\n private static formatHealthcheckLog(healthSnapshot: any): string {\n const discovery = healthSnapshot.discovery ?? {};\n const peerStore = discovery.peerStore ?? {};\n const connectedPeerDetails = discovery.connectedPeerDetails ?? [];\n\n const lines = [\n 'Waku healthcheck:',\n ` status: ${healthSnapshot.status}`,\n ` chain: ${healthSnapshot.chain}`,\n ` started: ${healthSnapshot.started}, restarting: ${healthSnapshot.isRestarting}, wakuStarted: ${healthSnapshot.isStarted}, error: ${healthSnapshot.hasError}`,\n ` routing: cluster=${healthSnapshot.routing.clusterId}, shard=${healthSnapshot.routing.shardId}, topic=${healthSnapshot.routing.pubsubTopic}`,\n ` configured peers: dns=${healthSnapshot.configuredPeers.dnsDiscoveryUrls.length}, bootstrap=${healthSnapshot.configuredPeers.bootstrapPeers.length}, store=${healthSnapshot.configuredPeers.storePeers.length}`,\n ` connections: ${healthSnapshot.connections.count} / peers=${healthSnapshot.connections.peers.join(', ') || 'none'}`,\n ` peer store: total=${peerStore.count ?? 0}, bootstrap=${peerStore.bootstrapCount ?? 0}, peer-exchange=${peerStore.peerExchangeCount ?? 0}`,\n ` connected peer-exchange support: ${peerStore.connectedPeersSupportingPeerExchange?.join(', ') || 'none'}`,\n ` content topics: ${healthSnapshot.contentTopics.join(', ') || 'none'}`,\n ];\n\n if (connectedPeerDetails.length) {\n lines.push(' connected peer details:');\n for (const peer of connectedPeerDetails) {\n lines.push(\n ` - ${peer.peerId} | px=${peer.supportsPeerExchange} | tags=${peer.tags.join(', ') || 'none'} | protocols=${peer.protocols.join(', ') || 'none'}`,\n );\n }\n }\n\n return lines.join('\\n');\n }\n\n private static async logHealthcheck(status: BroadcasterConnectionStatus) {\n const chain = this.chain\n ? `${this.chain.type}:${this.chain.id}`\n : 'undefined';\n const healthSnapshot = {\n pollDelay: this.pollDelay,\n started: this.started,\n isRestarting: this.isRestarting,\n chain,\n status,\n // ...await WakuBroadcasterWakuCore.getHealthSnapshot(),\n };\n\n BroadcasterDebug.log(this.formatHealthcheckLog(healthSnapshot));\n }\n\n // Waku Transport functions\n static async addTransportSubscription(\n waku: Optional<LightNode>,\n topic: string,\n callback: (message: any) => void,\n ): Promise<void> {\n await WakuObservers.addTransportSubscription(\n WakuBroadcasterWakuCore.waku,\n topic,\n callback,\n );\n }\n\n static async sendTransport(data: object, topic: string): Promise<void> {\n const customTopic = contentTopics.encrypted(topic);\n try {\n\n await WakuBroadcasterWakuCore.broadcastMessage(data, customTopic);\n } catch (e) {\n BroadcasterDebug.log(\n `SendTransport error: ${e.message}`\n )\n }\n }\n\n static getWakuCore(): Optional<LightNode> {\n return WakuBroadcasterWakuCore.waku;\n }\n\n static setRestartCallback(callback: () => void): void {\n WakuBroadcasterWakuCore.setWakuRestartCallback(callback);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@railgun-community/waku-broadcaster-client-web",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.2.0-rc.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -40,12 +40,12 @@
|
|
|
40
40
|
"protons-runtime": "5.6.0"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
|
-
"@railgun-community/shared-models": "
|
|
44
|
-
"@railgun-community/wallet": "
|
|
43
|
+
"@railgun-community/shared-models": "8.1.0-rc.1",
|
|
44
|
+
"@railgun-community/wallet": "10.10.0-rc.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@railgun-community/shared-models": "
|
|
48
|
-
"@railgun-community/wallet": "
|
|
47
|
+
"@railgun-community/shared-models": "8.1.0-rc.1",
|
|
48
|
+
"@railgun-community/wallet": "10.10.0-rc.0",
|
|
49
49
|
"@types/chai": "^4.3.5",
|
|
50
50
|
"@types/chai-as-promised": "^7.1.5",
|
|
51
51
|
"@types/leveldown": "^4.0.3",
|