@flarestudio/fcc-workbench 1.0.1 → 1.0.3

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/index.js CHANGED
@@ -1,18 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from 'commander';
3
3
  import chalk from 'chalk';
4
- import { select, input } from '@inquirer/prompts';
4
+ import { select, input, confirm } from '@inquirer/prompts';
5
+ import * as config from './modules/config.js';
5
6
  import * as scaffold from './modules/scaffold.js';
6
7
  import * as crypto from './modules/crypto.js';
7
- import * as attestation from './modules/attestation.js';
8
+ import * as contract from './modules/contract.js';
9
+ import * as registry from './modules/registry.js';
10
+ import * as docker from './modules/docker.js';
11
+ import * as tee from './modules/tee.js';
8
12
  const program = new Command();
9
13
  program
10
14
  .name('flare-fcc')
11
15
  .description('Tactical Workbench for Flare Confidential Compute (FCC)')
12
- .version('1.0.0');
16
+ .version('1.0.3');
17
+ // --- 1. SCAFFOLDING & SETUP ---
13
18
  program
14
19
  .command('init')
15
- .description('Scaffold a new Sovereign AI Agent (TEE Extension)')
20
+ .description('Step 0: Scaffold a new Sovereign AI Agent')
16
21
  .action(async () => {
17
22
  console.log(chalk.magenta.bold('\nšŸ‘» FLARE GHOST: AGENT SEEDER\n'));
18
23
  const name = await input({ message: 'Agent Name:', default: 'my-fcc-agent' });
@@ -20,83 +25,141 @@ program
20
25
  message: 'Choose your Agent Brain (Language):',
21
26
  choices: [
22
27
  { name: 'TypeScript (Node.js)', value: 'typescript' },
23
- { name: 'Python', value: 'python' },
24
- { name: 'Go', value: 'go' }
25
28
  ]
26
29
  });
27
30
  await scaffold.createAgent(name, language);
28
31
  });
29
32
  program
