@agentxv2/gateway 0.1.1
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/.env.example +53 -0
- package/db/migrations/001_init.sql +117 -0
- package/db/migrations/002_agents.sql +20 -0
- package/db/migrations/003_a2a_results.sql +23 -0
- package/deploy/.env.deploy.example +23 -0
- package/deploy/add_swap_build.py +45 -0
- package/deploy/build_and_deploy.py +110 -0
- package/deploy/build_deploy_a2a.py +190 -0
- package/deploy/build_no_lint.py +52 -0
- package/deploy/build_on_fe.py +86 -0
- package/deploy/build_on_gw.py +98 -0
- package/deploy/build_prod.py +54 -0
- package/deploy/check_bal.py +31 -0
- package/deploy/check_code.py +47 -0
- package/deploy/check_deploy.sh +20 -0
- package/deploy/check_docs.py +16 -0
- package/deploy/check_frontend.py +42 -0
- package/deploy/check_frontend2.py +35 -0
- package/deploy/check_pks.py +34 -0
- package/deploy/check_status.py +32 -0
- package/deploy/check_v2.py +8 -0
- package/deploy/clean_install.py +28 -0
- package/deploy/deploy_a2a.py +58 -0
- package/deploy/deploy_a2a.sh +33 -0
- package/deploy/deploy_a2a_bg.sh +40 -0
- package/deploy/deploy_a2a_v2.py +151 -0
- package/deploy/deploy_a2a_v2.sh +36 -0
- package/deploy/deploy_bin.py +64 -0
- package/deploy/deploy_config.py +34 -0
- package/deploy/deploy_final.py +42 -0
- package/deploy/deploy_frontend.py +108 -0
- package/deploy/deploy_mcp.py +108 -0
- package/deploy/deploy_now.py +49 -0
- package/deploy/deploy_push_all.py +128 -0
- package/deploy/deploy_script.py +64 -0
- package/deploy/deploy_sep_a2a.sh +18 -0
- package/deploy/dev_mode.py +51 -0
- package/deploy/diag.py +12 -0
- package/deploy/diff_test.py +22 -0
- package/deploy/final_check.py +33 -0
- package/deploy/final_deploy.py +50 -0
- package/deploy/final_fix.py +54 -0
- package/deploy/final_push.py +114 -0
- package/deploy/find_frontend.py +38 -0
- package/deploy/fix_a2a.py +43 -0
- package/deploy/fix_and_build.py +77 -0
- package/deploy/fix_and_verify.py +56 -0
- package/deploy/fix_build.py +51 -0
- package/deploy/forge_deploy.py +67 -0
- package/deploy/full_push.py +101 -0
- package/deploy/full_push2.py +106 -0
- package/deploy/go_prod.py +59 -0
- package/deploy/gw_deploy.py +133 -0
- package/deploy/gw_final.py +206 -0
- package/deploy/gw_restart.py +28 -0
- package/deploy/gw_status.py +18 -0
- package/deploy/inline_build.py +99 -0
- package/deploy/one_shot.py +84 -0
- package/deploy/ox_deploy.py +32 -0
- package/deploy/pg_setup.py +36 -0
- package/deploy/prod_deploy.py +126 -0
- package/deploy/prod_final.py +140 -0
- package/deploy/prod_go.py +61 -0
- package/deploy/prod_one_shot.py +139 -0
- package/deploy/prod_setup.sh +62 -0
- package/deploy/prod_v2.py +91 -0
- package/deploy/prod_v3.py +103 -0
- package/deploy/push_docs.py +93 -0
- package/deploy/push_mcp.py +66 -0
- package/deploy/push_mcp_doc.py +28 -0
- package/deploy/push_v063.py +80 -0
- package/deploy/push_v2.py +71 -0
- package/deploy/qcheck.py +13 -0
- package/deploy/qcheck2.py +18 -0
- package/deploy/quick_check.py +8 -0
- package/deploy/rebuild.py +47 -0
- package/deploy/rebuild_frontend.py +44 -0
- package/deploy/restart.py +28 -0
- package/deploy/restore_frontend.py +42 -0
- package/deploy/restore_frontend2.py +41 -0
- package/deploy/restore_gateway.py +34 -0
- package/deploy/restore_quick.py +33 -0
- package/deploy/run_bash.py +19 -0
- package/deploy/run_sep.py +20 -0
- package/deploy/sdk_upgrade.py +50 -0
- package/deploy/server_prepare.py +41 -0
- package/deploy/server_setup.py +41 -0
- package/deploy/ssh_check.py +14 -0
- package/deploy/ssh_push.py +24 -0
- package/deploy/start_deploy.py +35 -0
- package/deploy/start_frontend.py +12 -0
- package/deploy/start_v2.py +29 -0
- package/deploy/stat.py +18 -0
- package/deploy/tail_log.py +11 -0
- package/deploy/update_env.py +32 -0
- package/deploy/upload_and_start.py +107 -0
- package/deploy/verify_a2a.py +13 -0
- package/deploy/verify_mcp.py +37 -0
- package/deploy/verify_sdk.py +21 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.js +41 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +149 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/crypto.d.ts +2 -0
- package/dist/lib/crypto.js +43 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/db.d.ts +3 -0
- package/dist/lib/db.js +26 -0
- package/dist/lib/db.js.map +1 -0
- package/dist/lib/ethers-utils.d.ts +60 -0
- package/dist/lib/ethers-utils.js +186 -0
- package/dist/lib/ethers-utils.js.map +1 -0
- package/dist/middleware/adminAuth.d.ts +2 -0
- package/dist/middleware/adminAuth.js +31 -0
- package/dist/middleware/adminAuth.js.map +1 -0
- package/dist/middleware/auth.d.ts +22 -0
- package/dist/middleware/auth.js +192 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +36 -0
- package/dist/middleware/error-handler.js +100 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/rate-limiter.d.ts +5 -0
- package/dist/middleware/rate-limiter.js +107 -0
- package/dist/middleware/rate-limiter.js.map +1 -0
- package/dist/routes/a2a.d.ts +2 -0
- package/dist/routes/a2a.js +84 -0
- package/dist/routes/a2a.js.map +1 -0
- package/dist/routes/admin.d.ts +2 -0
- package/dist/routes/admin.js +180 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/agents.d.ts +2 -0
- package/dist/routes/agents.js +43 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/chat.d.ts +2 -0
- package/dist/routes/chat.js +183 -0
- package/dist/routes/chat.js.map +1 -0
- package/dist/routes/history.d.ts +2 -0
- package/dist/routes/history.js +92 -0
- package/dist/routes/history.js.map +1 -0
- package/dist/routes/mcp.d.ts +13 -0
- package/dist/routes/mcp.js +513 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/tenant.d.ts +2 -0
- package/dist/routes/tenant.js +154 -0
- package/dist/routes/tenant.js.map +1 -0
- package/dist/services/a2a-worker.d.ts +7 -0
- package/dist/services/a2a-worker.js +406 -0
- package/dist/services/a2a-worker.js.map +1 -0
- package/dist/services/agent-indexer.d.ts +4 -0
- package/dist/services/agent-indexer.js +124 -0
- package/dist/services/agent-indexer.js.map +1 -0
- package/e2e_wallet.js +175 -0
- package/ecosystem.config.js +17 -0
- package/package.json +33 -0
- package/src/config.ts +47 -0
- package/src/index.ts +143 -0
- package/src/lib/crypto.ts +44 -0
- package/src/lib/db.ts +25 -0
- package/src/lib/ethers-utils.ts +229 -0
- package/src/middleware/adminAuth.ts +34 -0
- package/src/middleware/auth.ts +244 -0
- package/src/middleware/error-handler.ts +109 -0
- package/src/middleware/rate-limiter.ts +115 -0
- package/src/routes/a2a.ts +97 -0
- package/src/routes/admin.ts +219 -0
- package/src/routes/agents.ts +52 -0
- package/src/routes/chat.ts +219 -0
- package/src/routes/history.ts +114 -0
- package/src/routes/mcp.ts +567 -0
- package/src/routes/tenant.ts +196 -0
- package/src/services/a2a-worker.ts +486 -0
- package/src/services/agent-indexer.ts +127 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
export PATH=$HOME/.foundry/bin:$PATH
|
|
3
|
+
cd /tmp/a2a_build
|
|
4
|
+
ln -sf erc8004-interfaces src/interfaces 2>/dev/null
|
|
5
|
+
|
|
6
|
+
PK=0x9ff7f5511067c86fdd8c1dee11799e4778e4b1e86e5093d53eae8d4af356a424
|
|
7
|
+
SEP_IR=0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F
|
|
8
|
+
LOG=/tmp/a2a_deploy.log
|
|
9
|
+
|
|
10
|
+
{
|
|
11
|
+
echo "===== $(date) - SEPOLIA ====="
|
|
12
|
+
ARGS_HEX=$(cast abi-encode 'constructor(address)' $SEP_IR 2>&1)
|
|
13
|
+
echo "ABI-encoded args: $ARGS_HEX"
|
|
14
|
+
|
|
15
|
+
forge create \
|
|
16
|
+
--rpc-url https://ethereum-sepolia-rpc.publicnode.com \
|
|
17
|
+
--private-key $PK \
|
|
18
|
+
--legacy \
|
|
19
|
+
src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry \
|
|
20
|
+
--constructor-args $ARGS_HEX \
|
|
21
|
+
2>&1
|
|
22
|
+
|
|
23
|
+
echo ""
|
|
24
|
+
echo "===== $(date) - OXACHAIN L1 ====="
|
|
25
|
+
OX_IR=0xbf5F9db266c8c97E3334466C88597Eb758AfE212
|
|
26
|
+
OX_ARGS_HEX=$(cast abi-encode 'constructor(address)' $OX_IR 2>&1)
|
|
27
|
+
echo "ABI-encoded args: $OX_ARGS_HEX"
|
|
28
|
+
|
|
29
|
+
forge create \
|
|
30
|
+
--rpc-url http://43.156.99.215:18545 \
|
|
31
|
+
--private-key $PK \
|
|
32
|
+
--legacy \
|
|
33
|
+
src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry \
|
|
34
|
+
--constructor-args $OX_ARGS_HEX \
|
|
35
|
+
2>&1
|
|
36
|
+
|
|
37
|
+
echo "===== DONE $(date) ====="
|
|
38
|
+
} > $LOG 2>&1
|
|
39
|
+
|
|
40
|
+
echo "Deploy started in background. Check: tail -f $LOG"
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import paramiko
|
|
2
|
+
import tarfile
|
|
3
|
+
import os
|
|
4
|
+
import time
|
|
5
|
+
import base64
|
|
6
|
+
|
|
7
|
+
host = '43.156.78.59'
|
|
8
|
+
pk = '0x872c3190b82d17b29bb046c9c55a7f7390c7f74bd6d592ba8d211f20f896f28e'
|
|
9
|
+
SEP_IR = '0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F'
|
|
10
|
+
OX_IR = '0xbf5F9db266c8c97E3334466C88597Eb758AfE212'
|
|
11
|
+
SEP_RPC = 'https://ethereum-sepolia-rpc.publicnode.com'
|
|
12
|
+
OX_RPC = 'http://43.156.99.215:18545'
|
|
13
|
+
|
|
14
|
+
local_dir = r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\contracts'
|
|
15
|
+
tar_path = r'c:\Users\apply\Downloads\code\agentx_contracts.tar.gz'
|
|
16
|
+
|
|
17
|
+
print("=== Creating tar ===")
|
|
18
|
+
with tarfile.open(tar_path, 'w:gz') as tar:
|
|
19
|
+
for root, dirs, files in os.walk(local_dir):
|
|
20
|
+
dirs[:] = [d for d in dirs if d not in ('node_modules', 'lib', 'out', 'cache', 'broadcast', '.git', '__pycache__')]
|
|
21
|
+
for f in files:
|
|
22
|
+
if f.endswith('.json') and 'out' in root: continue
|
|
23
|
+
full = os.path.join(root, f)
|
|
24
|
+
arc = os.path.relpath(full, local_dir).replace('\\', '/')
|
|
25
|
+
tar.add(full, arcname=arc)
|
|
26
|
+
print(f"{os.path.getsize(tar_path)} bytes")
|
|
27
|
+
|
|
28
|
+
# Upload
|
|
29
|
+
transport = paramiko.Transport((host, 22))
|
|
30
|
+
transport.connect(username='ubuntu', password='Asdf1234!')
|
|
31
|
+
sftp = paramiko.SFTPClient.from_transport(transport)
|
|
32
|
+
sftp.put(tar_path, '/tmp/a2a_contracts.tar.gz')
|
|
33
|
+
sftp.close()
|
|
34
|
+
transport.close()
|
|
35
|
+
|
|
36
|
+
c = paramiko.SSHClient()
|
|
37
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
38
|
+
c.connect(host, username='ubuntu', password='Asdf1234!', timeout=30)
|
|
39
|
+
|
|
40
|
+
def run(ssh_client, cmd, desc=""):
|
|
41
|
+
print(f"\n[{desc}] > {cmd[:130]}")
|
|
42
|
+
stdin, stdout, stderr = ssh_client.exec_command(cmd, timeout=600)
|
|
43
|
+
out = stdout.read().decode()
|
|
44
|
+
err = stderr.read().decode()
|
|
45
|
+
ec = stdout.channel.recv_exit_status()
|
|
46
|
+
if out: print(out[-600:])
|
|
47
|
+
if err: print("STDERR:", err[-300:])
|
|
48
|
+
return ec, out, err
|
|
49
|
+
|
|
50
|
+
# Step 1: Extract
|
|
51
|
+
run(c, "cd /tmp && rm -rf a2a_build && mkdir a2a_build && cd a2a_build && tar xzf /tmp/a2a_contracts.tar.gz && echo OK")
|
|
52
|
+
|
|
53
|
+
# Step 2: Init git + install forge deps
|
|
54
|
+
print("\n=== Git init + install deps ===")
|
|
55
|
+
run(c, "cd /tmp/a2a_build && git init && git add . && git commit -m init 2>&1 | tail -3", "git init")
|
|
56
|
+
run(c, "export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && forge install foundry-rs/forge-std 2>&1 | tail -5", "forge-std")
|
|
57
|
+
run(c, "export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && forge install OpenZeppelin/openzeppelin-contracts@v5.0.2 2>&1 | tail -5", "oz")
|
|
58
|
+
|
|
59
|
+
# Verify deps
|
|
60
|
+
print("\n=== Verify deps ===")
|
|
61
|
+
ec, out, err = run(c, "ls /tmp/a2a_build/lib/forge-std/src/Script.sol && ls /tmp/a2a_build/lib/openzeppelin-contracts/contracts/access/Ownable.sol && echo DEPS_OK")
|
|
62
|
+
if ec != 0:
|
|
63
|
+
run(c, "ls -la /tmp/a2a_build/lib/ 2>&1", "check lib")
|
|
64
|
+
exit(1)
|
|
65
|
+
|
|
66
|
+
# Step 3: Write foundry.toml
|
|
67
|
+
toml = """[profile.default]
|
|
68
|
+
solc = "0.8.24"
|
|
69
|
+
via_ir = true
|
|
70
|
+
optimizer = true
|
|
71
|
+
optimizer_runs = 200
|
|
72
|
+
evm_version = "paris"
|
|
73
|
+
remappings = [
|
|
74
|
+
"@openzeppelin/=lib/openzeppelin-contracts/",
|
|
75
|
+
"forge-std/=lib/forge-std/src/"
|
|
76
|
+
]
|
|
77
|
+
"""
|
|
78
|
+
b64 = base64.b64encode(toml.encode()).decode()
|
|
79
|
+
run(c, f"echo '{b64}' | base64 -d > /tmp/a2a_build/foundry.toml && echo written")
|
|
80
|
+
|
|
81
|
+
# Step 4: Build
|
|
82
|
+
print("\n=== FORGE BUILD ===")
|
|
83
|
+
ec, out, err = run(c, "export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && forge build 2>&1 | tail -15", "build")
|
|
84
|
+
if ec != 0:
|
|
85
|
+
print("Trying with auto-detect solc...")
|
|
86
|
+
run(c, "export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && forge build 2>&1 | tail -20")
|
|
87
|
+
exit(1)
|
|
88
|
+
|
|
89
|
+
# Step 5: Deploy Sepolia
|
|
90
|
+
print("\n=========================================")
|
|
91
|
+
print(" SEPOLIA DEPLOY")
|
|
92
|
+
print("=========================================")
|
|
93
|
+
ec, out, err = run(c,
|
|
94
|
+
f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
|
|
95
|
+
f"forge create src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
|
|
96
|
+
f"--rpc-url {SEP_RPC} --private-key {pk} --constructor-args {SEP_IR} --legacy 2>&1",
|
|
97
|
+
"deploy Sepolia")
|
|
98
|
+
|
|
99
|
+
sep_addr = ""
|
|
100
|
+
for line in (out + err).split('\n'):
|
|
101
|
+
if 'Deployed to' in line:
|
|
102
|
+
sep_addr = line.split(':')[-1].strip()
|
|
103
|
+
print(f"\n>>> SEPOLIA A2A deployed to: {sep_addr}")
|
|
104
|
+
|
|
105
|
+
# Step 6: Deploy OxaChain
|
|
106
|
+
print("\n=========================================")
|
|
107
|
+
print(" OXACHAIN L1 DEPLOY")
|
|
108
|
+
print("=========================================")
|
|
109
|
+
ec, out, err = run(c,
|
|
110
|
+
f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
|
|
111
|
+
f"forge create src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
|
|
112
|
+
f"--rpc-url {OX_RPC} --private-key {pk} --constructor-args {OX_IR} --legacy 2>&1",
|
|
113
|
+
"deploy OxaChain")
|
|
114
|
+
|
|
115
|
+
ox_addr = ""
|
|
116
|
+
for line in (out + err).split('\n'):
|
|
117
|
+
if 'Deployed to' in line:
|
|
118
|
+
ox_addr = line.split(':')[-1].strip()
|
|
119
|
+
print(f"\n>>> OXACHAIN A2A deployed to: {ox_addr}")
|
|
120
|
+
|
|
121
|
+
# Step 7: Verify Sepolia
|
|
122
|
+
if sep_addr:
|
|
123
|
+
print("\n=== Verifying Sepolia ===")
|
|
124
|
+
run(c,
|
|
125
|
+
f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
|
|
126
|
+
f"forge verify-contract {sep_addr} src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
|
|
127
|
+
f"--verifier blockscout --verifier-url 'https://eth-sepolia.blockscout.com/api/' "
|
|
128
|
+
f"--constructor-args $(cast abi-encode 'constructor(address)' {SEP_IR}) 2>&1 | tail -10",
|
|
129
|
+
"verify")
|
|
130
|
+
|
|
131
|
+
# Step 8: Verify OxaChain
|
|
132
|
+
if ox_addr:
|
|
133
|
+
print("\n=== Verifying OxaChain ===")
|
|
134
|
+
run(c,
|
|
135
|
+
f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
|
|
136
|
+
f"forge verify-contract {ox_addr} src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
|
|
137
|
+
f"--verifier blockscout --verifier-url 'http://43.156.99.215:18400/api/' "
|
|
138
|
+
f"--constructor-args $(cast abi-encode 'constructor(address)' {OX_IR}) 2>&1 | tail -10",
|
|
139
|
+
"verify")
|
|
140
|
+
|
|
141
|
+
c.close()
|
|
142
|
+
|
|
143
|
+
print("\n============================================")
|
|
144
|
+
print(f" Sepolia A2A: {sep_addr}")
|
|
145
|
+
print(f" OxaChain L1 A2A: {ox_addr}")
|
|
146
|
+
print("============================================")
|
|
147
|
+
|
|
148
|
+
if sep_addr or ox_addr:
|
|
149
|
+
with open(r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\gateway\deploy\a2a_addresses.txt', 'w') as f:
|
|
150
|
+
f.write(f"SEPOLIA_A2A={sep_addr}\n")
|
|
151
|
+
f.write(f"OXACHAIN_A2A={ox_addr}\n")
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
export PATH=$HOME/.foundry/bin:$PATH
|
|
3
|
+
cd /tmp/a2a_build
|
|
4
|
+
ln -sf erc8004-interfaces src/interfaces 2>/dev/null
|
|
5
|
+
|
|
6
|
+
PK=0x9ff7f5511067c86fdd8c1dee11799e4778e4b1e86e5093d53eae8d4af356a424
|
|
7
|
+
LOG=/tmp/a2a_deploy2.log
|
|
8
|
+
|
|
9
|
+
{
|
|
10
|
+
echo "===== $(date) SEPOLIA ====="
|
|
11
|
+
cat > .env << ENVEOF
|
|
12
|
+
IDENTITY_REGISTRY=0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F
|
|
13
|
+
PRIVATE_KEY=$PK
|
|
14
|
+
ENVEOF
|
|
15
|
+
|
|
16
|
+
forge script script/DeployA2A.s.sol:DeployA2A \
|
|
17
|
+
--rpc-url https://ethereum-sepolia-rpc.publicnode.com \
|
|
18
|
+
--broadcast --legacy \
|
|
19
|
+
2>&1
|
|
20
|
+
|
|
21
|
+
echo ""
|
|
22
|
+
echo "===== $(date) OXACHAIN L1 ====="
|
|
23
|
+
cat > .env << ENVEOF
|
|
24
|
+
IDENTITY_REGISTRY=0xbf5F9db266c8c97E3334466C88597Eb758AfE212
|
|
25
|
+
PRIVATE_KEY=$PK
|
|
26
|
+
ENVEOF
|
|
27
|
+
|
|
28
|
+
forge script script/DeployA2A.s.sol:DeployA2A \
|
|
29
|
+
--rpc-url http://43.156.99.215:18545 \
|
|
30
|
+
--broadcast --legacy \
|
|
31
|
+
2>&1
|
|
32
|
+
|
|
33
|
+
echo "===== DONE $(date) ====="
|
|
34
|
+
} > $LOG 2>&1
|
|
35
|
+
|
|
36
|
+
echo "Background deploy started. PID=$!"
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import paramiko
|
|
2
|
+
import base64
|
|
3
|
+
|
|
4
|
+
pk = '0x872c3190b82d17b29bb046c9c55a7f7390c7f74bd6d592ba8d211f20f896f28e'
|
|
5
|
+
SEP_IR = '0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F'
|
|
6
|
+
OX_IR = '0xbf5F9db266c8c97E3334466C88597Eb758AfE212'
|
|
7
|
+
SEP_RPC = 'https://ethereum-sepolia-rpc.publicnode.com'
|
|
8
|
+
OX_RPC = 'http://43.156.99.215:18545'
|
|
9
|
+
|
|
10
|
+
# Use forge create with the address directly via --constructor-args-path
|
|
11
|
+
# Write the encoded bytes to a file
|
|
12
|
+
SEP_ARGS_BIN = bytes.fromhex('000000000000000000000000'+SEP_IR[2:].lower())
|
|
13
|
+
OX_ARGS_BIN = bytes.fromhex('000000000000000000000000'+OX_IR[2:].lower())
|
|
14
|
+
|
|
15
|
+
c = paramiko.SSHClient()
|
|
16
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
17
|
+
c.connect('43.156.78.59', username='ubuntu', password='Asdf1234!', timeout=30)
|
|
18
|
+
|
|
19
|
+
def run(cmd):
|
|
20
|
+
print(f"> {cmd[:120]}")
|
|
21
|
+
stdin, stdout, stderr = c.exec_command(cmd, timeout=600)
|
|
22
|
+
out = stdout.read().decode()
|
|
23
|
+
err = stderr.read().decode()
|
|
24
|
+
ec = stdout.channel.recv_exit_status()
|
|
25
|
+
if out: print(out[-400:])
|
|
26
|
+
if err: print("STDERR:", err[-400:])
|
|
27
|
+
return ec, out, err
|
|
28
|
+
|
|
29
|
+
# Ensure symlink
|
|
30
|
+
run("export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build/src && ln -sf erc8004-interfaces interfaces")
|
|
31
|
+
|
|
32
|
+
# Write constructor args as binary files via base64
|
|
33
|
+
import base64
|
|
34
|
+
sep_b64 = base64.b64encode(SEP_ARGS_BIN).decode()
|
|
35
|
+
ox_b64 = base64.b64encode(OX_ARGS_BIN).decode()
|
|
36
|
+
|
|
37
|
+
run(f"echo '{sep_b64}' | base64 -d > /tmp/sep_args.bin && xxd /tmp/sep_args.bin")
|
|
38
|
+
run(f"echo '{ox_b64}' | base64 -d > /tmp/ox_args.bin && xxd /tmp/ox_args.bin")
|
|
39
|
+
|
|
40
|
+
# Deploy Sepolia
|
|
41
|
+
print("\n========== SEPOLIA ==========")
|
|
42
|
+
ec, out, err = run(
|
|
43
|
+
f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
|
|
44
|
+
f"forge create src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
|
|
45
|
+
f"--rpc-url {SEP_RPC} --private-key {pk} --legacy "
|
|
46
|
+
f"--constructor-args-path /tmp/sep_args.bin 2>&1"
|
|
47
|
+
)
|
|
48
|
+
for line in (out + err).split('\n'):
|
|
49
|
+
if any(w in line for w in ['Deployed to', 'Transaction', 'Error', 'Block', 'Gas']):
|
|
50
|
+
print(f" {line.strip()}")
|
|
51
|
+
|
|
52
|
+
# Deploy OxaChain
|
|
53
|
+
print("\n========== OXACHAIN L1 ==========")
|
|
54
|
+
ec, out, err = run(
|
|
55
|
+
f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
|
|
56
|
+
f"forge create src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
|
|
57
|
+
f"--rpc-url {OX_RPC} --private-key {pk} --legacy "
|
|
58
|
+
f"--constructor-args-path /tmp/ox_args.bin 2>&1"
|
|
59
|
+
)
|
|
60
|
+
for line in (out + err).split('\n'):
|
|
61
|
+
if any(w in line for w in ['Deployed to', 'Transaction', 'Error', 'Block', 'Gas']):
|
|
62
|
+
print(f" {line.strip()}")
|
|
63
|
+
|
|
64
|
+
c.close()
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""
|
|
2
|
+
AgentX 部署配置模块
|
|
3
|
+
====================
|
|
4
|
+
所有凭证和服务器地址从环境变量读取,避免硬编码。
|
|
5
|
+
使用时: from deploy_config import HOST, PASSWORD, PK, OX_RPC
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import os
|
|
9
|
+
import sys
|
|
10
|
+
|
|
11
|
+
# ── SSH 连接 ──────────────────────────────────────────────────────
|
|
12
|
+
HOST = os.environ.get("AGENTX_DEPLOY_HOST", "")
|
|
13
|
+
PASSWORD = os.environ.get("AGENTX_DEPLOY_PASSWORD", "")
|
|
14
|
+
USER = os.environ.get("AGENTX_DEPLOY_USER", "ubuntu")
|
|
15
|
+
|
|
16
|
+
# ── Web3 / Chain ──────────────────────────────────────────────────
|
|
17
|
+
PK = os.environ.get("AGENTX_DEPLOY_PRIVATE_KEY", "")
|
|
18
|
+
OX_RPC = os.environ.get("AGENTX_OX_RPC", "http://43.156.99.215:18545")
|
|
19
|
+
SEPOLIA_RPC = os.environ.get("AGENTX_SEPOLIA_RPC", "https://ethereum-sepolia-rpc.publicnode.com")
|
|
20
|
+
|
|
21
|
+
# ── Paths (no secrets — these are fine as defaults) ───────────────
|
|
22
|
+
PROJECT_ROOT = os.environ.get("AGENTX_PROJECT_ROOT", "/home/ubuntu/agentx")
|
|
23
|
+
|
|
24
|
+
# ── Validation ────────────────────────────────────────────────────
|
|
25
|
+
_REQUIRED = {
|
|
26
|
+
"AGENTX_DEPLOY_HOST": HOST,
|
|
27
|
+
"AGENTX_DEPLOY_PASSWORD": PASSWORD,
|
|
28
|
+
"AGENTX_DEPLOY_PRIVATE_KEY": PK,
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
_missing = [k for k, v in _REQUIRED.items() if not v]
|
|
32
|
+
if _missing and any("deploy_config" in arg for arg in sys.argv):
|
|
33
|
+
print(f"[deploy_config] WARNING: 以下环境变量未设置: {', '.join(_missing)}")
|
|
34
|
+
print("[deploy_config] 请先 source .env.deploy 或手动 export 这些变量")
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import paramiko
|
|
2
|
+
|
|
3
|
+
c = paramiko.SSHClient()
|
|
4
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
5
|
+
c.connect('43.156.78.59', username='ubuntu', password='Asdf1234!', timeout=30)
|
|
6
|
+
|
|
7
|
+
def run(cmd):
|
|
8
|
+
print(f"> {cmd[:130]}")
|
|
9
|
+
stdin, stdout, stderr = c.exec_command(cmd, timeout=600)
|
|
10
|
+
out = stdout.read().decode()
|
|
11
|
+
err = stderr.read().decode()
|
|
12
|
+
ec = stdout.channel.recv_exit_status()
|
|
13
|
+
if out: print(out[-600:])
|
|
14
|
+
if err: print("E:", err[-400:])
|
|
15
|
+
return ec, out, err
|
|
16
|
+
|
|
17
|
+
# symlink
|
|
18
|
+
run("export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build/src && ln -sf erc8004-interfaces interfaces")
|
|
19
|
+
|
|
20
|
+
# Sepolia - address as positional arg
|
|
21
|
+
print("\n===== SEPOLIA =====")
|
|
22
|
+
ec, out, err = run(
|
|
23
|
+
"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
|
|
24
|
+
"forge create src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
|
|
25
|
+
"--rpc-url https://ethereum-sepolia-rpc.publicnode.com "
|
|
26
|
+
"--private-key 0x872c3190b82d17b29bb046c9c55a7f7390c7f74bd6d592ba8d211f20f896f28e "
|
|
27
|
+
"--legacy "
|
|
28
|
+
"0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F 2>&1"
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
# OxaChain
|
|
32
|
+
print("\n===== OXACHAIN L1 =====")
|
|
33
|
+
ec, out, err = run(
|
|
34
|
+
"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
|
|
35
|
+
"forge create src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
|
|
36
|
+
"--rpc-url http://43.156.99.215:18545 "
|
|
37
|
+
"--private-key 0x872c3190b82d17b29bb046c9c55a7f7390c7f74bd6d592ba8d211f20f896f28e "
|
|
38
|
+
"--legacy "
|
|
39
|
+
"0xbf5F9db266c8c97E3334466C88597Eb758AfE212 2>&1"
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
c.close()
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import paramiko
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
host = '43.156.78.59'
|
|
5
|
+
user = 'ubuntu'
|
|
6
|
+
password = 'Asdf1234!'
|
|
7
|
+
|
|
8
|
+
client = paramiko.SSHClient()
|
|
9
|
+
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
10
|
+
client.connect(host, username=user, password=password, timeout=15)
|
|
11
|
+
|
|
12
|
+
sftp = client.open_sftp()
|
|
13
|
+
|
|
14
|
+
def run(cmd):
|
|
15
|
+
print(f"> {cmd}")
|
|
16
|
+
stdin, stdout, stderr = client.exec_command(cmd)
|
|
17
|
+
out = stdout.read().decode()
|
|
18
|
+
err = stderr.read().decode()
|
|
19
|
+
ec = stdout.channel.recv_exit_status()
|
|
20
|
+
if out: print(out)
|
|
21
|
+
if err: print("ERR:", err[:400])
|
|
22
|
+
return ec, out, err
|
|
23
|
+
|
|
24
|
+
def upload(local, remote):
|
|
25
|
+
print(f" Upload: {local} -> {remote}")
|
|
26
|
+
try:
|
|
27
|
+
sftp.put(local, remote)
|
|
28
|
+
print(" OK")
|
|
29
|
+
except Exception as e:
|
|
30
|
+
print(f" ERROR: {e}")
|
|
31
|
+
# Ensure remote directory exists
|
|
32
|
+
remote_dir = os.path.dirname(remote).replace('\\', '/')
|
|
33
|
+
try:
|
|
34
|
+
stdin, stdout, stderr = client.exec_command(f"mkdir -p {remote_dir}")
|
|
35
|
+
stdout.channel.recv_exit_status()
|
|
36
|
+
sftp.put(local, remote)
|
|
37
|
+
print(" OK (retry)")
|
|
38
|
+
except Exception as e2:
|
|
39
|
+
print(f" FAILED: {e2}")
|
|
40
|
+
|
|
41
|
+
# First, find the actual agentx-platform structure
|
|
42
|
+
print("=== AgentX Platform structure ===")
|
|
43
|
+
run("ls ~/agentx-platform/ 2>/dev/null")
|
|
44
|
+
run("ls ~/agentx-platform/app/ 2>/dev/null | head -20")
|
|
45
|
+
run("ls ~/agentx-platform/app/user/chat/ 2>/dev/null")
|
|
46
|
+
run("ls ~/agentx-platform/components/ 2>/dev/null | head -10")
|
|
47
|
+
run("ls ~/agentx-platform/hooks/ 2>/dev/null")
|
|
48
|
+
run("cat ~/agentx-platform/.env.local 2>/dev/null | grep GATEWAY || echo 'No GATEWAY in .env.local'")
|
|
49
|
+
run("cat ~/agentx-platform/.env.production 2>/dev/null | grep GATEWAY || echo 'No GATEWAY in .env.production'")
|
|
50
|
+
|
|
51
|
+
# Upload new files
|
|
52
|
+
source_dir = r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\frontend'
|
|
53
|
+
target_dir = '/home/ubuntu/agentx-platform'
|
|
54
|
+
|
|
55
|
+
print("\n=== Uploading new/updated files ===")
|
|
56
|
+
|
|
57
|
+
# 1. Chat page
|
|
58
|
+
upload(
|
|
59
|
+
os.path.join(source_dir, 'app', 'user', 'chat', '[agentId]', 'page.tsx'),
|
|
60
|
+
os.path.join(target_dir, 'app', 'user', 'chat', '[agentId]', 'page.tsx')
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# 2. Gateway auth hook
|
|
64
|
+
upload(
|
|
65
|
+
os.path.join(source_dir, 'hooks', 'useGatewayAuth.ts'),
|
|
66
|
+
os.path.join(target_dir, 'hooks', 'useGatewayAuth.ts')
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# 3. ToolCallBubble component
|
|
70
|
+
upload(
|
|
71
|
+
os.path.join(source_dir, 'components', 'chat', 'ToolCallBubble.tsx'),
|
|
72
|
+
os.path.join(target_dir, 'components', 'chat', 'ToolCallBubble.tsx')
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
# 4. Updated .env.production
|
|
76
|
+
upload(
|
|
77
|
+
os.path.join(source_dir, '.env.production'),
|
|
78
|
+
os.path.join(target_dir, '.env.production')
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
sftp.close()
|
|
82
|
+
|
|
83
|
+
# Also update .env.local with gateway URL
|
|
84
|
+
print("\n=== Updating .env.local with gateway URL ===")
|
|
85
|
+
run("cd ~/agentx-platform && grep -q 'AGENTX_GATEWAY_URL' .env.local 2>/dev/null && echo 'Already set' || echo 'NEXT_PUBLIC_AGENTX_GATEWAY_URL=http://101.33.109.117:3090' >> .env.local")
|
|
86
|
+
run("cat ~/agentx-platform/.env.local 2>/dev/null | grep GATEWAY")
|
|
87
|
+
|
|
88
|
+
# Rebuild and restart
|
|
89
|
+
print("\n=== Rebuilding frontend ===")
|
|
90
|
+
run("cd ~/agentx-platform && npm install --production 2>&1 | tail -5")
|
|
91
|
+
run("cd ~/agentx-platform && npx next build 2>&1 | tail -20")
|
|
92
|
+
|
|
93
|
+
# Find and restart the next process
|
|
94
|
+
print("\n=== Restarting frontend ===")
|
|
95
|
+
run("ps aux | grep 'next-server' | grep -v grep")
|
|
96
|
+
run("kill $(pgrep -f 'next-server' | head -1) 2>/dev/null; sleep 1")
|
|
97
|
+
run("cd ~/agentx-platform && nohup npx next start -p 8080 > /tmp/next.log 2>&1 &")
|
|
98
|
+
run("sleep 3 && curl -s -o /dev/null -w '%{http_code}' http://localhost:8080/ 2>&1")
|
|
99
|
+
|
|
100
|
+
# Verify
|
|
101
|
+
print("\n=== Final verification ===")
|
|
102
|
+
run("ss -tlnp | grep 8080")
|
|
103
|
+
run("curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://localhost:8080/")
|
|
104
|
+
|
|
105
|
+
client.close()
|
|
106
|
+
print("\n=== Frontend deploy complete ===")
|
|
107
|
+
print("Gateway: http://101.33.109.117:3090")
|
|
108
|
+
print("Frontend: http://43.156.78.59:8080")
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import paramiko, tarfile, os, base64, time
|
|
2
|
+
|
|
3
|
+
HOST = '43.156.225.164'
|
|
4
|
+
PWD = 'Asdf1234!'
|
|
5
|
+
APP = '/home/ubuntu/agentx-gateway'
|
|
6
|
+
|
|
7
|
+
local = r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\gateway'
|
|
8
|
+
tarpath = r'c:\Users\apply\Downloads\code\agentx_gw_mcp.tar.gz'
|
|
9
|
+
|
|
10
|
+
# 1. Tar gateway files
|
|
11
|
+
print("=== Tar ===")
|
|
12
|
+
files_added = []
|
|
13
|
+
with tarfile.open(tarpath, 'w:gz') as tar:
|
|
14
|
+
for root, dirs, files in os.walk(local):
|
|
15
|
+
dirs[:] = [d for d in dirs if d not in ('node_modules','dist','.git')]
|
|
16
|
+
for f in files:
|
|
17
|
+
if f.endswith('.tar.gz') or f in ('.env',): continue
|
|
18
|
+
full = os.path.join(root, f)
|
|
19
|
+
arc = os.path.relpath(full, local).replace('\\', '/')
|
|
20
|
+
tar.add(full, arcname=arc)
|
|
21
|
+
files_added.append(arc)
|
|
22
|
+
print(f"{len(files_added)} files, {os.path.getsize(tarpath)//1024} KB")
|
|
23
|
+
|
|
24
|
+
# 2. Upload
|
|
25
|
+
print("Uploading...")
|
|
26
|
+
t = paramiko.Transport((HOST, 22))
|
|
27
|
+
t.connect(username='ubuntu', password=PWD)
|
|
28
|
+
s = paramiko.SFTPClient.from_transport(t)
|
|
29
|
+
s.put(tarpath, '/tmp/gw_mcp.tar.gz')
|
|
30
|
+
s.close()
|
|
31
|
+
t.close()
|
|
32
|
+
|
|
33
|
+
# 3. Deploy: extract, install, build, start
|
|
34
|
+
c = paramiko.SSHClient()
|
|
35
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
36
|
+
c.connect(HOST, username='ubuntu', password=PWD, timeout=30)
|
|
37
|
+
|
|
38
|
+
# Extract new files
|
|
39
|
+
stdin, stdout, stderr = c.exec_command(f"cd {APP} && tar xzf /tmp/gw_mcp.tar.gz --overwrite && echo 'EXTRACTED' && ls src/routes/mcp.ts")
|
|
40
|
+
print(stdout.read().decode().strip())
|
|
41
|
+
|
|
42
|
+
# Install deps (ethers is already in package.json)
|
|
43
|
+
print("\n=== npm install ===")
|
|
44
|
+
stdin, stdout, stderr = c.exec_command(f"cd {APP} && npm install 2>&1 | tail -5", timeout=120)
|
|
45
|
+
print(stdout.read().decode())
|
|
46
|
+
|
|
47
|
+
# Build
|
|
48
|
+
print("\n=== tsc ===")
|
|
49
|
+
stdin, stdout, stderr = c.exec_command(f"cd {APP} && ./node_modules/.bin/tsc 2>&1 | tail -10; echo 'EXIT='$?", timeout=120)
|
|
50
|
+
out = stdout.read().decode()
|
|
51
|
+
print(out[-500:])
|
|
52
|
+
|
|
53
|
+
# Check dist
|
|
54
|
+
stdin, stdout, stderr = c.exec_command(f"ls {APP}/dist/routes/mcp.js 2>/dev/null && echo BUILD_OK || echo BUILD_FAILED")
|
|
55
|
+
check = stdout.read().decode().strip()
|
|
56
|
+
print(f"Build: {check}")
|
|
57
|
+
|
|
58
|
+
if 'FAILED' in check:
|
|
59
|
+
print("BUILD FAILED")
|
|
60
|
+
c.close()
|
|
61
|
+
exit(1)
|
|
62
|
+
|
|
63
|
+
# Read current .env
|
|
64
|
+
stdin, stdout, stderr = c.exec_command(f"cat {APP}/.env")
|
|
65
|
+
env = stdout.read().decode()
|
|
66
|
+
|
|
67
|
+
# Ensure MCP-related env vars exist
|
|
68
|
+
env_lines = env.split('\n')
|
|
69
|
+
has_rpc = any('RPC_URL' in l for l in env_lines)
|
|
70
|
+
has_chain = any('CHAIN_ID' in l for l in env_lines)
|
|
71
|
+
|
|
72
|
+
if not has_rpc:
|
|
73
|
+
env_lines.append('RPC_URL=https://ethereum-sepolia-rpc.publicnode.com')
|
|
74
|
+
if not has_chain:
|
|
75
|
+
env_lines.append('CHAIN_ID=11155111')
|
|
76
|
+
|
|
77
|
+
new_env = '\n'.join(env_lines)
|
|
78
|
+
b64 = base64.b64encode(new_env.encode()).decode()
|
|
79
|
+
c.exec_command(f"echo '{b64}' | base64 -d > {APP}/.env && echo 'ENV OK'")
|
|
80
|
+
|
|
81
|
+
# Kill old + start
|
|
82
|
+
print("\n=== Restart Gateway ===")
|
|
83
|
+
c.exec_command("fuser -k 3090/tcp 2>/dev/null; sleep 2", timeout=10)
|
|
84
|
+
c.exec_command(f"cd {APP} && nohup node dist/index.js > /tmp/gw.log 2>&1 & disown", timeout=5)
|
|
85
|
+
time.sleep(5)
|
|
86
|
+
|
|
87
|
+
# Verify health
|
|
88
|
+
stdin, stdout, stderr = c.exec_command("ss -tlnp | grep 3090 && echo '---' && curl -s http://localhost:3090/api/v1/health")
|
|
89
|
+
print(stdout.read().decode())
|
|
90
|
+
|
|
91
|
+
# Test MCP tools/list
|
|
92
|
+
print("\n=== Test MCP tools/list ===")
|
|
93
|
+
stdin, stdout, stderr = c.exec_command(
|
|
94
|
+
'curl -s -X POST http://localhost:3090/mcp -H "Content-Type: application/json" '
|
|
95
|
+
'-d \'{"jsonrpc":"2.0","id":1,"method":"tools/list"}\' 2>&1 | python3 -c "import sys,json; d=json.load(sys.stdin); tools=d.get(\"result\",{}).get(\"tools\",[]); print(f\\"Tools: {len(tools)}\\"); [print(f\\" {t[\\"name\\"]}\\") for t in tools[:5]]; print(\\" ...\\" if len(tools)>5 else \\"\\")"'
|
|
96
|
+
)
|
|
97
|
+
print(stdout.read().decode())
|
|
98
|
+
|
|
99
|
+
# Test MCP tools/call (read operation)
|
|
100
|
+
print("\n=== Test MCP tools/call ===")
|
|
101
|
+
stdin, stdout, stderr = c.exec_command(
|
|
102
|
+
'curl -s -X POST http://localhost:3090/mcp -H "Content-Type: application/json" '
|
|
103
|
+
'-d \'{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"agentx_gateway_health","arguments":{}}}\' 2>&1 | python3 -c "import sys,json; d=json.load(sys.stdin); r=d.get(\"result\",{}); c=r.get(\"content\",[]); print(json.loads(c[0][\"text\"]) if c else \\"no content\\" if not d.get(\\"error\\") else d.get(\\"error\\"))"'
|
|
104
|
+
)
|
|
105
|
+
print(stdout.read().decode())
|
|
106
|
+
|
|
107
|
+
c.close()
|
|
108
|
+
print("\n✅ MCP v0.1.0 deployed — http://43.156.225.164:3090/mcp")
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import paramiko
|
|
2
|
+
|
|
3
|
+
pk = '0x872c3190b82d17b29bb046c9c55a7f7390c7f74bd6d592ba8d211f20f896f28e'
|
|
4
|
+
SEP_ARGS = '0x000000000000000000000000e94ad380d3f8d08a7590eda0c84f354a93f96e5f'
|
|
5
|
+
OX_ARGS = '0x000000000000000000000000bf5f9db266c8c97e3334466c88597eb758afe212'
|
|
6
|
+
SEP_RPC = 'https://ethereum-sepolia-rpc.publicnode.com'
|
|
7
|
+
OX_RPC = 'http://43.156.99.215:18545'
|
|
8
|
+
FMT = 'src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry'
|
|
9
|
+
|
|
10
|
+
c = paramiko.SSHClient()
|
|
11
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
12
|
+
c.connect('43.156.78.59', username='ubuntu', password='Asdf1234!', timeout=30)
|
|
13
|
+
|
|
14
|
+
def run(cmd):
|
|
15
|
+
print(f"> {cmd[:120]}")
|
|
16
|
+
stdin, stdout, stderr = c.exec_command(cmd, timeout=600)
|
|
17
|
+
out = stdout.read().decode()
|
|
18
|
+
err = stderr.read().decode()
|
|
19
|
+
ec = stdout.channel.recv_exit_status()
|
|
20
|
+
if out: print(out[-500:])
|
|
21
|
+
if err: print("STDERR:", err[-400:])
|
|
22
|
+
return ec, out, err
|
|
23
|
+
|
|
24
|
+
# Ensure symlink
|
|
25
|
+
run("export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build/src && ln -sf erc8004-interfaces interfaces")
|
|
26
|
+
|
|
27
|
+
# Deploy Sepolia
|
|
28
|
+
print("\n========== SEPOLIA ==========")
|
|
29
|
+
ec, out, err = run(
|
|
30
|
+
f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
|
|
31
|
+
f"forge create {FMT} --rpc-url {SEP_RPC} --private-key {pk} --legacy "
|
|
32
|
+
f"--constructor-args {SEP_ARGS} 2>&1"
|
|
33
|
+
)
|
|
34
|
+
for line in (out + err).split('\n'):
|
|
35
|
+
if any(w in line for w in ['Deployed to', 'Transaction', 'Error', 'Block', 'Gas']):
|
|
36
|
+
print(f" {line.strip()}")
|
|
37
|
+
|
|
38
|
+
# Deploy OxaChain
|
|
39
|
+
print("\n========== OXACHAIN L1 ==========")
|
|
40
|
+
ec, out, err = run(
|
|
41
|
+
f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
|
|
42
|
+
f"forge create {FMT} --rpc-url {OX_RPC} --private-key {pk} --legacy "
|
|
43
|
+
f"--constructor-args {OX_ARGS} 2>&1"
|
|
44
|
+
)
|
|
45
|
+
for line in (out + err).split('\n'):
|
|
46
|
+
if any(w in line for w in ['Deployed to', 'Transaction', 'Error', 'Block', 'Gas']):
|
|
47
|
+
print(f" {line.strip()}")
|
|
48
|
+
|
|
49
|
+
c.close()
|