@agentaos/chains 1.2.0 → 3.0.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/package.json +3 -4
- package/dist/ethereum/ethereum.decoder.test.d.ts +0 -2
- package/dist/ethereum/ethereum.decoder.test.d.ts.map +0 -1
- package/dist/ethereum/ethereum.decoder.test.js +0 -32
- package/dist/ethereum/ethereum.decoder.test.js.map +0 -1
- package/dist/ethereum/ethereum.nonce.test.d.ts +0 -2
- package/dist/ethereum/ethereum.nonce.test.d.ts.map +0 -1
- package/dist/ethereum/ethereum.nonce.test.js +0 -99
- package/dist/ethereum/ethereum.nonce.test.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentaos/chains",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Ethereum chain adapter for AgentaOS threshold wallet",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "AgentaOS <hello@agentaos.ai>",
|
|
@@ -39,11 +39,10 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"viem": "^2.21.0",
|
|
42
|
-
"@agentaos/core": "
|
|
42
|
+
"@agentaos/core": "3.0.0"
|
|
43
43
|
},
|
|
44
|
-
"devDependencies": {},
|
|
45
44
|
"scripts": {
|
|
46
|
-
"build": "tsc",
|
|
45
|
+
"build": "tsc -p tsconfig.build.json",
|
|
47
46
|
"lint": "biome check src/",
|
|
48
47
|
"test": "vitest run",
|
|
49
48
|
"typecheck": "tsc --noEmit",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ethereum.decoder.test.d.ts","sourceRoot":"","sources":["../../src/ethereum/ethereum.decoder.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { decodeCalldata } from './ethereum.decoder.js';
|
|
3
|
-
describe('decodeCalldata', () => {
|
|
4
|
-
it('returns undefined for data shorter than 4 bytes', () => {
|
|
5
|
-
expect(decodeCalldata(new Uint8Array([0x01, 0x02]))).toBeUndefined();
|
|
6
|
-
expect(decodeCalldata(new Uint8Array([]))).toBeUndefined();
|
|
7
|
-
});
|
|
8
|
-
it('decodes known ERC20 transfer selector', () => {
|
|
9
|
-
// 0xa9059cbb = transfer(address,uint256)
|
|
10
|
-
const data = new Uint8Array([0xa9, 0x05, 0x9c, 0xbb, 0x00, 0x00]);
|
|
11
|
-
const result = decodeCalldata(data);
|
|
12
|
-
expect(result).toBeDefined();
|
|
13
|
-
expect(result?.selector).toBe('0xa9059cbb');
|
|
14
|
-
expect(result?.name).toBe('transfer(address,uint256)');
|
|
15
|
-
});
|
|
16
|
-
it('decodes known approve selector', () => {
|
|
17
|
-
// 0x095ea7b3 = approve(address,uint256)
|
|
18
|
-
const data = new Uint8Array([0x09, 0x5e, 0xa7, 0xb3]);
|
|
19
|
-
const result = decodeCalldata(data);
|
|
20
|
-
expect(result).toBeDefined();
|
|
21
|
-
expect(result?.selector).toBe('0x095ea7b3');
|
|
22
|
-
expect(result?.name).toBe('approve(address,uint256)');
|
|
23
|
-
});
|
|
24
|
-
it('returns unknown for unrecognized selector', () => {
|
|
25
|
-
const data = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);
|
|
26
|
-
const result = decodeCalldata(data);
|
|
27
|
-
expect(result).toBeDefined();
|
|
28
|
-
expect(result?.selector).toBe('0xdeadbeef');
|
|
29
|
-
expect(result?.name).toBe('unknown(0xdeadbeef)');
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
//# sourceMappingURL=ethereum.decoder.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ethereum.decoder.test.js","sourceRoot":"","sources":["../../src/ethereum/ethereum.decoder.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACrE,MAAM,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAChD,yCAAyC;QACzC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACzC,wCAAwC;QACxC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ethereum.nonce.test.d.ts","sourceRoot":"","sources":["../../src/ethereum/ethereum.nonce.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { EthereumNonceManager } from './ethereum.nonce.js';
|
|
3
|
-
describe('EthereumNonceManager', () => {
|
|
4
|
-
const address = '0x1234567890abcdef1234567890abcdef12345678';
|
|
5
|
-
it('fetches initial nonce from chain', async () => {
|
|
6
|
-
const manager = new EthereumNonceManager(async () => 5);
|
|
7
|
-
const nonce = await manager.getNext(address);
|
|
8
|
-
expect(nonce).toBe(5);
|
|
9
|
-
});
|
|
10
|
-
it('increments nonce on subsequent calls', async () => {
|
|
11
|
-
const manager = new EthereumNonceManager(async () => 0);
|
|
12
|
-
const n1 = await manager.getNext(address);
|
|
13
|
-
const n2 = await manager.getNext(address);
|
|
14
|
-
const n3 = await manager.getNext(address);
|
|
15
|
-
expect(n1).toBe(0);
|
|
16
|
-
expect(n2).toBe(1);
|
|
17
|
-
expect(n3).toBe(2);
|
|
18
|
-
});
|
|
19
|
-
it('normalizes address to lowercase', async () => {
|
|
20
|
-
const manager = new EthereumNonceManager(async () => 10);
|
|
21
|
-
const upper = '0xABCDEF1234567890ABCDEF1234567890ABCDEF12';
|
|
22
|
-
const n1 = await manager.getNext(upper);
|
|
23
|
-
const n2 = await manager.getNext(upper.toLowerCase());
|
|
24
|
-
expect(n1).toBe(10);
|
|
25
|
-
expect(n2).toBe(11);
|
|
26
|
-
});
|
|
27
|
-
it('re-fetches from chain after release', async () => {
|
|
28
|
-
// Chain says nonce 0 (nothing mined yet)
|
|
29
|
-
const manager = new EthereumNonceManager(async () => 0);
|
|
30
|
-
const n1 = await manager.getNext(address);
|
|
31
|
-
expect(n1).toBe(0);
|
|
32
|
-
// Release nonce 0 (tx failed) — clears cache, re-fetch from chain
|
|
33
|
-
await manager.release(address, 0);
|
|
34
|
-
// Chain still says 0 → re-issue 0
|
|
35
|
-
const n2 = await manager.getNext(address);
|
|
36
|
-
expect(n2).toBe(0);
|
|
37
|
-
});
|
|
38
|
-
it('skips in-flight nonces after release and re-fetch', async () => {
|
|
39
|
-
// Chain says 0. Issue 0, 1, 2 → reserved={0,1,2}
|
|
40
|
-
const manager = new EthereumNonceManager(async () => 0);
|
|
41
|
-
const n0 = await manager.getNext(address);
|
|
42
|
-
const n1 = await manager.getNext(address);
|
|
43
|
-
const n2 = await manager.getNext(address);
|
|
44
|
-
expect(n0).toBe(0);
|
|
45
|
-
expect(n1).toBe(1);
|
|
46
|
-
expect(n2).toBe(2);
|
|
47
|
-
// Release nonce 1 (tx failed) → reserved={0,2}, cache cleared
|
|
48
|
-
await manager.release(address, 1);
|
|
49
|
-
// Re-fetch from chain (still 0), skip 0 (reserved), land on 1
|
|
50
|
-
const reused = await manager.getNext(address);
|
|
51
|
-
expect(reused).toBe(1);
|
|
52
|
-
// Now reserved={0,1,2}, counter=2, skip 2 (reserved) → 3
|
|
53
|
-
const next = await manager.getNext(address);
|
|
54
|
-
expect(next).toBe(3);
|
|
55
|
-
});
|
|
56
|
-
it('handles multiple releases — fills gaps from chain', async () => {
|
|
57
|
-
// Chain says 0. Issue 0,1,2,3 → reserved={0,1,2,3}
|
|
58
|
-
const manager = new EthereumNonceManager(async () => 0);
|
|
59
|
-
await manager.getNext(address); // 0
|
|
60
|
-
await manager.getNext(address); // 1
|
|
61
|
-
await manager.getNext(address); // 2
|
|
62
|
-
await manager.getNext(address); // 3
|
|
63
|
-
// Release 2 then 0 → reserved={1,3}
|
|
64
|
-
await manager.release(address, 2);
|
|
65
|
-
await manager.release(address, 0);
|
|
66
|
-
// Re-fetch from chain (0), not reserved → issue 0
|
|
67
|
-
expect(await manager.getNext(address)).toBe(0);
|
|
68
|
-
// counter=1, skip 1 (reserved), try 2 → issue 2
|
|
69
|
-
expect(await manager.getNext(address)).toBe(2);
|
|
70
|
-
// counter=3, skip 3 (reserved), try 4 → issue 4
|
|
71
|
-
expect(await manager.getNext(address)).toBe(4);
|
|
72
|
-
});
|
|
73
|
-
it('re-fetches updated chain nonce after txs mine', async () => {
|
|
74
|
-
// Simulate: chain nonce advances as txs mine
|
|
75
|
-
let chainNonce = 0;
|
|
76
|
-
const manager = new EthereumNonceManager(async () => chainNonce);
|
|
77
|
-
// Issue 0, 1, 2
|
|
78
|
-
expect(await manager.getNext(address)).toBe(0);
|
|
79
|
-
expect(await manager.getNext(address)).toBe(1);
|
|
80
|
-
expect(await manager.getNext(address)).toBe(2);
|
|
81
|
-
// Tx 0 and 1 mine → chain advances to 2
|
|
82
|
-
chainNonce = 2;
|
|
83
|
-
// Release nonce 2 (tx failed) → cache cleared
|
|
84
|
-
await manager.release(address, 2);
|
|
85
|
-
// Re-fetch from chain (now 2), not reserved → issue 2
|
|
86
|
-
expect(await manager.getNext(address)).toBe(2);
|
|
87
|
-
});
|
|
88
|
-
it('handles concurrent nonce allocation without conflicts', async () => {
|
|
89
|
-
const manager = new EthereumNonceManager(async () => 0);
|
|
90
|
-
const nonces = await Promise.all([
|
|
91
|
-
manager.getNext(address),
|
|
92
|
-
manager.getNext(address),
|
|
93
|
-
manager.getNext(address),
|
|
94
|
-
]);
|
|
95
|
-
const unique = new Set(nonces);
|
|
96
|
-
expect(unique.size).toBe(3);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
//# sourceMappingURL=ethereum.nonce.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ethereum.nonce.test.js","sourceRoot":"","sources":["../../src/ethereum/ethereum.nonce.test.ts"],"names":[],"mappings":"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"}
|