30
- .command('encrypt')
31
- .description('The ECIES Forge: Encrypt secrets for a TEE machine')
33
+ .command('setup')
34
+ .description('Step 0.5: Setup environment and proxy configuration')
32
35
  .action(async () => {
33
- console.log(chalk.blue.bold('\nāš’ļø THE ECIES FORGE: SECRET ENCRYPTION\n'));
34
- const secret = await input({ message: 'Secret (e.g. Private Key or API Key):' });
35
- const teePubKey = await input({ message: 'TEE Machine Public Key (Hex):' });
36
- try {
37
- const payload = await crypto.encryptForTee(secret, teePubKey);
38
- console.log(chalk.green('\nāœ” Encryption Successful!'));
39
- console.log(chalk.white('\nPayload to send to InstructionSender (Hex):'));
40
- console.log(chalk.bold(payload));
41
- }
42
- catch (e) {
43
- console.error(chalk.red('\n✘ Encryption Failed:'), e.message);
36
+ console.log(chalk.cyan.bold('\nāš™ļø ENVIRONMENT CONFIGURATION\n'));
37
+ const pkey = await input({ message: 'Your EVM Private Key (Hex):' });
38
+ config.writeEnv({ PRIVATE_KEY: pkey, INITIAL_OWNER: contract.getAddressFromKey(pkey) });
39
+ console.log(chalk.gray('\nFlare Indexer Database Credentials (for ext-proxy):'));
40
+ const dbHost = await input({ message: 'DB Host:', default: 'indexer-db.test.flare.network' });
41
+ const dbPort = await input({ message: 'DB Port:', default: '3306' });
42
+ const dbUser = await input({ message: 'DB User:' });
43
+ const dbPass = await input({ message: 'DB Password:' });
44
+ config.writeProxyToml({ dbHost, dbPort, dbUser, dbPass });
45
+ console.log(chalk.green('\nāœ” Setup complete!'));
46
+ });
47
+ // --- 2. DEPLOYMENT & REGISTRATION ---
48
+ program
49
+ .command('deploy')
50
+ .description('Step 1: Deploy InstructionSender to Coston2')
51
+ .action(async () => {
52
+ console.log(chalk.blue.bold('\nšŸš€ DEPLOY INSTRUCTION SENDER\n'));
53
+ const env = config.loadEnv();
54
+ if (!env.PRIVATE_KEY)
55
+ throw new Error('Run "flare-fcc setup" first.');
56
+ const address = await contract.deployInstructionSender(env.PRIVATE_KEY);
57
+ config.writeEnv({ INSTRUCTION_SENDER: address });
58
+ console.log(chalk.green('\nāœ” Contract Deployed:'), address);
59
+ });
60
+ program
61
+ .command('register-ext')
62
+ .description('Step 2: Register extension on-chain')
63
+ .action(async () => {
64
+ console.log(chalk.blue.bold('\nšŸ“ REGISTER EXTENSION\n'));
65
+ const env = config.loadEnv();
66
+ if (!env.PRIVATE_KEY || !env.INSTRUCTION_SENDER || !env.INITIAL_OWNER) {
67
+ throw new Error('Missing environment vars. Run setup and deploy first.');
44
68
  }
69
+ const id = await registry.registerExtension(env.PRIVATE_KEY, env.INSTRUCTION_SENDER, env.INITIAL_OWNER);
70
+ config.writeEnv({ EXTENSION_ID: id });
71
+ console.log(chalk.green('\nāœ” Extension Registered! ID:'), id);
45
72
  });
73
+ // --- 3. DOCKER & TEE MANAGEMENT ---
46
74
  program
47
- .command('verify')
48
- .description('Hardware integrity check (Remote Attestation)')
75
+ .command('start')
76
+ .description('Step 3: Start the local Docker stack')
49
77
  .action(async () => {
50
- console.log(chalk.cyan.bold('\nšŸ›”ļø HARDWARE INTEGRITY VERIFIER\n'));
51
- const reportPath = await input({ message: 'Path to Attestation Report (.json):' });
52
- console.log(chalk.gray('ā³ Validating hardware quote against root certificates...'));
53
- const isValid = await attestation.verifyReport(reportPath);
54
- if (isValid) {
55
- console.log(chalk.green.bold('\nāœ” HARDWARE VERIFIED: GENUINE SECURE ENCLAVE'));
78
+ console.log(chalk.yellow.bold('\n🐳 STARTING TEE STACK\n'));
79
+ await docker.runDockerCompose(['up', '-d']);
80
+ console.log(chalk.green('\nāœ” Stack started in background.'));
81
+ console.log(chalk.gray(' Use "docker compose logs -f" to view logs.'));
82
+ });
83
+ program
84
+ .command('tunnel')
85
+ .description('Step 4: Launch Cloudflared tunnel for the TEE')
86
+ .action(async () => {
87
+ console.log(chalk.cyan.bold('\nšŸš‡ CLOUDFLARED TUNNEL\n'));
88
+ tee.startTunnel(6676, (url) => {
89
+ console.log(chalk.green(`\nāœ” Tunnel active at: ${url}`));
90
+ config.writeEnv({ TUNNEL_URL: url });
91
+ console.log(chalk.gray('Press Ctrl+C to close.'));
92
+ }, (err) => console.error(chalk.red('\n✘ Error:'), err));
93
+ });
94
+ program
95
+ .command('allow-tee')
96
+ .description('Step 5: Allow TEE version on-chain')
97
+ .action(async () => {
98
+ console.log(chalk.blue.bold('\nāœ… ALLOW TEE VERSION\n'));
99
+ const env = config.loadEnv();
100
+ if (!env.PRIVATE_KEY || !env.EXTENSION_ID)
101
+ throw new Error('Missing environment vars.');
102
+ const info = await docker.fetchProxyInfo();
103
+ await registry.allowTeeVersion(env.PRIVATE_KEY, env.EXTENSION_ID, info.platform, info.codeHash);
104
+ console.log(chalk.green('\nāœ” TEE Version Allowed.'));
105
+ });
106
+ program
107
+ .command('register-tee')
108
+ .description('Step 6: Register TEE machine on-chain (local mode)')
109
+ .action(async () => {
110
+ console.log(chalk.blue.bold('\nšŸ’» REGISTER TEE MACHINE\n'));
111
+ const env = config.loadEnv();
112
+ if (!env.PRIVATE_KEY || !env.EXTENSION_ID || !env.TUNNEL_URL) {
113
+ throw new Error('Missing environment vars or tunnel URL.');
56
114
  }
57
- else {
58
- console.log(chalk.red.bold('\n✘ VERIFICATION FAILED: UNTRUSTED HARDWARE'));
115
+ const info = await docker.fetchProxyInfo();
116
+ const isLocal = await confirm({ message: 'Register as local (non-SGX) machine?', default: true });
117
+ const id = await registry.registerTeeNode(env.PRIVATE_KEY, env.EXTENSION_ID, env.TUNNEL_URL, info.platform, info.codeHash, info.publicKey, isLocal);
118
+ console.log(chalk.green('\nāœ” TEE Machine Registered! ID:'), id);
119
+ });
120
+ program
121
+ .command('test-e2e')
122
+ .description('Step 7: Run end-to-end integration test')
123
+ .action(async () => {
124
+ console.log(chalk.magenta.bold('\n🧪 E2E INTEGRATION TEST\n'));
125
+ const env = config.loadEnv();
126
+ if (!env.PRIVATE_KEY || !env.EXTENSION_ID || !env.INSTRUCTION_SENDER) {
127
+ throw new Error('Missing environment vars.');
59
128
  }
129
+ await tee.runE2eTest('http://localhost:6676', env.INSTRUCTION_SENDER, env.EXTENSION_ID, env.PRIVATE_KEY);
60
130
  });
131
+ // --- 4. UTILITIES ---
61
132
  program
62
- .command('keygen')
63
- .description('Generate a TEE key pair (simulates what SGX hardware generates on startup)')
133
+ .command('encrypt')
134
+ .description('Utility: ECIES-encrypt a payload for a TEE machine')
64
135
  .action(async () => {
65
- console.log(chalk.yellow.bold('\nšŸ”‘ TEE KEY PAIR GENERATOR\n'));
66
- console.log(chalk.gray('In production: this key pair is generated INSIDE Intel SGX hardware.'));
67
- console.log(chalk.gray('For testing: use these keys to simulate the TEE machine.\n'));
68
- const { generateTeeKeyPair } = await import('./modules/crypto.js');
69
- const { privateKey, publicKey } = generateTeeKeyPair();
70
- console.log(chalk.white('Private Key (keep secret — this stays in the TEE):'));
71
- console.log(chalk.red.bold(' ' + privateKey));
72
- console.log(chalk.white('\nPublic Key (share this — paste when running "encrypt"):'));
73
- console.log(chalk.green.bold(' ' + publicKey));
74
- console.log(chalk.gray('\nNext step: run "node dist/index.js encrypt" and paste the Public Key above.'));
136
+ console.log(chalk.blue.bold('\nāš’ļø THE ECIES FORGE: SECRET ENCRYPTION\n'));
137
+ const secret = await input({ message: 'Secret (e.g. Private Key):' });
138
+ const teePubKey = await input({ message: 'TEE Machine Public Key (Hex):' });
139
+ const payload = await crypto.encryptForTee(secret, teePubKey);
140
+ console.log(chalk.green('\nāœ” Encryption Successful!'));
141
+ console.log(chalk.white('\nPayload:'), chalk.bold(payload));
75
142
  });
76
143
  program
77
144
  .command('send')
78
- .description('Ghost Envoy: Send an encrypted instruction to the blockchain')
145
+ .description('Utility: Send arbitrary encrypted instruction on-chain')
79
146
  .action(async () => {
80
147
  console.log(chalk.cyan.bold('\nšŸš€ GHOST ENVOY: ON-CHAIN RELAY\n'));
81
- const contract = await input({ message: 'InstructionSender Contract Address (Hex):' });
82
- const id = await input({ message: 'Instruction ID (32-byte Hex):', default: '0x' + '0'.repeat(64) });
83
- const payload = await input({ message: 'Encrypted Payload (from "encrypt" command):' });
84
- const pkey = await input({ message: 'Your Wallet Private Key (Hex):' });
85
- try {
86
- const { sendInstruction } = await import('./modules/relay.js');
87
- const txHash = await sendInstruction(contract, id, payload, pkey);
88
- console.log(chalk.green('\nāœ” Instruction Broadcast Successfully!'));
89
- console.log(chalk.white('Transaction Hash:'), chalk.bold.yellow(txHash));
90
- console.log(chalk.gray(`\nView on Explorer: https://coston2-explorer.flare.network/tx/${txHash}`));
91
- }
92
- catch (e) {
93
- console.error(chalk.red('\n✘ Relay Failed:'), e.message);
94
- }
148
+ const { sendInstruction } = await import('./modules/relay.js');
149
+ const env = config.loadEnv();
150
+ const contractAddr = await input({ message: 'Contract Address (Hex):', default: env.INSTRUCTION_SENDER });
151
+ const payload = await input({ message: 'Encrypted Payload (Long Hex):' });
152
+ const pkey = await input({ message: 'Your Wallet Private Key (Hex):', default: env.PRIVATE_KEY });
153
+ // Create random 32-byte ID
154
+ const randomHex = Array.from({ length: 64 }, () => Math.floor(Math.random() * 16).toString(16)).join('');
155
+ const id = '0x' + randomHex;
156
+ const txHash = await sendInstruction(contractAddr, id, payload, pkey);
157
+ console.log(chalk.green('\nāœ” Instruction Broadcast! Tx:'), txHash);
95
158
  });
96
159
  program.parse(process.argv);
97
160
  if (!process.argv.slice(2).length) {
98
161
  console.log(chalk.magenta.bold('\nšŸ”„ FLARE FCC WORKBENCH šŸ”„'));
99
- console.log(chalk.gray('Universal Infrastructure for Sovereign AI Agents\n'));
162
+ console.log(chalk.gray('Complete Sovereign TEE Deployment Toolkit\n'));
100
163
  program.help();
101
164
  }
102
165
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface FccEnv {
2
+ LANGUAGE?: string;
3
+ PRIVATE_KEY?: string;
4
+ INITIAL_OWNER?: string;
5
+ INSTRUCTION_SENDER?: string;
6
+ EXTENSION_ID?: string;
7
+ TUNNEL_URL?: string;
8
+ RPC_URL?: string;
9
+ }
10
+ /**
11
+ * Load existing .env key=value pairs from the current working directory.
12
+ */
13
+ export declare function loadEnv(): FccEnv;
14
+ /**
15
+ * Merge and write key=value pairs into the .env file.
16
+ */
17
+ export declare function writeEnv(updates: Partial<FccEnv>): void;
18
+ /**
19
+ * Write the extension_proxy.toml config file for the ext-proxy container.
20
+ */
21
+ export declare function writeProxyToml(opts: {
22
+ dbHost: string;
23
+ dbPort: string;
24
+ dbUser: string;
25
+ dbPass: string;
26
+ }): void;
27
+ export declare function envExists(): boolean;
28
+ export declare function proxyTomlExists(): boolean;
@@ -0,0 +1,56 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ const ENV_FILE = '.env';
4
+ const TOML_FILE = path.join('config', 'proxy', 'extension_proxy.toml');
5
+ /**
6
+ * Load existing .env key=value pairs from the current working directory.
7
+ */
8
+ export function loadEnv() {
9
+ const envPath = path.resolve(process.cwd(), ENV_FILE);
10
+ if (!fs.existsSync(envPath))
11
+ return {};
12
+ const lines = fs.readFileSync(envPath, 'utf8').split('\n');
13
+ const result = {};
14
+ for (const line of lines) {
15
+ const trimmed = line.trim();
16
+ if (!trimmed || trimmed.startsWith('#'))
17
+ continue;
18
+ const [key, ...rest] = trimmed.split('=');
19
+ result[key.trim()] = rest.join('=').trim().replace(/^["']|["']$/g, '');
20
+ }
21
+ return result;
22
+ }
23
+ /**
24
+ * Merge and write key=value pairs into the .env file.
25
+ */
26
+ export function writeEnv(updates) {
27
+ const envPath = path.resolve(process.cwd(), ENV_FILE);
28
+ const existing = loadEnv();
29
+ const merged = { ...existing, ...updates };
30
+ const lines = Object.entries(merged)
31
+ .filter(([, v]) => v !== undefined && v !== '')
32
+ .map(([k, v]) => `${k}="${v}"`);
33
+ fs.writeFileSync(envPath, lines.join('\n') + '\n', 'utf8');
34
+ }
35
+ /**
36
+ * Write the extension_proxy.toml config file for the ext-proxy container.
37
+ */
38
+ export function writeProxyToml(opts) {
39
+ const tomlPath = path.resolve(process.cwd(), TOML_FILE);
40
+ fs.ensureDirSync(path.dirname(tomlPath));
41
+ const content = `[db]
42
+ host = "${opts.dbHost}"
43
+ port = ${opts.dbPort}
44
+ database = "indexer"
45
+ username = "${opts.dbUser}"
46
+ password = "${opts.dbPass}"
47
+ `;
48
+ fs.writeFileSync(tomlPath, content, 'utf8');
49
+ }
50
+ export function envExists() {
51
+ return fs.existsSync(path.resolve(process.cwd(), ENV_FILE));
52
+ }
53
+ export function proxyTomlExists() {
54
+ return fs.existsSync(path.resolve(process.cwd(), TOML_FILE));
55
+ }
56
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/modules/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ declare const INSTRUCTION_SENDER_ABI: readonly [{
2
+ readonly type: "constructor";
3
+ readonly inputs: readonly [];
4
+ readonly stateMutability: "nonpayable";
5
+ }, {
6
+ readonly name: "InstructionSent";
7
+ readonly type: "event";
8
+ readonly inputs: readonly [{
9
+ readonly name: "instructionId";
10
+ readonly type: "bytes32";
11
+ readonly indexed: true;
12
+ }, {
13
+ readonly name: "payload";
14
+ readonly type: "bytes";
15
+ readonly indexed: false;
16
+ }];
17
+ }, {
18
+ readonly name: "sendInstruction";
19
+ readonly type: "function";
20
+ readonly stateMutability: "nonpayable";
21
+ readonly inputs: readonly [{
22
+ readonly name: "_id";
23
+ readonly type: "bytes32";
24
+ }, {
25
+ readonly name: "_payload";
26
+ readonly type: "bytes";
27
+ }];
28
+ readonly outputs: readonly [];
29
+ }, {
30
+ readonly name: "markProcessed";
31
+ readonly type: "function";
32
+ readonly stateMutability: "nonpayable";
33
+ readonly inputs: readonly [{
34
+ readonly name: "_id";
35
+ readonly type: "bytes32";
36
+ }];
37
+ readonly outputs: readonly [];
38
+ }, {
39
+ readonly name: "processedInstructions";
40
+ readonly type: "function";
41
+ readonly stateMutability: "view";
42
+ readonly inputs: readonly [{
43
+ readonly name: "";
44
+ readonly type: "bytes32";
45
+ }];
46
+ readonly outputs: readonly [{
47
+ readonly name: "";
48
+ readonly type: "bool";
49
+ }];
50
+ }, {
51
+ readonly name: "owner";
52
+ readonly type: "function";
53
+ readonly stateMutability: "view";
54
+ readonly inputs: readonly [];
55
+ readonly outputs: readonly [{
56
+ readonly name: "";
57
+ readonly type: "address";
58
+ }];
59
+ }];
60
+ /**
61
+ * Deploy a new InstructionSender contract to Coston2.
62
+ * Returns the deployed contract address.
63
+ */
64
+ export declare function deployInstructionSender(privateKey: string): Promise<string>;
65
+ /**
66
+ * Verify that a wallet private key maps to the given owner address.
67
+ */
68
+ export declare function verifyKeyMatchesOwner(privateKey: string, expectedOwner: string): Promise<boolean>;
69
+ /**
70
+ * Get the wallet address for a given private key.
71
+ */
72
+ export declare function getAddressFromKey(privateKey: string): string;
73
+ export { INSTRUCTION_SENDER_ABI };
@@ -0,0 +1,112 @@
1
+ import { createWalletClient, createPublicClient, http, } from 'viem';
2
+ import { privateKeyToAccount } from 'viem/accounts';
3
+ import { flareTestnet } from 'viem/chains';
4
+ const RPC = 'https://coston2-api.flare.network/ext/C/rpc';
5
+ // Pre-compiled bytecode for InstructionSender.sol
6
+ // Compiled with solc 0.8.20, optimization enabled
7
+ const INSTRUCTION_SENDER_BYTECODE = '0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506104b3806100606000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806369d89575146100515780638da5cb5b1461006d578063b06cb55614610097578063d6d2b6ba146100c7575b600080fd5b61006b60048036038101906100669190610268565b6100e3565b005b610075610165565b60405161008c91906102e4565b60405180910390f35b6100b160048036038101906100ac9190610268565b610189565b6040516100be91906102ff565b60405180910390f35b6100e160048036038101906100dc919061034b565b6101a9565b005b600160008083815260200190815260200160002060006101000a81548160ff021916908315150217905550807f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb82604051610140919061043a565b60405180910390a250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900460ff1681565b600160008083815260200190815260200160002060009054906101000a900460ff16156101eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101e290610498565b60405180910390fd5b7f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8282604051610220929190610498565b60405180910390a25050565b600080fd5b6000819050919050565b61024581610232565b811461025057600080fd5b50565b6000813590506102628161023c565b92915050565b60006020828403121561027e5761027d61022c565b5b600061028c84828501610253565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102c082610295565b9050919050565b6102d0816102b5565b82525050565b60006020820190506102eb60008301846102c7565b92915050565b60008115159050919050565b610306816102f1565b82525050565b600060208201905061032160008301846102fd565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261034c5761034b610327565b5b8235905067ffffffffffffffff81111561036957610368610327565b5b60208301915083600182028301111561038557610384610327565b5b9250929050565b6000806000604084860312156103a5576103a461022c565b5b60006103b386828701610253565b935050602084013567ffffffffffffffff8111156103d4576103d3610231565b5b6103e086828701610336565b92509250509250925092565b60006103f782610295565b9050919050565b610407816103ec565b82525050565b600082825260208201905092915050565b50505050565b600082825260208201905092915050565b600060208201905061044960008301846103fe565b92915050565b7f496e737472756374696f6e20616c726561647920706f00000000000000000000600082015250565b600061048560168361040d565b91506104908261044f565b602082019050919050565b600060208201905081810360008301526104b481610478565b9050919050565b';
8
+ const INSTRUCTION_SENDER_ABI = [
9
+ {
10
+ type: 'constructor',
11
+ inputs: [],
12
+ stateMutability: 'nonpayable',
13
+ },
14
+ {
15
+ name: 'InstructionSent',
16
+ type: 'event',
17
+ inputs: [
18
+ { name: 'instructionId', type: 'bytes32', indexed: true },
19
+ { name: 'payload', type: 'bytes', indexed: false },
20
+ ],
21
+ },
22
+ {
23
+ name: 'sendInstruction',
24
+ type: 'function',
25
+ stateMutability: 'nonpayable',
26
+ inputs: [
27
+ { name: '_id', type: 'bytes32' },
28
+ { name: '_payload', type: 'bytes' },
29
+ ],
30
+ outputs: [],
31
+ },
32
+ {
33
+ name: 'markProcessed',
34
+ type: 'function',
35
+ stateMutability: 'nonpayable',
36
+ inputs: [{ name: '_id', type: 'bytes32' }],
37
+ outputs: [],
38
+ },
39
+ {
40
+ name: 'processedInstructions',
41
+ type: 'function',
42
+ stateMutability: 'view',
43
+ inputs: [{ name: '', type: 'bytes32' }],
44
+ outputs: [{ name: '', type: 'bool' }],
45
+ },
46
+ {
47
+ name: 'owner',
48
+ type: 'function',
49
+ stateMutability: 'view',
50
+ inputs: [],
51
+ outputs: [{ name: '', type: 'address' }],
52
+ },
53
+ ];
54
+ function makeClients(privateKey) {
55
+ const clean = privateKey.trim().startsWith('0x')
56
+ ? privateKey.trim()
57
+ : `0x${privateKey.trim()}`;
58
+ const account = privateKeyToAccount(clean);
59
+ const walletClient = createWalletClient({
60
+ account,
61
+ chain: flareTestnet,
62
+ transport: http(RPC),
63
+ });
64
+ const publicClient = createPublicClient({
65
+ chain: flareTestnet,
66
+ transport: http(RPC),
67
+ });
68
+ return { account, walletClient, publicClient };
69
+ }
70
+ /**
71
+ * Deploy a new InstructionSender contract to Coston2.
72
+ * Returns the deployed contract address.
73
+ */
74
+ export async function deployInstructionSender(privateKey) {
75
+ const { account, walletClient, publicClient } = makeClients(privateKey);
76
+ console.log(`\nSigner: ${account.address}`);
77
+ console.log('Deploying InstructionSender to Coston2...');
78
+ const hash = await walletClient.deployContract({
79
+ abi: INSTRUCTION_SENDER_ABI,
80
+ bytecode: INSTRUCTION_SENDER_BYTECODE,
81
+ args: [],
82
+ account,
83
+ chain: flareTestnet,
84
+ });
85
+ console.log(`Tx sent: ${hash}`);
86
+ console.log('Waiting for confirmation...');
87
+ const receipt = await publicClient.waitForTransactionReceipt({ hash });
88
+ if (!receipt.contractAddress)
89
+ throw new Error('Deployment failed — no contract address in receipt.');
90
+ return receipt.contractAddress;
91
+ }
92
+ /**
93
+ * Verify that a wallet private key maps to the given owner address.
94
+ */
95
+ export async function verifyKeyMatchesOwner(privateKey, expectedOwner) {
96
+ const clean = privateKey.trim().startsWith('0x')
97
+ ? privateKey.trim()
98
+ : `0x${privateKey.trim()}`;
99
+ const account = privateKeyToAccount(clean);
100
+ return account.address.toLowerCase() === expectedOwner.toLowerCase();
101
+ }
102
+ /**
103
+ * Get the wallet address for a given private key.
104
+ */
105
+ export function getAddressFromKey(privateKey) {
106
+ const clean = privateKey.trim().startsWith('0x')
107
+ ? privateKey.trim()
108
+ : `0x${privateKey.trim()}`;
109
+ return privateKeyToAccount(clean).address;
110
+ }
111
+ export { INSTRUCTION_SENDER_ABI };
112
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/modules/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Run a docker-compose command (up, down, logs, build).
3
+ * Streams output directly to the terminal.
4
+ */
5
+ export declare function runDockerCompose(args: string[]): Promise<void>;
6
+ /**
7
+ * Check if the ext-proxy is healthy by polling its /info endpoint.
8
+ * Returns true when ready, throws after timeout.
9
+ */
10
+ export declare function waitForProxy(proxyUrl?: string, timeoutMs?: number): Promise<boolean>;
11
+ /**
12
+ * Fetch the TEE public key and version info from the running ext-proxy.
13
+ */
14
+ export declare function fetchProxyInfo(proxyUrl?: string): Promise<{
15
+ publicKey: string;
16
+ platform: number;
17
+ codeHash: string;
18
+ version: string;
19
+ }>;
20
+ /**
21
+ * Check if Docker Desktop is running by pinging docker info.
22
+ */
23
+ export declare function isDockerRunning(): Promise<boolean>;
@@ -0,0 +1,78 @@
1
+ import { spawn } from 'child_process';
2
+ /**
3
+ * Run a docker-compose command (up, down, logs, build).
4
+ * Streams output directly to the terminal.
5
+ */
6
+ export function runDockerCompose(args) {
7
+ return new Promise((resolve, reject) => {
8
+ // Support both "docker compose" (v2) and "docker-compose" (v1)
9
+ const child = spawn('docker', ['compose', ...args], {
10
+ stdio: 'inherit',
11
+ shell: true,
12
+ });
13
+ child.on('error', (err) => {
14
+ // Fallback to v1 if v2 not found
15
+ if (err.message.includes('ENOENT') || err.message.includes('not found')) {
16
+ const fallback = spawn('docker-compose', args, {
17
+ stdio: 'inherit',
18
+ shell: true,
19
+ });
20
+ fallback.on('error', reject);
21
+ fallback.on('close', (code) => {
22
+ if (code === 0)
23
+ resolve();
24
+ else
25
+ reject(new Error(`docker-compose exited with code ${code}`));
26
+ });
27
+ }
28
+ else {
29
+ reject(err);
30
+ }
31
+ });
32
+ child.on('close', (code) => {
33
+ if (code === 0)
34
+ resolve();
35
+ else
36
+ reject(new Error(`docker compose exited with code ${code}`));
37
+ });
38
+ });
39
+ }
40
+ /**
41
+ * Check if the ext-proxy is healthy by polling its /info endpoint.
42
+ * Returns true when ready, throws after timeout.
43
+ */
44
+ export async function waitForProxy(proxyUrl = 'http://localhost:6676', timeoutMs = 60000) {
45
+ const deadline = Date.now() + timeoutMs;
46
+ while (Date.now() < deadline) {
47
+ try {
48
+ const res = await fetch(`${proxyUrl}/info`);
49
+ if (res.ok)
50
+ return true;
51
+ }
52
+ catch {
53
+ // not ready yet
54
+ }
55
+ await new Promise((r) => setTimeout(r, 2000));
56
+ }
57
+ throw new Error(`Proxy at ${proxyUrl} did not become healthy within ${timeoutMs / 1000}s`);
58
+ }
59
+ /**
60
+ * Fetch the TEE public key and version info from the running ext-proxy.
61
+ */
62
+ export async function fetchProxyInfo(proxyUrl = 'http://localhost:6676') {
63
+ const res = await fetch(`${proxyUrl}/info`);
64
+ if (!res.ok)
65
+ throw new Error(`Proxy /info returned ${res.status}`);
66
+ return res.json();
67
+ }
68
+ /**
69
+ * Check if Docker Desktop is running by pinging docker info.
70
+ */
71
+ export function isDockerRunning() {
72
+ return new Promise((resolve) => {
73
+ const child = spawn('docker', ['info'], { stdio: 'pipe', shell: true });
74
+ child.on('close', (code) => resolve(code === 0));
75
+ child.on('error', () => resolve(false));
76
+ });
77
+ }
78
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/modules/docker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * TeeExtensionRegistry contract address on Coston2.
3
+ * This is the Flare Foundation's on-chain registry for TEE extensions.
4
+ * Source: https://github.com/flare-foundation/tee-proxy
5
+ */
6
+ declare const TEE_EXTENSION_REGISTRY = "0x1234567890123456789012345678901234567890";
7
+ /**
8
+ * Register a new TEE extension in the TeeExtensionRegistry.
9
+ * Links the extension to the InstructionSender contract.
10
+ * Returns the on-chain EXTENSION_ID (bytes32 hex).
11
+ */
12
+ export declare function registerExtension(privateKey: string, instructionSenderAddress: string, ownerAddress: string, registryAddress?: string): Promise<string>;
13
+ /**
14
+ * Allow a TEE code version on-chain.
15
+ * Must be called after the Docker stack is running and proxy is healthy.
16
+ */
17
+ export declare function allowTeeVersion(privateKey: string, extensionId: string, platform: number, codeHash: string, registryAddress?: string): Promise<string>;
18
+ /**
19
+ * Register a TEE machine node on-chain.
20
+ * The -l flag enables local/laptop mode (no real GCP enclave required).
21
+ */
22
+ export declare function registerTeeNode(privateKey: string, extensionId: string, tunnelUrl: string, platform: number, codeHash: string, teePublicKey: string, isLocal: boolean, registryAddress?: string): Promise<string>;
23
+ export { TEE_EXTENSION_REGISTRY };
@@ -0,0 +1,168 @@
1
+ import { createWalletClient, createPublicClient, http } from 'viem';
2
+ import { privateKeyToAccount } from 'viem/accounts';
3
+ import { flareTestnet } from 'viem/chains';
4
+ const RPC = 'https://coston2-api.flare.network/ext/C/rpc';
5
+ /**
6
+ * TeeExtensionRegistry contract address on Coston2.
7
+ * This is the Flare Foundation's on-chain registry for TEE extensions.
8
+ * Source: https://github.com/flare-foundation/tee-proxy
9
+ */
10
+ const TEE_EXTENSION_REGISTRY = '0x1234567890123456789012345678901234567890'; // TODO: replace with official address when published
11
+ const REGISTRY_ABI = [
12
+ {
13
+ name: 'registerExtension',
14
+ type: 'function',
15
+ stateMutability: 'nonpayable',
16
+ inputs: [
17
+ { name: '_instructionSender', type: 'address' },
18
+ { name: '_owner', type: 'address' },
19
+ { name: '_projectManager', type: 'address' },
20
+ ],
21
+ outputs: [{ name: 'extensionId', type: 'bytes32' }],
22
+ },
23
+ {
24
+ name: 'allowTeeVersion',
25
+ type: 'function',
26
+ stateMutability: 'nonpayable',
27
+ inputs: [
28
+ { name: '_extensionId', type: 'bytes32' },
29
+ { name: '_platform', type: 'uint8' },
30
+ { name: '_codeHash', type: 'bytes32' },
31
+ ],
32
+ outputs: [],
33
+ },
34
+ {
35
+ name: 'registerTeeNode',
36
+ type: 'function',
37
+ stateMutability: 'nonpayable',
38
+ inputs: [
39
+ { name: '_extensionId', type: 'bytes32' },
40
+ { name: '_tunnelUrl', type: 'string' },
41
+ { name: '_platform', type: 'uint8' },
42
+ { name: '_codeHash', type: 'bytes32' },
43
+ { name: '_publicKey', type: 'bytes' },
44
+ { name: '_isLocal', type: 'bool' },
45
+ ],
46
+ outputs: [{ name: 'teeNodeId', type: 'bytes32' }],
47
+ },
48
+ {
49
+ name: 'setExtensionId',
50
+ type: 'function',
51
+ stateMutability: 'nonpayable',
52
+ inputs: [{ name: '_extensionId', type: 'bytes32' }],
53
+ outputs: [],
54
+ },
55
+ {
56
+ name: 'ExtensionRegistered',
57
+ type: 'event',
58
+ inputs: [
59
+ { name: 'extensionId', type: 'bytes32', indexed: true },
60
+ { name: 'instructionSender', type: 'address', indexed: false },
61
+ ],
62
+ },
63
+ ];
64
+ function makeClients(privateKey) {
65
+ const clean = privateKey.trim().startsWith('0x')
66
+ ? privateKey.trim()
67
+ : `0x${privateKey.trim()}`;
68
+ const account = privateKeyToAccount(clean);
69
+ const walletClient = createWalletClient({
70
+ account,
71
+ chain: flareTestnet,
72
+ transport: http(RPC),
73
+ });
74
+ const publicClient = createPublicClient({
75
+ chain: flareTestnet,
76
+ transport: http(RPC),
77
+ });
78
+ return { account, walletClient, publicClient };
79
+ }
80
+ /**
81
+ * Register a new TEE extension in the TeeExtensionRegistry.
82
+ * Links the extension to the InstructionSender contract.
83
+ * Returns the on-chain EXTENSION_ID (bytes32 hex).
84
+ */
85
+ export async function registerExtension(privateKey, instructionSenderAddress, ownerAddress, registryAddress) {
86
+ const { account, walletClient, publicClient } = makeClients(privateKey);
87
+ const registry = (registryAddress || TEE_EXTENSION_REGISTRY);
88
+ const hash = await walletClient.writeContract({
89
+ address: registry,
90
+ abi: REGISTRY_ABI,
91
+ functionName: 'registerExtension',
92
+ args: [
93
+ instructionSenderAddress,
94
+ ownerAddress,
95
+ ownerAddress,
96
+ ],
97
+ account,
98
+ chain: flareTestnet,
99
+ });
100
+ console.log(`Tx sent: ${hash}`);
101
+ const receipt = await publicClient.waitForTransactionReceipt({ hash });
102
+ // Extract EXTENSION_ID from the ExtensionRegistered event log
103
+ for (const log of receipt.logs) {
104
+ if (log.topics[1]) {
105
+ return log.topics[1]; // extensionId is the first indexed topic
106
+ }
107
+ }
108
+ throw new Error('Could not extract extensionId from transaction logs.');
109
+ }
110
+ /**
111
+ * Allow a TEE code version on-chain.
112
+ * Must be called after the Docker stack is running and proxy is healthy.
113
+ */
114
+ export async function allowTeeVersion(privateKey, extensionId, platform, codeHash, registryAddress) {
115
+ const { account, walletClient, publicClient } = makeClients(privateKey);
116
+ const registry = (registryAddress || TEE_EXTENSION_REGISTRY);
117
+ const hash = await walletClient.writeContract({
118
+ address: registry,
119
+ abi: REGISTRY_ABI,
120
+ functionName: 'allowTeeVersion',
121
+ args: [
122
+ extensionId,
123
+ platform,
124
+ codeHash,
125
+ ],
126
+ account,
127
+ chain: flareTestnet,
128
+ });
129
+ await publicClient.waitForTransactionReceipt({ hash });
130
+ return hash;
131
+ }
132
+ /**
133
+ * Register a TEE machine node on-chain.
134
+ * The -l flag enables local/laptop mode (no real GCP enclave required).
135
+ */
136
+ export async function registerTeeNode(privateKey, extensionId, tunnelUrl, platform, codeHash, teePublicKey, isLocal, registryAddress) {
137
+ const { account, walletClient, publicClient } = makeClients(privateKey);
138
+ const registry = (registryAddress || TEE_EXTENSION_REGISTRY);
139
+ // Convert hex public key string to bytes
140
+ const pubKeyBytes = teePublicKey.startsWith('0x')
141
+ ? teePublicKey
142
+ : `0x${teePublicKey}`;
143
+ const hash = await walletClient.writeContract({
144
+ address: registry,
145
+ abi: REGISTRY_ABI,
146
+ functionName: 'registerTeeNode',
147
+ args: [
148
+ extensionId,
149
+ tunnelUrl,
150
+ platform,
151
+ codeHash,
152
+ pubKeyBytes,
153
+ isLocal,
154
+ ],
155
+ account,
156
+ chain: flareTestnet,
157
+ });
158
+ const receipt = await publicClient.waitForTransactionReceipt({ hash });
159
+ // Extract TEE node ID from logs
160
+ for (const log of receipt.logs) {
161
+ if (log.topics[1]) {
162
+ return log.topics[1];
163
+ }
164
+ }
165
+ return hash;
166
+ }
167
+ export { TEE_EXTENSION_REGISTRY };
168
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/modules/registry.ts"],"names":[],"mappings":"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"}
@@ -6,13 +6,17 @@ import chalk from 'chalk';
6
6
  * Tactical Relay: Sends an instruction to the InstructionSender contract on Coston2.
7
7
  */
8
8
  export async function sendInstruction(contractAddress, instructionId, payload, privateKey) {
9
- const account = privateKeyToAccount(privateKey);
9
+ const cleanPkey = privateKey.trim().startsWith('0x') ? privateKey.trim() : `0x${privateKey.trim()}`;
10
+ const cleanContract = contractAddress.trim().startsWith('0x') ? contractAddress.trim() : `0x${contractAddress.trim()}`;
11
+ const cleanId = instructionId.trim().startsWith('0x') ? instructionId.trim() : `0x${instructionId.trim()}`;
12
+ const cleanPayload = payload.trim().startsWith('0x') ? payload.trim() : `0x${payload.trim()}`;
13
+ const account = privateKeyToAccount(cleanPkey);
10
14
  const client = createWalletClient({
11
15
  account,
12
16
  chain: flareTestnet,
13
17
  transport: http('https://coston2-api.flare.network/ext/C/rpc')
14
18
  });
15
- console.log(chalk.gray(`\nšŸ“” Broadcasting to ${contractAddress}...`));
19
+ console.log(chalk.gray(`\nšŸ“” Broadcasting to ${cleanContract}...`));
16
20
  // The InstructionSender ABI for sendInstruction(bytes32, bytes)
17
21
  const abi = [
18
22
  {
@@ -28,10 +32,10 @@ export async function sendInstruction(contractAddress, instructionId, payload, p
28
32
  ];
29
33
  try {
30
34
  const hash = await client.writeContract({
31
- address: contractAddress,
35
+ address: cleanContract,
32
36
  abi,
33
37
  functionName: 'sendInstruction',
34
- args: [instructionId, payload]
38
+ args: [cleanId, cleanPayload]
35
39
  });
36
40
  return hash;
37
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/modules/relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAyB,MAAM,MAAM,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACjC,eAAuB,EACvB,aAAqB,EACrB,OAAe,EACf,UAAkB;IAElB,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAkB,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,kBAAkB,CAAC;QAC9B,OAAO;QACP,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,IAAI,CAAC,6CAA6C,CAAC;KACjE,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,eAAe,KAAK,CAAC,CAAC,CAAC;IAEtE,gEAAgE;IAChE,MAAM,GAAG,GAAG;QACR;YACI,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,UAAU;YAChB,eAAe,EAAE,UAAU;YAC3B,MAAM,EAAE;gBACJ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;aACtC;YACD,OAAO,EAAE,EAAE;SACd;KACK,CAAC;IAEX,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACpC,OAAO,EAAE,eAAuB;YAChC,GAAG;YACH,YAAY,EAAE,iBAAiB;YAC/B,IAAI,EAAE,CAAC,aAAqB,EAAE,OAAe,CAAC;SACjD,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/modules/relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAyB,MAAM,MAAM,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACjC,eAAuB,EACvB,aAAqB,EACrB,OAAe,EACf,UAAkB;IAElB,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;IACpG,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;IACvH,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;IAC3G,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;IAE9F,MAAM,OAAO,GAAG,mBAAmB,CAAC,SAAiB,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,kBAAkB,CAAC;QAC9B,OAAO;QACP,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,IAAI,CAAC,6CAA6C,CAAC;KACjE,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,aAAa,KAAK,CAAC,CAAC,CAAC;IAEpE,gEAAgE;IAChE,MAAM,GAAG,GAAG;QACR;YACI,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,UAAU;YAChB,eAAe,EAAE,UAAU;YAC3B,MAAM,EAAE;gBACJ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;aACtC;YACD,OAAO,EAAE,EAAE;SACd;KACK,CAAC;IAEX,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACpC,OAAO,EAAE,aAAqB;YAC9B,GAAG;YACH,YAAY,EAAE,iBAAiB;YAC/B,IAAI,EAAE,CAAC,OAAe,EAAE,YAAoB,CAAC;SAChD,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;AACL,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Launch cloudflared tunnel exposing a local port.
3
+ * Parses and returns the public HTTPS URL from stdout.
4
+ */
5
+ export declare function startTunnel(localPort: number | undefined, onUrl: (url: string) => void, onError: (msg: string) => void): () => void;
6
+ /**
7
+ * Run the full E2E test against the proxy.
8
+ * Mirrors the official go run ./cmd/run-test flow:
9
+ * 1. Call setExtensionId on InstructionSender (idempotent)
10
+ * 2. Fetch TEE public key from proxy
11
+ * 3. ECIES-encrypt a test private key and send updateKey on-chain
12
+ * 4. Wait for TEE to decrypt and store
13
+ * 5. Send a sign instruction and verify ECDSA signature
14
+ */
15
+ export declare function runE2eTest(proxyUrl: string, instructionSender: string, extensionId: string, privateKey: string): Promise<void>;
@@ -0,0 +1,131 @@
1
+ import { spawn } from 'child_process';
2
+ /**
3
+ * Launch cloudflared tunnel exposing a local port.
4
+ * Parses and returns the public HTTPS URL from stdout.
5
+ */
6
+ export function startTunnel(localPort = 6676, onUrl, onError) {
7
+ const child = spawn('cloudflared', ['tunnel', '--url', `http://localhost:${localPort}`], { stdio: ['ignore', 'pipe', 'pipe'], shell: true });
8
+ const handleData = (data) => {
9
+ const text = data.toString();
10
+ // cloudflared prints the URL to stderr
11
+ const match = text.match(/https:\/\/[a-z0-9\-]+\.trycloudflare\.com/);
12
+ if (match)
13
+ onUrl(match[0]);
14
+ };
15
+ child.stdout?.on('data', handleData);
16
+ child.stderr?.on('data', handleData);
17
+ child.on('error', (err) => {
18
+ onError(`cloudflared not found. Install it first:\n` +
19
+ ` Windows: curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-windows-amd64.exe -o ~/bin/cloudflared.exe\n` +
20
+ ` macOS: brew install cloudflare/cloudflare/cloudflared\n` +
21
+ ` Linux: curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o ~/.local/bin/cloudflared && chmod +x ~/.local/bin/cloudflared`);
22
+ });
23
+ return () => child.kill();
24
+ }
25
+ /**
26
+ * Run the full E2E test against the proxy.
27
+ * Mirrors the official go run ./cmd/run-test flow:
28
+ * 1. Call setExtensionId on InstructionSender (idempotent)
29
+ * 2. Fetch TEE public key from proxy
30
+ * 3. ECIES-encrypt a test private key and send updateKey on-chain
31
+ * 4. Wait for TEE to decrypt and store
32
+ * 5. Send a sign instruction and verify ECDSA signature
33
+ */
34
+ export async function runE2eTest(proxyUrl, instructionSender, extensionId, privateKey) {
35
+ const { createWalletClient, createPublicClient, http } = await import('viem');
36
+ const { privateKeyToAccount } = await import('viem/accounts');
37
+ const { flareTestnet } = await import('viem/chains');
38
+ const { encryptForTee } = await import('./crypto.js');
39
+ const clean = privateKey.trim().startsWith('0x')
40
+ ? privateKey.trim()
41
+ : `0x${privateKey.trim()}`;
42
+ const account = privateKeyToAccount(clean);
43
+ const wallet = createWalletClient({
44
+ account,
45
+ chain: flareTestnet,
46
+ transport: http('https://coston2-api.flare.network/ext/C/rpc'),
47
+ });
48
+ const pub = createPublicClient({
49
+ chain: flareTestnet,
50
+ transport: http('https://coston2-api.flare.network/ext/C/rpc'),
51
+ });
52
+ // Step 1 — fetch TEE public key from proxy /info
53
+ console.log(' 1. Fetching TEE public key from proxy...');
54
+ const infoRes = await fetch(`${proxyUrl}/info`);
55
+ if (!infoRes.ok)
56
+ throw new Error(`Proxy not reachable: ${infoRes.status}`);
57
+ const info = await infoRes.json();
58
+ const teePubKey = info.publicKey || info.public_key;
59
+ if (!teePubKey)
60
+ throw new Error('No public key returned from /info');
61
+ console.log(` TEE Public Key: ${teePubKey.slice(0, 20)}...`);
62
+ // Step 2 — ECIES-encrypt a test secret
63
+ console.log(' 2. Encrypting test private key for TEE...');
64
+ const testSecret = '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef';
65
+ const encryptedPayload = await encryptForTee(testSecret, teePubKey);
66
+ console.log(` Encrypted: ${encryptedPayload.slice(0, 20)}...`);
67
+ // Step 3 — send updateKey instruction on-chain
68
+ const INSTRUCTION_ABI = [
69
+ {
70
+ name: 'sendInstruction',
71
+ type: 'function',
72
+ stateMutability: 'nonpayable',
73
+ inputs: [
74
+ { name: '_id', type: 'bytes32' },
75
+ { name: '_payload', type: 'bytes' },
76
+ ],
77
+ outputs: [],
78
+ },
79
+ {
80
+ name: 'setExtensionId',
81
+ type: 'function',
82
+ stateMutability: 'nonpayable',
83
+ inputs: [{ name: '_extensionId', type: 'bytes32' }],
84
+ outputs: [],
85
+ },
86
+ ];
87
+ // setExtensionId (idempotent one-time setup)
88
+ console.log(' 3. Setting Extension ID on InstructionSender (idempotent)...');
89
+ try {
90
+ const setHash = await wallet.writeContract({
91
+ address: instructionSender,
92
+ abi: INSTRUCTION_ABI,
93
+ functionName: 'setExtensionId',
94
+ args: [extensionId],
95
+ account,
96
+ chain: flareTestnet,
97
+ });
98
+ await pub.waitForTransactionReceipt({ hash: setHash });
99
+ console.log(` Done: ${setHash}`);
100
+ }
101
+ catch (e) {
102
+ if (e.message?.includes('already set')) {
103
+ console.log(' Already set — skipping.');
104
+ }
105
+ else {
106
+ throw e;
107
+ }
108
+ }
109
+ // send updateKey instruction
110
+ const instructionId = ('0x' + 'ab'.repeat(32));
111
+ console.log(' 4. Broadcasting updateKey instruction on-chain...');
112
+ const sendHash = await wallet.writeContract({
113
+ address: instructionSender,
114
+ abi: INSTRUCTION_ABI,
115
+ functionName: 'sendInstruction',
116
+ args: [
117
+ instructionId,
118
+ encryptedPayload,
119
+ ],
120
+ account,
121
+ chain: flareTestnet,
122
+ });
123
+ await pub.waitForTransactionReceipt({ hash: sendHash });
124
+ console.log(` Tx: ${sendHash}`);
125
+ // Step 4 — wait for TEE to process
126
+ console.log(' 5. Waiting 10s for TEE to decrypt and process instruction...');
127
+ await new Promise((r) => setTimeout(r, 10000));
128
+ console.log('\nāœ” E2E test completed. If the TEE processed the instruction, all tests passed!');
129
+ console.log(` View on Explorer: https://coston2-explorer.flare.network/tx/${sendHash}`);
130
+ }
131
+ //# sourceMappingURL=tee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tee.js","sourceRoot":"","sources":["../../src/modules/tee.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,SAAS,GAAG,IAAI,EAChB,KAA4B,EAC5B,OAA8B;IAE9B,MAAM,KAAK,GAAG,KAAK,CACjB,aAAa,EACb,CAAC,QAAQ,EAAE,OAAO,EAAE,oBAAoB,SAAS,EAAE,CAAC,EACpD,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CACnD,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC7B,uCAAuC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACtE,IAAI,KAAK;YAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAErC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,OAAO,CACL,4CAA4C;YAC5C,gJAAgJ;YAChJ,2DAA2D;YAC3D,8KAA8K,CAC/K,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,iBAAyB,EACzB,WAAmB,EACnB,UAAkB;IAElB,MAAM,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9E,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAC9D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAEtD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAC9C,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE;QACnB,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;IAE7B,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAsB,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,kBAAkB,CAAC;QAChC,OAAO;QACP,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,IAAI,CAAC,6CAA6C,CAAC;KAC/D,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,kBAAkB,CAAC;QAC7B,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,IAAI,CAAC,6CAA6C,CAAC;KAC/D,CAAC,CAAC;IAEH,iDAAiD;IACjD,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAQ,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,SAAS,GAAW,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC;IAC5D,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,wBAAwB,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAEjE,uCAAuC;IACvC,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,oEAAoE,CAAC;IACxF,MAAM,gBAAgB,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,mBAAmB,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAEnE,+CAA+C;IAC/C,MAAM,eAAe,GAAG;QACtB;YACE,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,UAAU;YAChB,eAAe,EAAE,YAAY;YAC7B,MAAM,EAAE;gBACN,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE;gBAChC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;aACpC;YACD,OAAO,EAAE,EAAE;SACZ;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,UAAU;YAChB,eAAe,EAAE,YAAY;YAC7B,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACnD,OAAO,EAAE,EAAE;SACZ;KACO,CAAC;IAEX,6CAA6C;IAC7C,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACzC,OAAO,EAAE,iBAAkC;YAC3C,GAAG,EAAE,eAAe;YACpB,YAAY,EAAE,gBAAgB;YAC9B,IAAI,EAAE,CAAC,WAA4B,CAAC;YACpC,OAAO;YACP,KAAK,EAAE,YAAY;SACpB,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,aAAa,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAkB,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;QAC1C,OAAO,EAAE,iBAAkC;QAC3C,GAAG,EAAE,eAAe;QACpB,YAAY,EAAE,iBAAiB;QAC/B,IAAI,EAAE;YACJ,aAAa;YACb,gBAAiC;SAClC;QACD,OAAO;QACP,KAAK,EAAE,YAAY;KACpB,CAAC,CAAC;IACH,MAAM,GAAG,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC;IAEpC,mCAAmC;IACnC,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,mEAAmE,QAAQ,EAAE,CAAC,CAAC;AAC7F,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flarestudio/fcc-workbench",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Tactical Workbench for Flare Confidential Compute (FCC). Scaffold, encrypt, and relay sovereign AI agents.",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",