Skip to content

Commit 81b313d

Browse files
authored
ALL-2878 - Add Beacon methods to eth (#999)
1 parent eb79ee3 commit 81b313d

19 files changed

+453
-14
lines changed

β€Ž.github/workflows/build.ymlβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ on:
66
env:
77
SDK_ERROR_MESSAGES_VERSION: "master"
88
V4_API_KEY_MAINNET: ${{ secrets.V4_API_KEY_MAINNET }}
9+
V4_API_KEY_TESTNET: ${{ secrets.V4_API_KEY_TESTNET }}
910
V3_API_KEY_MAINNET: ${{ secrets.V3_API_KEY_MAINNET }}
1011
V3_API_KEY_TESTNET: ${{ secrets.V3_API_KEY_TESTNET }}
1112
NON_TATUM_RPC_ETH_URL: ${{ secrets.NON_TATUM_RPC_ETH_URL }}

β€Ž.github/workflows/release-pr.yamlβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ on:
77

88
env:
99
V4_API_KEY_MAINNET: ${{ secrets.V4_API_KEY_MAINNET }}
10+
V4_API_KEY_TESTNET: ${{ secrets.V4_API_KEY_TESTNET }}
1011
V3_API_KEY_MAINNET: ${{ secrets.V3_API_KEY_MAINNET }}
1112
V3_API_KEY_TESTNET: ${{ secrets.V3_API_KEY_TESTNET }}
1213
NON_TATUM_RPC_ETH_URL: ${{ secrets.NON_TATUM_RPC_ETH_URL }}

β€ŽCHANGELOG.mdβ€Ž

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## [4.1.16] - 2023.10.24
2+
### Added
3+
- Added Beacon chain v1 support for the Ethereum
4+
15
## [4.1.15] - 2023.10.24
26
### Added
37
- Added estimatefee rpc method to the Bitcoin Cash network

β€Žpackage.jsonβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@tatumio/tatum",
3-
"version": "4.1.15",
3+
"version": "4.1.16",
44
"description": "Tatum JS SDK",
55
"author": "Tatum",
66
"repository": "https://github.com/tatumio/tatum-js",

β€Žsrc/dto/GetI.tsβ€Ž

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export interface GetI {
2+
path: string
3+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
4+
basePath?: string
5+
}

β€Žsrc/dto/Network.tsβ€Ž

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,12 @@ export const EVM_ARCHIVE_NON_ARCHIVE_LOAD_BALANCER_NETWORKS = [
256256
Network.CHILIZ,
257257
]
258258

259+
export const EVM_ARCHIVE_NON_ARCHIVE_BEACON_LOAD_BALANCER_NETWORKS = [
260+
Network.ETHEREUM,
261+
Network.ETHEREUM_SEPOLIA,
262+
Network.ETHEREUM_HOLESKY,
263+
]
264+
259265
export const TRON_NETWORKS = [Network.TRON, Network.TRON_SHASTA]
260266
export const EOS_NETWORKS = [Network.EOS, Network.EOS_TESTNET]
261267

@@ -291,6 +297,9 @@ export const isEvmLoadBalancerNetwork = (network: Network) => EVM_LOAD_BALANCER_
291297
export const isEvmArchiveNonArchiveLoadBalancerNetwork = (network: Network) =>
292298
EVM_ARCHIVE_NON_ARCHIVE_LOAD_BALANCER_NETWORKS.includes(network)
293299

300+
export const isEvmArchiveNonArchiveBeaconLoadBalancerNetwork = (network: Network) =>
301+
EVM_ARCHIVE_NON_ARCHIVE_BEACON_LOAD_BALANCER_NETWORKS.includes(network)
302+
294303
export const isTronLoadBalancerNetwork = (network: Network) => TRON_LOAD_BALANCER_NETWORKS.includes(network)
295304

296305
export const isEosLoadBalancerNetwork = (network: Network) => EOS_LOAD_BALANCER_NETWORKS.includes(network)

β€Žsrc/dto/rpc/EvmBasedRpcInterface.tsβ€Ž

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,82 @@ export interface EvmBasedRpcInterface {
216216

217217
txPoolInspect(): Promise<JsonRpcResponse<any>>
218218
}
219+
220+
export interface EvmBeaconResponse<T> {
221+
data: T
222+
execution_optimistic?: boolean
223+
finalized?: boolean
224+
}
225+
226+
export type StateId = 'head' | 'genesis' | 'finalized' | 'justified' | string;
227+
export type BlockId = 'head' | 'genesis' | 'finalized' | string;
228+
229+
export interface BlockQuery {
230+
blockId: BlockId
231+
}
232+
233+
export interface StateCommitteesQuery {
234+
stateId: StateId
235+
epoch?: string;
236+
index?: string;
237+
slot?: string;
238+
}
239+
240+
export interface StateQuery {
241+
stateId: StateId
242+
}
243+
244+
export interface StateSyncCommitteesQuery extends StateQuery {
245+
epoch?: string;
246+
}
247+
248+
export interface ValidatorBalancesQuery extends StateQuery {
249+
id?: string[]; // Array of either hex encoded public key or validator index
250+
}
251+
252+
export type ValidatorStatus =
253+
| 'pending_initialized'
254+
| 'pending_queued'
255+
| 'active_ongoing'
256+
| 'active_exiting'
257+
| 'active_slashed'
258+
| 'exited_unslashed'
259+
| 'exited_slashed'
260+
| 'withdrawal_possible'
261+
| 'withdrawal_done'
262+
| 'active'
263+
| 'pending'
264+
| 'exited'
265+
| 'withdrawal';
266+
267+
export interface ValidatorsQuery extends StateQuery {
268+
id?: string[]; // Array of either hex encoded public key or validator index
269+
status?: ValidatorStatus[];
270+
}
271+
272+
export interface ValidatorQuery extends StateQuery {
273+
validatorId: string; // Either a hex encoded public key or validator index
274+
}
275+
276+
277+
export interface EvmBeaconV1Interface {
278+
getGenesis(): Promise<EvmBeaconResponse<any>>
279+
getBlockHeaders(query?: { slot?: string, parentRoot?: string }): Promise<EvmBeaconResponse<any>>
280+
getBlockHeader(query:BlockQuery): Promise<EvmBeaconResponse<any>>
281+
getBlockRoot(query: BlockQuery): Promise<EvmBeaconResponse<any>>
282+
getBlockAttestations(query: BlockQuery): Promise<EvmBeaconResponse<any>>
283+
getStateCommittees(query: StateCommitteesQuery): Promise<EvmBeaconResponse<any>>
284+
getStateFinalityCheckpoints(query: StateQuery): Promise<EvmBeaconResponse<any>>
285+
getStateFork(query: StateQuery): Promise<EvmBeaconResponse<any>>
286+
getStateRoot(query: StateQuery): Promise<EvmBeaconResponse<any>>
287+
getStateSyncCommittees(query: StateSyncCommitteesQuery): Promise<EvmBeaconResponse<any>>
288+
getStateValidatorBalances(query: ValidatorBalancesQuery): Promise<EvmBeaconResponse<any>>
289+
getStateValidators(query: ValidatorsQuery): Promise<EvmBeaconResponse<any>>
290+
getStateValidator(query: ValidatorQuery): Promise<EvmBeaconResponse<any>>
291+
}
292+
293+
export interface EvmBasedBeaconRpcSuite extends EvmBasedRpcInterface, AbstractRpcInterface {
294+
beacon: {
295+
v1: EvmBeaconV1Interface
296+
}
297+
}

β€Žsrc/e2e/ipfs.spec.tsβ€Ž

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { EvmE2eUtils } from './rpc/evm/evm.e2e.utils';
2+
import { Network } from '../dto';
3+
import fs from 'fs';
4+
5+
describe.skip('IPFS', () => {
6+
it('should upload file to IPFS', async () => {
7+
const tatum = await EvmE2eUtils.initTatum(Network.ETHEREUM, process.env.V4_API_KEY_MAINNET);
8+
const fileData = fs.readFileSync('./test.txt'); // Adjust the path to your file
9+
const response = await tatum.ipfs.uploadFile({ file: fileData });
10+
expect(response.status).toBe('SUCCESS');
11+
expect(response.data.ipfsHash).toBeDefined();
12+
});
13+
});
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { Network } from '../../../../dto'
2+
import { EvmE2eUtils } from '../evm.e2e.utils'
3+
import { Ethereum } from '../../../../service'
4+
5+
describe('Beacon', () => {
6+
describe('v1', () => {
7+
const networks = [
8+
Network.ETHEREUM_HOLESKY,
9+
Network.ETHEREUM_SEPOLIA,
10+
Network.ETHEREUM
11+
];
12+
13+
describe.each(networks)('%s', (network) => {
14+
it('should get genesis', async () => {
15+
const tatum = await EvmE2eUtils.initTatum<Ethereum>(network, process.env.V4_API_KEY_TESTNET);
16+
const { data } = await tatum.rpc.beacon.v1.getGenesis();
17+
await tatum.destroy();
18+
expect(data).toBeDefined();
19+
});
20+
21+
it('should get state root', async () => {
22+
const tatum = await EvmE2eUtils.initTatum<Ethereum>(network, process.env.V4_API_KEY_TESTNET);
23+
const { data } = await tatum.rpc.beacon.v1.getStateRoot({ stateId: 'head' });
24+
await tatum.destroy();
25+
expect(data).toBeDefined();
26+
});
27+
28+
it('should get block headers', async () => {
29+
const tatum = await EvmE2eUtils.initTatum<Ethereum>(network, process.env.V4_API_KEY_TESTNET);
30+
const { data } = await tatum.rpc.beacon.v1.getBlockHeaders({ slot: '1'});
31+
await tatum.destroy();
32+
expect(data).toBeDefined();
33+
});
34+
35+
it('should get block root', async () => {
36+
const tatum = await EvmE2eUtils.initTatum<Ethereum>(network, process.env.V4_API_KEY_TESTNET);
37+
const { data } = await tatum.rpc.beacon.v1.getBlockRoot({ blockId: 'head' });
38+
await tatum.destroy();
39+
expect(data).toBeDefined();
40+
});
41+
42+
it('should get state committees', async () => {
43+
const tatum = await EvmE2eUtils.initTatum<Ethereum>(network, process.env.V4_API_KEY_TESTNET);
44+
const { data } = await tatum.rpc.beacon.v1.getStateCommittees({ stateId: 'head' });
45+
await tatum.destroy();
46+
expect(data).toBeDefined();
47+
});
48+
49+
it('should get state finality checkpoints', async () => {
50+
const tatum = await EvmE2eUtils.initTatum<Ethereum>(network, process.env.V4_API_KEY_TESTNET);
51+
const { data } = await tatum.rpc.beacon.v1.getStateFinalityCheckpoints({ stateId: 'head' });
52+
await tatum.destroy();
53+
expect(data).toBeDefined();
54+
});
55+
56+
it('should get state fork', async () => {
57+
const tatum = await EvmE2eUtils.initTatum<Ethereum>(network, process.env.V4_API_KEY_TESTNET);
58+
const { data } = await tatum.rpc.beacon.v1.getStateFork({ stateId: 'head' });
59+
await tatum.destroy();
60+
expect(data).toBeDefined();
61+
});
62+
63+
it('should get state sync committees', async () => {
64+
const tatum = await EvmE2eUtils.initTatum<Ethereum>(network, process.env.V4_API_KEY_TESTNET);
65+
const { data } = await tatum.rpc.beacon.v1.getStateSyncCommittees({ stateId: 'head' });
66+
await tatum.destroy();
67+
expect(data).toBeDefined();
68+
});
69+
})
70+
})
71+
})

β€Žsrc/e2e/rpc/evm/tatum.rpc.ethereum.spec.tsβ€Ž renamed to β€Žsrc/e2e/rpc/evm/eth/tatum.rpc.ethereum.spec.tsβ€Ž

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import process from 'process'
2-
import { BaseEvm, Network, RpcNodeType, TatumSDK } from '../../../service'
3-
import { EvmE2eUtils } from './evm.e2e.utils'
2+
import { BaseEvm, Network, RpcNodeType, TatumSDK } from '../../../../service'
3+
import { EvmE2eUtils } from '../evm.e2e.utils'
44

55
describe('Ethereum', () => {
66
it('should get token total supply', async () => {

0 commit comments

Comments
Β (0)