xcm-lib-zkverify
Version:
XCM asset teleportation and remote EVM calls for ZKVerify
200 lines (148 loc) • 5.75 kB
Markdown
# zkVerify XCM Library
A production-ready TypeScript library for cross-chain interactions between zkVerify Relay Chain and EVM parachains, featuring asset teleportation, remote EVM contract calls, and comprehensive testing infrastructure.
## Features
- 🔄 **Asset Teleportation**: Bidirectional asset transfer between Relay Chain and EVM parachains
- 🚀 **Remote EVM Calls**: Execute smart contract functions on EVM parachains from Relay Chain via XCM
- 🎯 **ABI Support**: Execute contract calls using either source code compilation or direct ABI
- 🌐 **Local Networks**: Automated setup of local zkVerify networks for development and testing
## Installation
```bash
npm install
```
## Local Development Setup
### Start Local Networks
For testing and development, you can run local zkVerify networks:
```bash
# First time setup (clones repos, builds relay chain, starts networks)
./scripts/local-networks.sh setup
# Start existing networks (after initial setup)
./scripts/local-networks.sh start
# Clean up all local network files
./scripts/local-networks.sh cleanup
```
**Network Endpoints:**
- **Relay Chain**: `ws://127.0.0.1:8855`
- **Parachain**: `ws://127.0.0.1:8833`
## Configuration
The library uses a **unified XcmConfig interface** for all operations. You only provide the fields needed for your specific use case:
```typescript
interface XcmConfig {
// Endpoints - provide based on operation needs
relayWsEndpoint?: string;
evmParachainWsEndpoint?: string;
evmParachainId?: number;
// Private keys - provide based on operation type
relayPrivateKey?: string;
evmParachainPrivateKey?: string;
// Optional XCM versions (with defaults)
xcmRelayVersion?: string; // defaults to V5
xcmParachainVersion?: string; // defaults to V2
}
```
### Operation Requirements
- **Relay→Parachain**: Requires `relayPrivateKey` + `relayWsEndpoint` + `evmParachainId`
- **Parachain→Relay**: Requires `evmParachainPrivateKey` + `evmParachainWsEndpoint`
- **Remote EVM Calls**: Requires both endpoints + `relayPrivateKey` + `evmParachainId`
## Usage Examples
### 1. Asset Teleportation
#### Relay to Parachain
```typescript
import { XcmTeleportService } from './src/services/xcm-teleport';
const config = {
relayWsEndpoint: 'ws://127.0.0.1:8855',
evmParachainWsEndpoint: 'ws://127.0.0.1:8833', // For balance queries
evmParachainId: 1,
relayPrivateKey: 'e5be9a5092b81bca64be81d212e7f2f9eba183bb7a90954f7b76361f6edb5c0a'
};
const service = new XcmTeleportService(config);
await service.initialize();
const result = await service.teleportToEvmParachain({
amount: '1000000000000',
destinationAddress: '0x1234567890123456789012345678901234567890'
});
await service.disconnect();
```
#### Parachain to Relay
```typescript
const config = {
relayWsEndpoint: 'ws://127.0.0.1:8855', // For balance queries
evmParachainWsEndpoint: 'ws://127.0.0.1:8833',
evmParachainPrivateKey: 'cea930a090279ff8f832e550e45fd6f7c3f88f729dcad79e2a9dcbc0514111df'
};
const service = new XcmTeleportService(config);
await service.initialize();
const result = await service.teleportFromEvmParachain({
amount: '1000000000000',
destinationAddress: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY' // Substrate address
});
await service.disconnect();
```
### 2. Remote EVM Calls
Execute smart contract functions on EVM parachains from the Relay Chain via XCM:
#### Using Contract Source Code
```typescript
import { ExecuteRemoteEvmCallService } from './src/services/execute-remote-evm-call';
const config = {
relayWsEndpoint: 'ws://127.0.0.1:8855',
evmParachainWsEndpoint: 'ws://127.0.0.1:8833',
evmParachainId: 1,
relayPrivateKey: 'e5be9a5092b81bca64be81d212e7f2f9eba183bb7a90954f7b76361f6edb5c0a'
};
const service = new ExecuteRemoteEvmCallService(config);
await service.initialize();
const result = await service.executeRemoteEvmCall(
{
contractAddress: '0x1234567890123456789012345678901234567890',
functionName: 'doWork',
args: [42],
gasLimit: '100000',
value: '0'
},
'./contract/test_contract.sol' // Contract source path
);
await service.disconnect();
```
#### Using Direct ABI (Faster)
```typescript
const result = await service.executeRemoteEvmCall(
{
contractAddress: '0x1234567890123456789012345678901234567890',
functionName: 'doWork',
args: [42]
},
undefined, // No contract path
'./contract/test_contract_abi.json' // Direct ABI path (takes precedence)
);
```
## Environment Configuration
The library provides example environment files for different use cases. Copy the appropriate example file and update the values as needed:
```bash
# For relay to parachain transfers
cp .env.example.relay-to-parachain .env.relay-to-parachain
# For parachain to relay transfers
cp .env.example.parachain-to-relay .env.parachain-to-relay
# For remote EVM calls
cp .env.example.execute-remote-evm-call .env.execute-remote-evm-call
```
Each example file contains all the necessary configuration options with comments explaining their purpose.
## Testing
### Prerequisites
Start local networks before running tests:
```bash
./scripts/local-networks.sh setup
```
### Run Tests
```bash
# Run all tests
npm test
# Run specific tests
npm test -- relay-to-evm.test.ts
npm test -- evm-to-relay.test.ts
npm test -- execute-remote-evm-call.test.ts
# Build project
npm run build
```
## Requirements
- **Node.js** 18+
- **Rust & Cargo** (for building local relay chain)
- **Git** (for cloning repositories)