safehands-pharos 1.1.1 ā 1.2.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/.env.example +26 -0
- package/README.md +311 -350
- package/contracts/RiskRegistry.json +75 -1
- package/contracts/RiskRegistry.sol +29 -1
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +91 -0
- package/dist/cli.js.map +1 -0
- package/dist/demo.d.ts +2 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +172 -0
- package/dist/demo.js.map +1 -0
- package/dist/index.js +181 -169
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +2 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +66 -0
- package/dist/init.js.map +1 -0
- package/dist/lib/constants.d.ts +122 -7
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +139 -13
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/dodoApi.d.ts +14 -0
- package/dist/lib/dodoApi.d.ts.map +1 -1
- package/dist/lib/dodoApi.js +78 -22
- package/dist/lib/dodoApi.js.map +1 -1
- package/dist/lib/http.d.ts +15 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +119 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/pharosClient.d.ts +4 -3
- package/dist/lib/pharosClient.d.ts.map +1 -1
- package/dist/lib/pharosClient.js +8 -5
- package/dist/lib/pharosClient.js.map +1 -1
- package/dist/lib/policy/actionPolicyEngine.d.ts +54 -0
- package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -0
- package/dist/lib/policy/actionPolicyEngine.js +213 -0
- package/dist/lib/policy/actionPolicyEngine.js.map +1 -0
- package/dist/lib/signer/index.d.ts +25 -0
- package/dist/lib/signer/index.d.ts.map +1 -0
- package/dist/lib/signer/index.js +90 -0
- package/dist/lib/signer/index.js.map +1 -0
- package/dist/lib/testDodoLive.d.ts +2 -0
- package/dist/lib/testDodoLive.d.ts.map +1 -0
- package/dist/lib/testDodoLive.js +105 -0
- package/dist/lib/testDodoLive.js.map +1 -0
- package/dist/lib/testLiveSafehands.d.ts +2 -0
- package/dist/lib/testLiveSafehands.d.ts.map +1 -0
- package/dist/lib/testLiveSafehands.js +93 -0
- package/dist/lib/testLiveSafehands.js.map +1 -0
- package/dist/lib/testRpcLive.d.ts +2 -0
- package/dist/lib/testRpcLive.d.ts.map +1 -0
- package/dist/lib/testRpcLive.js +89 -0
- package/dist/lib/testRpcLive.js.map +1 -0
- package/dist/lib/testTools.js +363 -355
- package/dist/lib/testTools.js.map +1 -1
- package/dist/lib/testX402Live.d.ts +2 -0
- package/dist/lib/testX402Live.d.ts.map +1 -0
- package/dist/lib/testX402Live.js +160 -0
- package/dist/lib/testX402Live.js.map +1 -0
- package/dist/lib/toolResponse.d.ts +26 -0
- package/dist/lib/toolResponse.d.ts.map +1 -0
- package/dist/lib/toolResponse.js +54 -0
- package/dist/lib/toolResponse.js.map +1 -0
- package/dist/lib/wallet/index.d.ts +19 -0
- package/dist/lib/wallet/index.d.ts.map +1 -0
- package/dist/lib/wallet/index.js +71 -0
- package/dist/lib/wallet/index.js.map +1 -0
- package/dist/tools/approveToken.d.ts +19 -32
- package/dist/tools/approveToken.d.ts.map +1 -1
- package/dist/tools/approveToken.js +44 -19
- package/dist/tools/approveToken.js.map +1 -1
- package/dist/tools/assessRisk.d.ts +22 -9
- package/dist/tools/assessRisk.d.ts.map +1 -1
- package/dist/tools/assessRisk.js +32 -9
- package/dist/tools/assessRisk.js.map +1 -1
- package/dist/tools/checkAllowance.d.ts +6 -6
- package/dist/tools/checkTokenSecurity.d.ts +9 -16
- package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
- package/dist/tools/checkTokenSecurity.js +17 -22
- package/dist/tools/checkTokenSecurity.js.map +1 -1
- package/dist/tools/createAgentWallet.d.ts +27 -0
- package/dist/tools/createAgentWallet.d.ts.map +1 -0
- package/dist/tools/createAgentWallet.js +60 -0
- package/dist/tools/createAgentWallet.js.map +1 -0
- package/dist/tools/estimateGas.d.ts +31 -21
- package/dist/tools/estimateGas.d.ts.map +1 -1
- package/dist/tools/estimateGas.js +91 -95
- package/dist/tools/estimateGas.js.map +1 -1
- package/dist/tools/executeSwap.d.ts +13 -47
- package/dist/tools/executeSwap.d.ts.map +1 -1
- package/dist/tools/executeSwap.js +69 -46
- package/dist/tools/executeSwap.js.map +1 -1
- package/dist/tools/explainRisk.d.ts +30 -0
- package/dist/tools/explainRisk.d.ts.map +1 -0
- package/dist/tools/explainRisk.js +33 -0
- package/dist/tools/explainRisk.js.map +1 -0
- package/dist/tools/getAgentWallet.d.ts +22 -0
- package/dist/tools/getAgentWallet.d.ts.map +1 -0
- package/dist/tools/getAgentWallet.js +28 -0
- package/dist/tools/getAgentWallet.js.map +1 -0
- package/dist/tools/getAgentWalletBalance.d.ts +12 -0
- package/dist/tools/getAgentWalletBalance.d.ts.map +1 -0
- package/dist/tools/getAgentWalletBalance.js +71 -0
- package/dist/tools/getAgentWalletBalance.js.map +1 -0
- package/dist/tools/getExecutionHistory.d.ts +4 -4
- package/dist/tools/getGasPrice.d.ts +26 -8
- package/dist/tools/getGasPrice.d.ts.map +1 -1
- package/dist/tools/getGasPrice.js +43 -35
- package/dist/tools/getGasPrice.js.map +1 -1
- package/dist/tools/getPoolInfo.d.ts +47 -59
- package/dist/tools/getPoolInfo.d.ts.map +1 -1
- package/dist/tools/getPoolInfo.js +96 -57
- package/dist/tools/getPoolInfo.js.map +1 -1
- package/dist/tools/getTokenPrice.d.ts +95 -9
- package/dist/tools/getTokenPrice.d.ts.map +1 -1
- package/dist/tools/getTokenPrice.js +95 -56
- package/dist/tools/getTokenPrice.js.map +1 -1
- package/dist/tools/getWalletBalance.d.ts +40 -11
- package/dist/tools/getWalletBalance.d.ts.map +1 -1
- package/dist/tools/getWalletBalance.js +64 -47
- package/dist/tools/getWalletBalance.js.map +1 -1
- package/dist/tools/publishRiskScore.d.ts +12 -22
- package/dist/tools/publishRiskScore.d.ts.map +1 -1
- package/dist/tools/publishRiskScore.js +34 -18
- package/dist/tools/publishRiskScore.js.map +1 -1
- package/dist/tools/queryRiskRegistry.d.ts +3 -3
- package/dist/tools/safehandsPreflightCheck.d.ts +78 -0
- package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -0
- package/dist/tools/safehandsPreflightCheck.js +48 -0
- package/dist/tools/safehandsPreflightCheck.js.map +1 -0
- package/dist/tools/safehandsRiskReport.d.ts +82 -0
- package/dist/tools/safehandsRiskReport.d.ts.map +1 -0
- package/dist/tools/safehandsRiskReport.js +29 -0
- package/dist/tools/safehandsRiskReport.js.map +1 -0
- package/dist/tools/safehandsSafeExecute.d.ts +21 -0
- package/dist/tools/safehandsSafeExecute.d.ts.map +1 -0
- package/dist/tools/safehandsSafeExecute.js +76 -0
- package/dist/tools/safehandsSafeExecute.js.map +1 -0
- package/dist/tools/safehandsWalletHealth.d.ts +15 -0
- package/dist/tools/safehandsWalletHealth.d.ts.map +1 -0
- package/dist/tools/safehandsWalletHealth.js +104 -0
- package/dist/tools/safehandsWalletHealth.js.map +1 -0
- package/dist/tools/safehandsX402Preflight.d.ts +27 -0
- package/dist/tools/safehandsX402Preflight.d.ts.map +1 -0
- package/dist/tools/safehandsX402Preflight.js +66 -0
- package/dist/tools/safehandsX402Preflight.js.map +1 -0
- package/dist/tools/sendPayment.d.ts +13 -53
- package/dist/tools/sendPayment.d.ts.map +1 -1
- package/dist/tools/sendPayment.js +55 -48
- package/dist/tools/sendPayment.js.map +1 -1
- package/dist/tools/simulateTransaction.d.ts +4 -4
- package/dist/tools/tokenRegistryStatus.d.ts +27 -0
- package/dist/tools/tokenRegistryStatus.d.ts.map +1 -0
- package/dist/tools/tokenRegistryStatus.js +97 -0
- package/dist/tools/tokenRegistryStatus.js.map +1 -0
- package/dist/tools/x402PayAndFetch.d.ts +40 -22
- package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
- package/dist/tools/x402PayAndFetch.js +115 -45
- package/dist/tools/x402PayAndFetch.js.map +1 -1
- package/dist/x402Server.js +149 -115
- package/dist/x402Server.js.map +1 -1
- package/examples/pharos-skill-engine/SKILL.safehands.md +85 -0
- package/examples/pharos-skill-engine/assets/safehands/example-actions.json +49 -0
- package/examples/pharos-skill-engine/assets/safehands/policy-defaults.json +11 -0
- package/examples/pharos-skill-engine/references/safehands.md +345 -0
- package/examples/scenario-hack.ts +38 -0
- package/package.json +19 -5
- package/skill/SKILL.md +127 -0
- package/skill/assets/safehands/example-actions.json +49 -0
- package/skill/assets/safehands/policy-defaults.json +11 -0
- package/skill/references/safehands.md +345 -0
- package/.agents/skill/safehands/SKILL.md +0 -200
- package/.agents/skill/safehands/assets/networks.json +0 -24
- package/.agents/skill/safehands/assets/tokens.json +0 -60
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"abi": [
|
|
3
|
+
{
|
|
4
|
+
"inputs": [],
|
|
5
|
+
"stateMutability": "nonpayable",
|
|
6
|
+
"type": "constructor"
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"anonymous": false,
|
|
10
|
+
"inputs": [
|
|
11
|
+
{
|
|
12
|
+
"indexed": true,
|
|
13
|
+
"internalType": "address",
|
|
14
|
+
"name": "agent",
|
|
15
|
+
"type": "address"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"indexed": false,
|
|
19
|
+
"internalType": "bool",
|
|
20
|
+
"name": "status",
|
|
21
|
+
"type": "bool"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"name": "AgentAuthorized",
|
|
25
|
+
"type": "event"
|
|
26
|
+
},
|
|
3
27
|
{
|
|
4
28
|
"anonymous": false,
|
|
5
29
|
"inputs": [
|
|
@@ -31,6 +55,38 @@
|
|
|
31
55
|
"name": "RiskPublished",
|
|
32
56
|
"type": "event"
|
|
33
57
|
},
|
|
58
|
+
{
|
|
59
|
+
"inputs": [
|
|
60
|
+
{
|
|
61
|
+
"internalType": "address",
|
|
62
|
+
"name": "",
|
|
63
|
+
"type": "address"
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
"name": "authorizedAgents",
|
|
67
|
+
"outputs": [
|
|
68
|
+
{
|
|
69
|
+
"internalType": "bool",
|
|
70
|
+
"name": "",
|
|
71
|
+
"type": "bool"
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
"stateMutability": "view",
|
|
75
|
+
"type": "function"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"inputs": [],
|
|
79
|
+
"name": "owner",
|
|
80
|
+
"outputs": [
|
|
81
|
+
{
|
|
82
|
+
"internalType": "address",
|
|
83
|
+
"name": "",
|
|
84
|
+
"type": "address"
|
|
85
|
+
}
|
|
86
|
+
],
|
|
87
|
+
"stateMutability": "view",
|
|
88
|
+
"type": "function"
|
|
89
|
+
},
|
|
34
90
|
{
|
|
35
91
|
"inputs": [
|
|
36
92
|
{
|
|
@@ -143,7 +199,25 @@
|
|
|
143
199
|
],
|
|
144
200
|
"stateMutability": "view",
|
|
145
201
|
"type": "function"
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"inputs": [
|
|
205
|
+
{
|
|
206
|
+
"internalType": "address",
|
|
207
|
+
"name": "agent",
|
|
208
|
+
"type": "address"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"internalType": "bool",
|
|
212
|
+
"name": "status",
|
|
213
|
+
"type": "bool"
|
|
214
|
+
}
|
|
215
|
+
],
|
|
216
|
+
"name": "setAuthorizedAgent",
|
|
217
|
+
"outputs": [],
|
|
218
|
+
"stateMutability": "nonpayable",
|
|
219
|
+
"type": "function"
|
|
146
220
|
}
|
|
147
221
|
],
|
|
148
|
-
"bytecode": "
|
|
222
|
+
"bytecode": "0x6080604052348015600e575f5ffd5b505f80546001600160a01b0319163390811782558152600160208190526040909120805460ff19169091179055610acd806100485f395ff3fe608060405234801561000f575f5ffd5b5060043610610060575f3560e01c8063038defd7146100645780630e273811146100915780638da5cb5b146100a6578063cf78537f146100d0578063d4fc9fc6146100e3578063efd7606514610103575b5f5ffd5b6100776100723660046106dd565b610135565b60405161008895949392919061072b565b60405180910390f35b6100a461009f366004610778565b610279565b005b5f546100b8906001600160a01b031681565b6040516001600160a01b039091168152602001610088565b6100a46100de3660046107f6565b610343565b6100f66100f13660046106dd565b61051a565b604051610088919061087f565b6101256101113660046106dd565b60016020525f908152604090205460ff1681565b6040519015158152602001610088565b60026020525f908152604090208054600182018054919291610156906108ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610182906108ed565b80156101cd5780601f106101a4576101008083540402835291602001916101cd565b820191905f5260205f20905b8154815290600101906020018083116101b057829003601f168201915b5050505050908060020180546101e2906108ed565b80601f016020809104026020016040519081016040528092919081815260200182805461020e906108ed565b80156102595780601f1061023057610100808354040283529160200191610259565b820191905f5260205f20905b81548152906001019060200180831161023c57829003601f168201915b5050505060038301546004909301549192916001600160a01b0316905085565b5f546001600160a01b031633146102e55760405162461bcd60e51b815260206004820152602560248201527f5269736b52656769737472793a2063616c6c6572206973206e6f74207468652060448201526437bbb732b960d91b60648201526084015b60405180910390fd5b6001600160a01b0382165f81815260016020908152604091829020805460ff191685151590811790915591519182527f1b06338d0edf2ba8ccee31e466ab37b376418209af6a85c55c51e89a51e33bde910160405180910390a25050565b335f9081526001602052604090205460ff168061036957505f546001600160a01b031633145b6103cd5760405162461bcd60e51b815260206004820152602f60248201527f5269736b52656769737472793a2063616c6c6572206973206e6f7420616e206160448201526e1d5d1a1bdc9a5e9959081859d95b9d608a1b60648201526084016102dc565b6040518060a0016040528086815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250604080516020601f8601819004810282018101909252848152918101919085908590819084018382808284375f920182905250938552505042602080850191909152336040948501526001600160a01b038b1683526002815292909120835181559183015160018301915061048b9082610990565b50604082015160028201906104a09082610990565b5060608201516003820155608090910151600490910180546001600160a01b0319166001600160a01b03928316179055604051908716907ff1540e034908b7aedb3f7cc639f04615bf51f301d55b49f7b786fbfc97ba144e9061050a908890889088903390610a4f565b60405180910390a2505050505050565b6105526040518060a001604052805f815260200160608152602001606081526020015f81526020015f6001600160a01b031681525090565b6001600160a01b0382165f90815260026020908152604091829020825160a0810190935280548352600181018054919284019161058e906108ed565b80601f01602080910402602001604051908101604052809291908181526020018280546105ba906108ed565b80156106055780601f106105dc57610100808354040283529160200191610605565b820191905f5260205f20905b8154815290600101906020018083116105e857829003601f168201915b5050505050815260200160028201805461061e906108ed565b80601f016020809104026020016040519081016040528092919081815260200182805461064a906108ed565b80156106955780601f1061066c57610100808354040283529160200191610695565b820191905f5260205f20905b81548152906001019060200180831161067857829003601f168201915b5050509183525050600382015460208201526004909101546001600160a01b031660409091015292915050565b80356001600160a01b03811681146106d8575f5ffd5b919050565b5f602082840312156106ed575f5ffd5b6106f6826106c2565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b85815260a060208201525f61074360a08301876106fd565b828103604084015261075581876106fd565b606084019590955250506001600160a01b03919091166080909101529392505050565b5f5f60408385031215610789575f5ffd5b610792836106c2565b9150602083013580151581146107a6575f5ffd5b809150509250929050565b5f5f83601f8401126107c1575f5ffd5b50813567ffffffffffffffff8111156107d8575f5ffd5b6020830191508360208285010111156107ef575f5ffd5b9250929050565b5f5f5f5f5f5f6080878903121561080b575f5ffd5b610814876106c2565b955060208701359450604087013567ffffffffffffffff811115610836575f5ffd5b61084289828a016107b1565b909550935050606087013567ffffffffffffffff811115610861575f5ffd5b61086d89828a016107b1565b979a9699509497509295939492505050565b60208152815160208201525f602083015160a060408401526108a460c08401826106fd565b90506040840151601f198483030160608501526108c182826106fd565b6060860151608086810191909152909501516001600160a01b031660a090940193909352509192915050565b600181811c9082168061090157607f821691505b60208210810361091f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b601f82111561098b578282111561098b57805f5260205f20601f840160051c602085101561096457505f5b90810190601f840160051c035f5b81811015610987575f83820155600101610972565b5050505b505050565b815167ffffffffffffffff8111156109aa576109aa610925565b6109be816109b884546108ed565b84610939565b6020601f8211600181146109f0575f83156109d95750848201515b5f19600385901b1c1916600184901b178455610a48565b5f84815260208120601f198516915b82811015610a1f57878501518255602094850194600190920191016109ff565b5084821015610a3c57868401515f19600387901b60f8161c191681555b505060018360011b0184555b5050505050565b84815260606020820152826060820152828460808301375f8184016080908101919091526001600160a01b03929092166040820152601f909201601f1916909101019291505056fea264697066735822122080db3ef6d92b3c79716ffa2db8ddca83c100456ec5cabfa8261d6c4e5c8dac9464736f6c63430008230033"
|
|
149
223
|
}
|
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
pragma solidity ^0.8.20;
|
|
3
3
|
|
|
4
4
|
contract RiskRegistry {
|
|
5
|
+
address public owner;
|
|
6
|
+
|
|
7
|
+
// Mapping of authorized AI Agent addresses allowed to publish scores
|
|
8
|
+
mapping(address => bool) public authorizedAgents;
|
|
9
|
+
|
|
5
10
|
struct RiskRecord {
|
|
6
11
|
uint256 score;
|
|
7
12
|
string riskLevel;
|
|
@@ -13,13 +18,36 @@ contract RiskRegistry {
|
|
|
13
18
|
mapping(address => RiskRecord) public registry;
|
|
14
19
|
|
|
15
20
|
event RiskPublished(address indexed wallet, uint256 score, string riskLevel, address assessedBy);
|
|
21
|
+
event AgentAuthorized(address indexed agent, bool status);
|
|
22
|
+
|
|
23
|
+
modifier onlyOwner() {
|
|
24
|
+
require(msg.sender == owner, "RiskRegistry: caller is not the owner");
|
|
25
|
+
_;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
modifier onlyAuthorized() {
|
|
29
|
+
require(authorizedAgents[msg.sender] || msg.sender == owner, "RiskRegistry: caller is not an authorized agent");
|
|
30
|
+
_;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
constructor() {
|
|
34
|
+
owner = msg.sender;
|
|
35
|
+
authorizedAgents[msg.sender] = true; // Deployer is automatically authorized
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Owner can authorize other AI Agents to publish to the registry
|
|
39
|
+
function setAuthorizedAgent(address agent, bool status) external onlyOwner {
|
|
40
|
+
authorizedAgents[agent] = status;
|
|
41
|
+
emit AgentAuthorized(agent, status);
|
|
42
|
+
}
|
|
16
43
|
|
|
44
|
+
// SECURITY UPDATE: Only authorized agents can publish risk scores now
|
|
17
45
|
function publish(
|
|
18
46
|
address wallet,
|
|
19
47
|
uint256 score,
|
|
20
48
|
string calldata riskLevel,
|
|
21
49
|
string calldata recommendation
|
|
22
|
-
) external {
|
|
50
|
+
) external onlyAuthorized {
|
|
23
51
|
registry[wallet] = RiskRecord(score, riskLevel, recommendation, block.timestamp, msg.sender);
|
|
24
52
|
emit RiskPublished(wallet, score, riskLevel, msg.sender);
|
|
25
53
|
}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ToolResponse } from "./lib/toolResponse.js";
|
|
2
|
+
export type SkillCliToolName = "safehands_preflight_check" | "safehands_x402_preflight" | "safehands_wallet_health" | "token_registry_status" | "explain_risk" | "safehands_risk_report" | "safehands_safe_execute";
|
|
3
|
+
export declare function getSkillCliToolNames(): string[];
|
|
4
|
+
export declare function invokeSkillCliTool(toolName: string, input: unknown): Promise<ToolResponse<unknown>>;
|
|
5
|
+
export declare function runSkillCli(argv: string[]): Promise<number>;
|
|
6
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AASpE,MAAM,MAAM,gBAAgB,GACxB,2BAA2B,GAC3B,0BAA0B,GAC1B,yBAAyB,GACzB,uBAAuB,GACvB,cAAc,GACd,uBAAuB,GACvB,wBAAwB,CAAC;AAyC7B,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAuBzG;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BjE"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// āāā SafeHands Skill Engine CLI Adapter āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
2
|
+
// Terminal entrypoint used by Pharos Skill Engine reference files.
|
|
3
|
+
// It calls the same tool handlers as MCP registration and prints the
|
|
4
|
+
// standard SafeHands response envelope as JSON.
|
|
5
|
+
// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
6
|
+
import { fail, ok } from "./lib/toolResponse.js";
|
|
7
|
+
import { handleSafeHandsPreflightCheck } from "./tools/safehandsPreflightCheck.js";
|
|
8
|
+
import { handleSafeHandsX402Preflight } from "./tools/safehandsX402Preflight.js";
|
|
9
|
+
import { handleSafeHandsWalletHealth } from "./tools/safehandsWalletHealth.js";
|
|
10
|
+
import { handleTokenRegistryStatus } from "./tools/tokenRegistryStatus.js";
|
|
11
|
+
import { handleExplainRisk } from "./tools/explainRisk.js";
|
|
12
|
+
import { handleSafeHandsRiskReport } from "./tools/safehandsRiskReport.js";
|
|
13
|
+
import { handleSafeHandsSafeExecute } from "./tools/safehandsSafeExecute.js";
|
|
14
|
+
const SKILL_CLI_TOOLS = {
|
|
15
|
+
safehands_preflight_check: handleSafeHandsPreflightCheck,
|
|
16
|
+
safehands_x402_preflight: handleSafeHandsX402Preflight,
|
|
17
|
+
safehands_wallet_health: handleSafeHandsWalletHealth,
|
|
18
|
+
token_registry_status: handleTokenRegistryStatus,
|
|
19
|
+
explain_risk: handleExplainRisk,
|
|
20
|
+
safehands_risk_report: handleSafeHandsRiskReport,
|
|
21
|
+
safehands_safe_execute: handleSafeHandsSafeExecute,
|
|
22
|
+
};
|
|
23
|
+
function isStructuredResponse(value) {
|
|
24
|
+
return !!value && typeof value === "object" && "success" in value && "data" in value && "error" in value && "timestamp" in value;
|
|
25
|
+
}
|
|
26
|
+
function printJson(response) {
|
|
27
|
+
process.stdout.write(`${JSON.stringify(response, null, 2)}\n`);
|
|
28
|
+
}
|
|
29
|
+
function usage() {
|
|
30
|
+
const tools = Object.keys(SKILL_CLI_TOOLS).sort().join(", ");
|
|
31
|
+
return [
|
|
32
|
+
"Usage: npx safehands-pharos skill <tool_name> --input-json '<json>'",
|
|
33
|
+
"",
|
|
34
|
+
`Supported Skill Engine tools: ${tools}`,
|
|
35
|
+
"",
|
|
36
|
+
"Example:",
|
|
37
|
+
" npx safehands-pharos skill safehands_preflight_check --input-json '{\"actionType\":\"approve_token\",\"chainId\":688689,\"amount\":\"1\"}'",
|
|
38
|
+
].join("\n");
|
|
39
|
+
}
|
|
40
|
+
function readInputJsonArg(argv) {
|
|
41
|
+
const positional = argv.indexOf("--input-json");
|
|
42
|
+
if (positional >= 0)
|
|
43
|
+
return argv[positional + 1] ?? null;
|
|
44
|
+
const prefixed = argv.find((arg) => arg.startsWith("--input-json="));
|
|
45
|
+
return prefixed ? prefixed.slice("--input-json=".length) : null;
|
|
46
|
+
}
|
|
47
|
+
export function getSkillCliToolNames() {
|
|
48
|
+
return Object.keys(SKILL_CLI_TOOLS).sort();
|
|
49
|
+
}
|
|
50
|
+
export async function invokeSkillCliTool(toolName, input) {
|
|
51
|
+
const handler = SKILL_CLI_TOOLS[toolName];
|
|
52
|
+
if (!handler) {
|
|
53
|
+
return fail("UNKNOWN_SKILL_TOOL", `Unknown SafeHands Skill Engine tool: ${toolName}. Supported tools: ${getSkillCliToolNames().join(", ")}`, false, "safehands_cli");
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const result = await handler(input);
|
|
57
|
+
if (isStructuredResponse(result))
|
|
58
|
+
return result;
|
|
59
|
+
return ok(result);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
return fail("TOOL_EXECUTION_FAILED", err instanceof Error ? err.message : String(err), false, toolName);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export async function runSkillCli(argv) {
|
|
66
|
+
const [toolName] = argv;
|
|
67
|
+
if (!toolName || toolName === "--help" || toolName === "-h") {
|
|
68
|
+
printJson(fail("CLI_USAGE_ERROR", usage(), false, "safehands_cli"));
|
|
69
|
+
return 2;
|
|
70
|
+
}
|
|
71
|
+
if (!SKILL_CLI_TOOLS[toolName]) {
|
|
72
|
+
printJson(await invokeSkillCliTool(toolName, {}));
|
|
73
|
+
return 2;
|
|
74
|
+
}
|
|
75
|
+
const rawJson = readInputJsonArg(argv.slice(1));
|
|
76
|
+
if (rawJson === null) {
|
|
77
|
+
printJson(fail("MISSING_INPUT_JSON", "Missing required --input-json '<json>' argument.", false, "safehands_cli"));
|
|
78
|
+
return 2;
|
|
79
|
+
}
|
|
80
|
+
let input;
|
|
81
|
+
try {
|
|
82
|
+
input = JSON.parse(rawJson);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
printJson(fail("INVALID_INPUT_JSON", err instanceof Error ? err.message : String(err), false, "safehands_cli"));
|
|
86
|
+
return 2;
|
|
87
|
+
}
|
|
88
|
+
printJson(await invokeSkillCliTool(toolName, input));
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/demo.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":"AA4EA,wBAAsB,OAAO,kBA4G5B"}
|
package/dist/demo.js
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// āāā SafeHands Deterministic Hackathon Demo āāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
2
|
+
// Non-destructive demo for judges and reviewers. It uses offline/sample-safe
|
|
3
|
+
// paths and a local HTTP server only when explicitly allowed in-process.
|
|
4
|
+
// No real transaction is broadcast.
|
|
5
|
+
// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
6
|
+
import express from "express";
|
|
7
|
+
import { handleSafeHandsWalletHealth } from "./tools/safehandsWalletHealth.js";
|
|
8
|
+
import { handleSafeHandsPreflightCheck } from "./tools/safehandsPreflightCheck.js";
|
|
9
|
+
import { handleTokenRegistryStatus } from "./tools/tokenRegistryStatus.js";
|
|
10
|
+
import { handleSafeHandsX402Preflight } from "./tools/safehandsX402Preflight.js";
|
|
11
|
+
import { handleX402PayAndFetch } from "./tools/x402PayAndFetch.js";
|
|
12
|
+
import { handleSendPayment } from "./tools/sendPayment.js";
|
|
13
|
+
import { handleExplainRisk } from "./tools/explainRisk.js";
|
|
14
|
+
import { CHAIN_ID, PHAROS_ENVIRONMENT, USDC_ADDRESS } from "./lib/constants.js";
|
|
15
|
+
const RECIPIENT = "0x0000000000000000000000000000000000000001";
|
|
16
|
+
function section(title) {
|
|
17
|
+
console.log(`\n${"ā".repeat(78)}`);
|
|
18
|
+
console.log(` ${title}`);
|
|
19
|
+
console.log("ā".repeat(78));
|
|
20
|
+
}
|
|
21
|
+
function print(label, value) {
|
|
22
|
+
console.log(`\n${label}`);
|
|
23
|
+
console.log(JSON.stringify(value, null, 2));
|
|
24
|
+
}
|
|
25
|
+
function setEnv(key, value) {
|
|
26
|
+
const previous = process.env[key];
|
|
27
|
+
if (value === undefined)
|
|
28
|
+
delete process.env[key];
|
|
29
|
+
else
|
|
30
|
+
process.env[key] = value;
|
|
31
|
+
return () => {
|
|
32
|
+
if (previous === undefined)
|
|
33
|
+
delete process.env[key];
|
|
34
|
+
else
|
|
35
|
+
process.env[key] = previous;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function withLocalX402DemoServer(handler) {
|
|
39
|
+
const app = express();
|
|
40
|
+
app.get("/supported", (_req, res) => {
|
|
41
|
+
res.json({
|
|
42
|
+
ok: true,
|
|
43
|
+
demo: true,
|
|
44
|
+
paymentRequired: false,
|
|
45
|
+
endpoints: ["/supported", "/paid"],
|
|
46
|
+
network: `eip155:${CHAIN_ID}`,
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
app.get("/paid", (_req, res) => {
|
|
50
|
+
res.status(402).json({
|
|
51
|
+
error: "Payment Required",
|
|
52
|
+
demo: true,
|
|
53
|
+
price: "0.001",
|
|
54
|
+
asset: USDC_ADDRESS,
|
|
55
|
+
network: `eip155:${CHAIN_ID}`,
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
const server = await new Promise((resolve) => {
|
|
59
|
+
const instance = app.listen(0, "127.0.0.1", () => resolve(instance));
|
|
60
|
+
});
|
|
61
|
+
try {
|
|
62
|
+
const address = server.address();
|
|
63
|
+
if (!address || typeof address === "string")
|
|
64
|
+
throw new Error("Failed to open local demo server");
|
|
65
|
+
return await handler(`http://127.0.0.1:${address.port}`);
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
if ("closeAllConnections" in server)
|
|
69
|
+
server.closeAllConnections();
|
|
70
|
+
await new Promise((resolve, reject) => server.close((err) => (err ? reject(err) : resolve())));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export async function runDemo() {
|
|
74
|
+
const restoreWalletMode = setEnv("WALLET_MODE", process.env.WALLET_MODE || "none");
|
|
75
|
+
const restoreWrite = setEnv("WRITE_TOOLS_ENABLED", "false");
|
|
76
|
+
const restorePrivateKey = setEnv("PRIVATE_KEY", undefined);
|
|
77
|
+
const restoreX402Signer = setEnv("X402_SIGNER_PRIVATE_KEY", undefined);
|
|
78
|
+
try {
|
|
79
|
+
console.log("\nš”ļø SafeHands-Pharos Deterministic Demo");
|
|
80
|
+
console.log(` Environment: ${PHAROS_ENVIRONMENT}`);
|
|
81
|
+
console.log(` Chain ID: ${CHAIN_ID}`);
|
|
82
|
+
console.log(" Mode: non-destructive demo, no real transactions broadcast");
|
|
83
|
+
section("1. Wallet Health");
|
|
84
|
+
print("safehands_wallet_health", await handleSafeHandsWalletHealth({}));
|
|
85
|
+
section("2. Safe Payment Preflight: ALLOW");
|
|
86
|
+
print("safehands_preflight_check", await handleSafeHandsPreflightCheck({
|
|
87
|
+
actionType: "send_payment",
|
|
88
|
+
chainId: CHAIN_ID,
|
|
89
|
+
isMainnet: false,
|
|
90
|
+
amount: "0.001",
|
|
91
|
+
amountUnit: "PHRS",
|
|
92
|
+
recipient: RECIPIENT,
|
|
93
|
+
}));
|
|
94
|
+
section("3. Unlimited Approval Preflight: BLOCK");
|
|
95
|
+
const blockedApproval = await handleSafeHandsPreflightCheck({
|
|
96
|
+
actionType: "approve_token",
|
|
97
|
+
chainId: CHAIN_ID,
|
|
98
|
+
isMainnet: false,
|
|
99
|
+
approvalAmount: "max",
|
|
100
|
+
spender: RECIPIENT,
|
|
101
|
+
});
|
|
102
|
+
print("safehands_preflight_check", blockedApproval);
|
|
103
|
+
section("4. Token Registry Status");
|
|
104
|
+
print("token_registry_status", await handleTokenRegistryStatus({ tokenAddress: USDC_ADDRESS }));
|
|
105
|
+
section("5. x402 Preflight Without Private Key");
|
|
106
|
+
await withLocalX402DemoServer(async (baseUrl) => {
|
|
107
|
+
const restoreLocal = setEnv("ALLOW_LOCAL_X402_FETCH", "true");
|
|
108
|
+
try {
|
|
109
|
+
print("safehands_x402_preflight", await handleSafeHandsX402Preflight({
|
|
110
|
+
url: `${baseUrl}/paid`,
|
|
111
|
+
paymentAmountUsdc: "0.001",
|
|
112
|
+
probeEndpoint: false,
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
restoreLocal();
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
section("6. x402 /supported Free Endpoint Without Private Key");
|
|
120
|
+
await withLocalX402DemoServer(async (baseUrl) => {
|
|
121
|
+
const restoreLocal = setEnv("ALLOW_LOCAL_X402_FETCH", "true");
|
|
122
|
+
try {
|
|
123
|
+
print("x402_pay_and_fetch free endpoint", await handleX402PayAndFetch({ url: `${baseUrl}/supported` }));
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
restoreLocal();
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
section("7. x402 Paid Endpoint Without Signer");
|
|
130
|
+
await withLocalX402DemoServer(async (baseUrl) => {
|
|
131
|
+
const restoreLocal = setEnv("ALLOW_LOCAL_X402_FETCH", "true");
|
|
132
|
+
try {
|
|
133
|
+
print("x402_pay_and_fetch paid endpoint", await handleX402PayAndFetch({ url: `${baseUrl}/paid`, maxPaymentUsdc: "0.001" }));
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
restoreLocal();
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
section("8. SSRF_BLOCKED");
|
|
140
|
+
const restoreLocalBlocked = setEnv("ALLOW_LOCAL_X402_FETCH", undefined);
|
|
141
|
+
try {
|
|
142
|
+
print("safehands_x402_preflight localhost blocked", await handleSafeHandsX402Preflight({ url: "http://127.0.0.1:4021/supported" }));
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
restoreLocalBlocked();
|
|
146
|
+
}
|
|
147
|
+
section("9. WRITE_TOOLS_DISABLED");
|
|
148
|
+
print("send_payment guarded", await handleSendPayment({ toAddress: RECIPIENT, amount: "0.001" }));
|
|
149
|
+
section("10. Human-Readable Risk Explanation");
|
|
150
|
+
print("explain_risk", await handleExplainRisk({
|
|
151
|
+
decision: "BLOCK",
|
|
152
|
+
riskLevel: "HIGH",
|
|
153
|
+
reasons: ["Unlimited approval requested"],
|
|
154
|
+
requiredActions: ["Use a limited approval amount before approving a spender"],
|
|
155
|
+
}));
|
|
156
|
+
section("Demo Complete");
|
|
157
|
+
console.log("SafeHands demonstrated wallet health, ALLOW/BLOCK policy, token registry, x402 safety, SSRF blocking, write-tool guardrails, and explainable risk output.");
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
restoreWalletMode();
|
|
161
|
+
restoreWrite();
|
|
162
|
+
restorePrivateKey();
|
|
163
|
+
restoreX402Signer();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
167
|
+
runDemo().catch((err) => {
|
|
168
|
+
console.error("Demo error:", err instanceof Error ? err.message : String(err));
|
|
169
|
+
process.exit(1);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=demo.js.map
|
package/dist/demo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":"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"}
|