@waiaas/adapter-evm 2.6.0-rc → 2.6.0-rc.10
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.
|
@@ -19,6 +19,8 @@ export declare class EvmIncomingSubscriber implements IChainSubscriber {
|
|
|
19
19
|
private client;
|
|
20
20
|
private subscriptions;
|
|
21
21
|
private generateId;
|
|
22
|
+
private errorCount;
|
|
23
|
+
private backoffUntil;
|
|
22
24
|
constructor(config: {
|
|
23
25
|
rpcUrl: string;
|
|
24
26
|
generateId?: () => string;
|
|
@@ -29,6 +31,11 @@ export declare class EvmIncomingSubscriber implements IChainSubscriber {
|
|
|
29
31
|
connect(): Promise<void>;
|
|
30
32
|
waitForDisconnect(): Promise<void>;
|
|
31
33
|
destroy(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Returns the current block number from the connected EVM RPC.
|
|
36
|
+
* Used by the confirmation worker to compare against DETECTED tx block numbers.
|
|
37
|
+
*/
|
|
38
|
+
getBlockNumber(): Promise<bigint>;
|
|
32
39
|
pollAll(): Promise<void>;
|
|
33
40
|
private pollERC20;
|
|
34
41
|
private pollNativeETH;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-incoming-subscriber.d.ts","sourceRoot":"","sources":["../src/evm-incoming-subscriber.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"evm-incoming-subscriber.d.ts","sourceRoot":"","sources":["../src/evm-incoming-subscriber.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAwBrF,qBAAa,qBAAsB,YAAW,gBAAgB;IAC5D,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAc;IAEvC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,UAAU,CAAe;IACjC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAAK;gBAEb,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,MAAM,CAAA;KAAE;IAO3D,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,CAAC,EAAE,EAAE,mBAAmB,KAAK,IAAI,GAC/C,OAAO,CAAC,IAAI,CAAC;IAYV,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlD,iBAAiB,IAAI,MAAM,EAAE;IAMvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQlC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAMjC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAsEhB,SAAS;YA8BT,aAAa;CA4C5B"}
|
|
@@ -18,11 +18,19 @@ import { createPublicClient, http, parseAbiItem, } from 'viem';
|
|
|
18
18
|
const TRANSFER_EVENT = parseAbiItem('event Transfer(address indexed from, address indexed to, uint256 value)');
|
|
19
19
|
/** Maximum blocks per poll cycle (pitfall 4: RPC provider limits). */
|
|
20
20
|
const MAX_BLOCK_RANGE = 10n;
|
|
21
|
+
/** Base backoff in ms after first RPC error. */
|
|
22
|
+
const BACKOFF_BASE_MS = 30_000;
|
|
23
|
+
/** Maximum backoff in ms (cap). */
|
|
24
|
+
const BACKOFF_MAX_MS = 300_000;
|
|
25
|
+
/** Consecutive errors before escalating log level to warn. */
|
|
26
|
+
const WARN_THRESHOLD = 3;
|
|
21
27
|
export class EvmIncomingSubscriber {
|
|
22
28
|
chain = 'ethereum';
|
|
23
29
|
client;
|
|
24
30
|
subscriptions = new Map();
|
|
25
31
|
generateId;
|
|
32
|
+
errorCount = 0;
|
|
33
|
+
backoffUntil = 0;
|
|
26
34
|
constructor(config) {
|
|
27
35
|
this.client = createPublicClient({ transport: http(config.rpcUrl) });
|
|
28
36
|
this.generateId = config.generateId ?? (() => crypto.randomUUID());
|
|
@@ -60,26 +68,56 @@ export class EvmIncomingSubscriber {
|
|
|
60
68
|
async destroy() {
|
|
61
69
|
this.subscriptions.clear();
|
|
62
70
|
}
|
|
71
|
+
// -- RPC helpers (used by confirmation worker) --
|
|
72
|
+
/**
|
|
73
|
+
* Returns the current block number from the connected EVM RPC.
|
|
74
|
+
* Used by the confirmation worker to compare against DETECTED tx block numbers.
|
|
75
|
+
*/
|
|
76
|
+
async getBlockNumber() {
|
|
77
|
+
return this.client.getBlockNumber();
|
|
78
|
+
}
|
|
63
79
|
// -- Polling (called by BackgroundWorkers in Phase 226) --
|
|
64
80
|
async pollAll() {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
81
|
+
// Backoff: skip polling if still within backoff window
|
|
82
|
+
if (Date.now() < this.backoffUntil)
|
|
83
|
+
return;
|
|
84
|
+
let hadError = false;
|
|
85
|
+
try {
|
|
86
|
+
const currentBlock = await this.client.getBlockNumber();
|
|
87
|
+
for (const [walletId, sub] of this.subscriptions) {
|
|
88
|
+
try {
|
|
89
|
+
if (sub.lastBlock >= currentBlock)
|
|
90
|
+
continue; // no new blocks
|
|
91
|
+
const toBlock = sub.lastBlock + MAX_BLOCK_RANGE < currentBlock
|
|
92
|
+
? sub.lastBlock + MAX_BLOCK_RANGE
|
|
93
|
+
: currentBlock;
|
|
94
|
+
const erc20Txs = await this.pollERC20(sub.address, sub.lastBlock + 1n, toBlock, walletId, sub.network);
|
|
95
|
+
const nativeTxs = await this.pollNativeETH(sub.address, sub.lastBlock + 1n, toBlock, walletId, sub.network);
|
|
96
|
+
const allTxs = [...erc20Txs, ...nativeTxs];
|
|
97
|
+
for (const tx of allTxs) {
|
|
98
|
+
sub.onTransaction(tx);
|
|
99
|
+
}
|
|
100
|
+
sub.lastBlock = toBlock;
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
hadError = true;
|
|
104
|
+
// Per-wallet error: don't apply global backoff for individual wallet failures
|
|
105
|
+
console.warn(`EVM poll failed for wallet ${walletId}:`, err);
|
|
78
106
|
}
|
|
79
|
-
sub.lastBlock = toBlock;
|
|
80
107
|
}
|
|
81
|
-
|
|
82
|
-
|
|
108
|
+
// Full cycle completed without RPC-level failure → reset backoff
|
|
109
|
+
if (!hadError) {
|
|
110
|
+
this.errorCount = 0;
|
|
111
|
+
this.backoffUntil = 0;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
// RPC-level error (e.g. getBlockNumber failed — 429/500): apply backoff
|
|
116
|
+
this.errorCount++;
|
|
117
|
+
const backoffMs = Math.min(BACKOFF_BASE_MS * 2 ** (this.errorCount - 1), BACKOFF_MAX_MS);
|
|
118
|
+
this.backoffUntil = Date.now() + backoffMs;
|
|
119
|
+
if (this.errorCount >= WARN_THRESHOLD) {
|
|
120
|
+
console.warn(`EVM poll RPC error (backoff ${backoffMs / 1000}s, consecutive: ${this.errorCount}):`, err);
|
|
83
121
|
}
|
|
84
122
|
}
|
|
85
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-incoming-subscriber.js","sourceRoot":"","sources":["../src/evm-incoming-subscriber.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,kBAAkB,EAClB,IAAI,EACJ,YAAY,GAGb,MAAM,MAAM,CAAC;AAGd,6DAA6D;AAC7D,MAAM,cAAc,GAAG,YAAY,CACjC,yEAAyE,CAC1E,CAAC;AAEF,sEAAsE;AACtE,MAAM,eAAe,GAAG,GAAG,CAAC;AAS5B,MAAM,OAAO,qBAAqB;IACvB,KAAK,GAAc,UAAU,CAAC;IAE/B,MAAM,CAAe;IACrB,aAAa,GAAG,IAAI,GAAG,EAA2B,CAAC;IACnD,UAAU,CAAe;
|
|
1
|
+
{"version":3,"file":"evm-incoming-subscriber.js","sourceRoot":"","sources":["../src/evm-incoming-subscriber.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@waiaas/adapter-evm",
|
|
3
|
-
"version": "2.6.0-rc",
|
|
3
|
+
"version": "2.6.0-rc.10",
|
|
4
4
|
"description": "WAIaaS EVM chain adapter - Ethereum/ERC-20 support via viem",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"viem": "^2.21.0",
|
|
32
|
-
"@waiaas/core": "2.6.0-rc"
|
|
32
|
+
"@waiaas/core": "2.6.0-rc.10"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/node": "^25.2.3"
|