@xpr-agents/openclaw 0.8.2 → 0.8.4
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/README.md +1 -1
- package/dist/cli-session.d.ts +2 -0
- package/dist/cli-session.d.ts.map +1 -1
- package/dist/cli-session.js +5 -1
- package/dist/cli-session.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/session.d.ts +2 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +1 -1
- package/dist/session.js.map +1 -1
- package/dist/util/transfer-cap.d.ts +32 -0
- package/dist/util/transfer-cap.d.ts.map +1 -0
- package/dist/util/transfer-cap.js +87 -0
- package/dist/util/transfer-cap.js.map +1 -0
- package/package.json +1 -1
- package/skills/blockart/dist/index.js +2 -2
- package/skills/blockart/src/index.ts +2 -2
- package/skills/defi/dist/index.js +4 -2
- package/skills/defi/src/index.ts +4 -2
- package/skills/nft/dist/index.js +4 -2
- package/skills/nft/src/index.ts +4 -2
- package/skills/smart-contracts/SKILL.md +3 -3
- package/skills/smart-contracts/dist/index.js +5 -4
- package/skills/smart-contracts/src/index.ts +5 -4
package/README.md
CHANGED
|
@@ -344,7 +344,7 @@ XPR_NETWORK=mainnet # mainnet | testnet (default: mainnet
|
|
|
344
344
|
```env
|
|
345
345
|
# RPC endpoint. Auto-selected from XPR_NETWORK when unset — leave blank
|
|
346
346
|
# unless you run your own node.
|
|
347
|
-
# XPR_RPC_ENDPOINT=https://
|
|
347
|
+
# XPR_RPC_ENDPOINT=https://api-xprnetwork-main.saltant.io # mainnet
|
|
348
348
|
# XPR_RPC_ENDPOINT=https://tn1.protonnz.com # testnet
|
|
349
349
|
|
|
350
350
|
# Indexer URL. 4 tools (xpr_search_agents, xpr_get_events, xpr_get_stats,
|
package/dist/cli-session.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ export interface CliSessionOptions {
|
|
|
23
23
|
account: string;
|
|
24
24
|
permission?: string;
|
|
25
25
|
rpcEndpoint?: string;
|
|
26
|
+
/** XPR transfer cap in smallest units; defaults to MAX_TRANSFER_AMOUNT env (see util/transfer-cap). */
|
|
27
|
+
maxTransferAmount?: number;
|
|
26
28
|
}
|
|
27
29
|
/**
|
|
28
30
|
* Create a ProtonSession (SDK shape) backed by the proton CLI.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-session.d.ts","sourceRoot":"","sources":["../src/cli-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-session.d.ts","sourceRoot":"","sources":["../src/cli-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAMtF,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uGAAuG;IACvG,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AA6BD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG;IACzD,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,aAAa,CAAC;CACxB,CAmBA;AAED;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,QAAQ,CACN,EAAE,EAAE;QAAE,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,CAAA;KAAE,EACxC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1D,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,iBAAiB,GAAG;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,CAcA"}
|
package/dist/cli-session.js
CHANGED
|
@@ -23,6 +23,7 @@ exports.createCliSession = createCliSession;
|
|
|
23
23
|
exports.createCliApi = createCliApi;
|
|
24
24
|
const js_1 = require("@proton/js");
|
|
25
25
|
const proton_cli_1 = require("./proton-cli");
|
|
26
|
+
const transfer_cap_1 = require("./util/transfer-cap");
|
|
26
27
|
const DEFAULT_PERMISSION = 'active';
|
|
27
28
|
/**
|
|
28
29
|
* Result of CLI signing, normalised to the SDK's TransactionResult shape.
|
|
@@ -54,12 +55,13 @@ function toCliActions(actions) {
|
|
|
54
55
|
function createCliSession(opts) {
|
|
55
56
|
const account = opts.account;
|
|
56
57
|
const permission = opts.permission ?? DEFAULT_PERMISSION;
|
|
57
|
-
const rpcEndpoint = opts.rpcEndpoint ?? 'https://
|
|
58
|
+
const rpcEndpoint = opts.rpcEndpoint ?? 'https://api-xprnetwork-main.saltant.io';
|
|
58
59
|
const rpc = new js_1.JsonRpc(rpcEndpoint);
|
|
59
60
|
const session = {
|
|
60
61
|
auth: { actor: account, permission },
|
|
61
62
|
link: {
|
|
62
63
|
transact: async (args) => {
|
|
64
|
+
(0, transfer_cap_1.assertTransferCap)(args.actions, account, opts.maxTransferAmount);
|
|
63
65
|
const result = await (0, proton_cli_1.execTransactionPush)({ actions: toCliActions(args.actions) });
|
|
64
66
|
return normaliseResult(result);
|
|
65
67
|
},
|
|
@@ -80,6 +82,8 @@ function createCliApi(opts) {
|
|
|
80
82
|
const permission = opts.permission ?? DEFAULT_PERMISSION;
|
|
81
83
|
const api = {
|
|
82
84
|
transact: async (tx, _options) => {
|
|
85
|
+
// Central cap: every skill signs through here, so none can bypass it.
|
|
86
|
+
(0, transfer_cap_1.assertTransferCap)(tx.actions, account, opts.maxTransferAmount);
|
|
83
87
|
const result = await (0, proton_cli_1.execTransactionPush)({ actions: toCliActions(tx.actions) });
|
|
84
88
|
return normaliseResult(result);
|
|
85
89
|
},
|
package/dist/cli-session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-session.js","sourceRoot":"","sources":["../src/cli-session.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;
|
|
1
|
+
{"version":3,"file":"cli-session.js","sourceRoot":"","sources":["../src/cli-session.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;AAgDH,4CAsBC;AAqBD,oCAkBC;AA3GD,mCAAqC;AAErC,6CAAmE;AACnE,sDAAwD;AAExD,MAAM,kBAAkB,GAAG,QAAQ,CAAC;AAUpC;;;;GAIG;AACH,SAAS,eAAe,CAAC,MAAuD;IAC9E,MAAM,SAAS,GAAG,MAAM,CAAC,SAEZ,CAAC;IACd,OAAO;QACL,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,SAAS,EAAE;YACT,SAAS,EAAE,SAAS,EAAE,SAAS,IAAI,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC;YACrE,UAAU,EAAE,SAAS,EAAE,UAAU,IAAI,EAAE;SACxC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAAgC;IACpD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,IAAuB;IAItD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,kBAAkB,CAAC;IACzD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,wCAAwC,CAAC;IAEjF,MAAM,GAAG,GAAG,IAAI,YAAO,CAAC,WAAW,CAAC,CAAC;IAErC,MAAM,OAAO,GAAkB;QAC7B,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE;QACpC,IAAI,EAAE;YACJ,QAAQ,EAAE,KAAK,EAAE,IAAkB,EAA8B,EAAE;gBACjE,IAAA,gCAAiB,EAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACjE,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAmB,EAAC,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAClF,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;SACF;KACF,CAAC;IAEF,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC1B,CAAC;AAaD;;;;;;;GAOG;AACH,SAAgB,YAAY,CAAC,IAAuB;IAKlD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,kBAAkB,CAAC;IAEzD,MAAM,GAAG,GAAW;QAClB,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE;YAC/B,sEAAsE;YACtE,IAAA,gCAAiB,EAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAmB,EAAC,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChF,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;KACF,CAAC;IAEF,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACtC,CAAC"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,OAAO,KAAK,EAAE,SAAS,EAAgC,MAAM,SAAS,CAAC;AAGvE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1E,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIzD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC/D,YAAY,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAElG;;;GAGG;AACH,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,YAAY,CAAC,IAAI,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;YAChE,OAAO,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SACjD,CAAC,CAAC;KACJ,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA0BD,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,OAAO,KAAK,EAAE,SAAS,EAAgC,MAAM,SAAS,CAAC;AAGvE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1E,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIzD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC/D,YAAY,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAElG;;;GAGG;AACH,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,YAAY,CAAC,IAAI,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;YAChE,OAAO,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SACjD,CAAC,CAAC;KACJ,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA0BD,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI,CAgFpF"}
|
package/dist/index.js
CHANGED
|
@@ -65,7 +65,7 @@ function xprAgentsPlugin(realApi) {
|
|
|
65
65
|
: createAdapter(realApi);
|
|
66
66
|
const rawConfig = api.getConfig();
|
|
67
67
|
const network = rawConfig.network || 'mainnet';
|
|
68
|
-
const defaultRpc = network === 'mainnet' ? 'https://
|
|
68
|
+
const defaultRpc = network === 'mainnet' ? 'https://api-xprnetwork-main.saltant.io' : 'https://tn1.protonnz.com';
|
|
69
69
|
const rpcEndpoint = rawConfig.rpcEndpoint || process.env.XPR_RPC_ENDPOINT || defaultRpc;
|
|
70
70
|
// Signing is enabled when XPR_ACCOUNT is set. The proton CLI handles the
|
|
71
71
|
// private key — the agent process never sees it. Verifying CLI presence
|
|
@@ -74,8 +74,14 @@ function xprAgentsPlugin(realApi) {
|
|
|
74
74
|
// Create RPC connection and optional session
|
|
75
75
|
let rpc;
|
|
76
76
|
let session;
|
|
77
|
+
// One transfer cap for everything this plugin signs. A plugin-config value also
|
|
78
|
+
// becomes the process default so skills (which sign via createCliApi) inherit it.
|
|
79
|
+
const configuredCap = rawConfig.maxTransferAmount;
|
|
80
|
+
if (configuredCap !== undefined && !process.env.MAX_TRANSFER_AMOUNT) {
|
|
81
|
+
process.env.MAX_TRANSFER_AMOUNT = String(configuredCap);
|
|
82
|
+
}
|
|
77
83
|
if (hasCredentials) {
|
|
78
|
-
const result = (0, session_1.createSession)({ rpcEndpoint });
|
|
84
|
+
const result = (0, session_1.createSession)({ rpcEndpoint, maxTransferAmount: configuredCap });
|
|
79
85
|
rpc = result.rpc;
|
|
80
86
|
session = result.session;
|
|
81
87
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AA0EH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/session.d.ts
CHANGED
|
@@ -20,6 +20,8 @@ export interface SessionConfig {
|
|
|
20
20
|
rpcEndpoint: string;
|
|
21
21
|
account?: string;
|
|
22
22
|
permission?: string;
|
|
23
|
+
/** XPR transfer cap in smallest units (enforced on every signed transaction). */
|
|
24
|
+
maxTransferAmount?: number;
|
|
23
25
|
}
|
|
24
26
|
/**
|
|
25
27
|
* Create a server-side ProtonSession backed by the proton CLI.
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,CAS7F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE9D"}
|
package/dist/session.js
CHANGED
|
@@ -30,7 +30,7 @@ function createSession(config) {
|
|
|
30
30
|
if (!account) {
|
|
31
31
|
throw new Error('XPR_ACCOUNT environment variable is required');
|
|
32
32
|
}
|
|
33
|
-
return (0, cli_session_1.createCliSession)({ account, permission, rpcEndpoint: config.rpcEndpoint });
|
|
33
|
+
return (0, cli_session_1.createCliSession)({ account, permission, rpcEndpoint: config.rpcEndpoint, maxTransferAmount: config.maxTransferAmount });
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
36
|
* Create a read-only RPC connection (no session/signing needed).
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;AAkBH,sCASC;AAKD,8CAEC;AAhCD,mCAAqC;AAErC,+CAAiD;AAUjD;;;GAGG;AACH,SAAgB,aAAa,CAAC,MAAqB;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC1D,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,QAAQ,CAAC;IAE/E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,IAAA,8BAAgB,EAAC,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACjI,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,WAAmB;IACnD,OAAO,IAAI,YAAO,CAAC,WAAW,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central XPR transfer cap, enforced at the signing layer.
|
|
3
|
+
*
|
|
4
|
+
* Every signed transaction — core plugin tools (createCliSession) and every bundled
|
|
5
|
+
* or external skill (createCliApi) — passes through assertTransferCap before it is
|
|
6
|
+
* handed to the proton CLI. Individual tools can no longer forget the cap: the
|
|
7
|
+
* total XPR the agent sends via eosio.token::transfer in one transaction is summed
|
|
8
|
+
* and refused if it exceeds the limit.
|
|
9
|
+
*
|
|
10
|
+
* Limit, in order of precedence:
|
|
11
|
+
* 1. an explicit `maxTransferAmount` (smallest units, 4 decimals) passed by the caller
|
|
12
|
+
* 2. MAX_TRANSFER_AMOUNT env (smallest units; the documented setting)
|
|
13
|
+
* 3. MAX_TRANSFER_XPR env (whole XPR; legacy name used by skills before 0.8.4)
|
|
14
|
+
* 4. default 10,000,000 = 1,000 XPR
|
|
15
|
+
*
|
|
16
|
+
* Only XPR is capped (the documented cap is denominated in XPR). Other tokens are
|
|
17
|
+
* not limited here.
|
|
18
|
+
*/
|
|
19
|
+
export declare const DEFAULT_MAX_TRANSFER_AMOUNT = 10000000;
|
|
20
|
+
interface CappableAction {
|
|
21
|
+
account: string;
|
|
22
|
+
name: string;
|
|
23
|
+
data?: unknown;
|
|
24
|
+
}
|
|
25
|
+
/** Resolve the cap in smallest units (4 decimals). */
|
|
26
|
+
export declare function resolveTransferCap(explicit?: number): number;
|
|
27
|
+
/** Total XPR (smallest units) sent by `account` via eosio.token::transfer in these actions. */
|
|
28
|
+
export declare function totalXprSent(actions: CappableAction[], account: string): number;
|
|
29
|
+
/** Throw if the transaction would send more XPR than the cap allows. */
|
|
30
|
+
export declare function assertTransferCap(actions: CappableAction[], account: string, maxTransferAmount?: number): void;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=transfer-cap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer-cap.d.ts","sourceRoot":"","sources":["../../src/util/transfer-cap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,eAAO,MAAM,2BAA2B,WAAa,CAAC;AAItD,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAa5D;AAYD,+FAA+F;AAC/F,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAiB/E;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAU9G"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Central XPR transfer cap, enforced at the signing layer.
|
|
4
|
+
*
|
|
5
|
+
* Every signed transaction — core plugin tools (createCliSession) and every bundled
|
|
6
|
+
* or external skill (createCliApi) — passes through assertTransferCap before it is
|
|
7
|
+
* handed to the proton CLI. Individual tools can no longer forget the cap: the
|
|
8
|
+
* total XPR the agent sends via eosio.token::transfer in one transaction is summed
|
|
9
|
+
* and refused if it exceeds the limit.
|
|
10
|
+
*
|
|
11
|
+
* Limit, in order of precedence:
|
|
12
|
+
* 1. an explicit `maxTransferAmount` (smallest units, 4 decimals) passed by the caller
|
|
13
|
+
* 2. MAX_TRANSFER_AMOUNT env (smallest units; the documented setting)
|
|
14
|
+
* 3. MAX_TRANSFER_XPR env (whole XPR; legacy name used by skills before 0.8.4)
|
|
15
|
+
* 4. default 10,000,000 = 1,000 XPR
|
|
16
|
+
*
|
|
17
|
+
* Only XPR is capped (the documented cap is denominated in XPR). Other tokens are
|
|
18
|
+
* not limited here.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.DEFAULT_MAX_TRANSFER_AMOUNT = void 0;
|
|
22
|
+
exports.resolveTransferCap = resolveTransferCap;
|
|
23
|
+
exports.totalXprSent = totalXprSent;
|
|
24
|
+
exports.assertTransferCap = assertTransferCap;
|
|
25
|
+
exports.DEFAULT_MAX_TRANSFER_AMOUNT = 10000000; // 1,000.0000 XPR in smallest units
|
|
26
|
+
const XPR_DECIMALS = 4;
|
|
27
|
+
/** Resolve the cap in smallest units (4 decimals). */
|
|
28
|
+
function resolveTransferCap(explicit) {
|
|
29
|
+
if (explicit !== undefined && Number.isFinite(explicit) && explicit >= 0)
|
|
30
|
+
return Math.floor(explicit);
|
|
31
|
+
const units = process.env.MAX_TRANSFER_AMOUNT;
|
|
32
|
+
if (units !== undefined && units.trim() !== '') {
|
|
33
|
+
const n = Number(units);
|
|
34
|
+
if (Number.isFinite(n) && n >= 0)
|
|
35
|
+
return Math.floor(n);
|
|
36
|
+
}
|
|
37
|
+
const legacyXpr = process.env.MAX_TRANSFER_XPR;
|
|
38
|
+
if (legacyXpr !== undefined && legacyXpr.trim() !== '') {
|
|
39
|
+
const n = Number(legacyXpr);
|
|
40
|
+
if (Number.isFinite(n) && n >= 0)
|
|
41
|
+
return Math.floor(n * 10 ** XPR_DECIMALS);
|
|
42
|
+
}
|
|
43
|
+
return exports.DEFAULT_MAX_TRANSFER_AMOUNT;
|
|
44
|
+
}
|
|
45
|
+
/** Parse "12.3456 XPR" into smallest units; returns null for other symbols or bad input. */
|
|
46
|
+
function xprUnits(quantity) {
|
|
47
|
+
if (typeof quantity !== 'string')
|
|
48
|
+
return null;
|
|
49
|
+
const m = quantity.trim().match(/^(\d+)(?:\.(\d+))?\s+([A-Z]{1,7})$/);
|
|
50
|
+
if (!m || m[3] !== 'XPR')
|
|
51
|
+
return null;
|
|
52
|
+
const whole = Number(m[1]);
|
|
53
|
+
const frac = (m[2] ?? '').padEnd(XPR_DECIMALS, '0').slice(0, XPR_DECIMALS);
|
|
54
|
+
return whole * 10 ** XPR_DECIMALS + Number(frac);
|
|
55
|
+
}
|
|
56
|
+
/** Total XPR (smallest units) sent by `account` via eosio.token::transfer in these actions. */
|
|
57
|
+
function totalXprSent(actions, account) {
|
|
58
|
+
let total = 0;
|
|
59
|
+
for (const a of actions) {
|
|
60
|
+
if (a.account !== 'eosio.token' || a.name !== 'transfer')
|
|
61
|
+
continue;
|
|
62
|
+
const d = (a.data ?? {});
|
|
63
|
+
if (d.from !== account)
|
|
64
|
+
continue;
|
|
65
|
+
const units = xprUnits(d.quantity);
|
|
66
|
+
if (units === null) {
|
|
67
|
+
// An XPR-looking quantity we cannot parse must not slip past the cap.
|
|
68
|
+
if (typeof d.quantity === 'string' && /\bXPR\b/.test(d.quantity)) {
|
|
69
|
+
throw new Error(`Refusing transfer: could not parse XPR quantity "${d.quantity}"`);
|
|
70
|
+
}
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
total += units;
|
|
74
|
+
}
|
|
75
|
+
return total;
|
|
76
|
+
}
|
|
77
|
+
/** Throw if the transaction would send more XPR than the cap allows. */
|
|
78
|
+
function assertTransferCap(actions, account, maxTransferAmount) {
|
|
79
|
+
const cap = resolveTransferCap(maxTransferAmount);
|
|
80
|
+
const sent = totalXprSent(actions, account);
|
|
81
|
+
if (sent > cap) {
|
|
82
|
+
const fmt = (u) => (u / 10 ** XPR_DECIMALS).toFixed(XPR_DECIMALS);
|
|
83
|
+
throw new Error(`Refusing transaction: it sends ${fmt(sent)} XPR, above the transfer cap of ${fmt(cap)} XPR ` +
|
|
84
|
+
`(MAX_TRANSFER_AMOUNT, in smallest units).`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=transfer-cap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer-cap.js","sourceRoot":"","sources":["../../src/util/transfer-cap.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -73,8 +73,8 @@ const path = __importStar(require("path"));
|
|
|
73
73
|
const ESCROW = 'agentescrow';
|
|
74
74
|
const GLYPH = 'https://xpragents.com/xpr-glyph-black.png';
|
|
75
75
|
const REPLICATE_MODEL = 'google/nano-banana-2';
|
|
76
|
-
const DEFAULT_RPC = 'https://
|
|
77
|
-
const DEFAULT_HYPERION = 'https://
|
|
76
|
+
const DEFAULT_RPC = 'https://api-xprnetwork-main.saltant.io';
|
|
77
|
+
const DEFAULT_HYPERION = 'https://api-xprnetwork-main.saltant.io';
|
|
78
78
|
const DEFAULT_GATEWAY = 'https://agent.mypinata.cloud';
|
|
79
79
|
const DEFAULT_WORK_DIR = './blockart-work';
|
|
80
80
|
const HTTP_TIMEOUT = 30000;
|
|
@@ -76,8 +76,8 @@ export interface BlockArtPlan {
|
|
|
76
76
|
const ESCROW = 'agentescrow';
|
|
77
77
|
const GLYPH = 'https://xpragents.com/xpr-glyph-black.png';
|
|
78
78
|
const REPLICATE_MODEL = 'google/nano-banana-2';
|
|
79
|
-
const DEFAULT_RPC = 'https://
|
|
80
|
-
const DEFAULT_HYPERION = 'https://
|
|
79
|
+
const DEFAULT_RPC = 'https://api-xprnetwork-main.saltant.io';
|
|
80
|
+
const DEFAULT_HYPERION = 'https://api-xprnetwork-main.saltant.io';
|
|
81
81
|
const DEFAULT_GATEWAY = 'https://agent.mypinata.cloud';
|
|
82
82
|
const DEFAULT_WORK_DIR = './blockart-work';
|
|
83
83
|
|
|
@@ -184,11 +184,13 @@ function parseAssetString(s) {
|
|
|
184
184
|
function assertXprWithinCap(amount, symbol, label) {
|
|
185
185
|
if ((symbol || '').toUpperCase() !== 'XPR')
|
|
186
186
|
return; // cap is XPR-denominated
|
|
187
|
-
const capXpr =
|
|
187
|
+
const capXpr = process.env.MAX_TRANSFER_AMOUNT
|
|
188
|
+
? Number(process.env.MAX_TRANSFER_AMOUNT) / 10000
|
|
189
|
+
: Number(process.env.MAX_TRANSFER_XPR || '1000'); // legacy name
|
|
188
190
|
if (!Number.isFinite(capXpr) || capXpr <= 0)
|
|
189
191
|
return; // disabled/invalid -> no cap
|
|
190
192
|
if (Number.isFinite(amount) && amount > capXpr) {
|
|
191
|
-
throw new Error(`${label}: ${amount} XPR exceeds the transfer cap of ${capXpr} XPR (set
|
|
193
|
+
throw new Error(`${label}: ${amount} XPR exceeds the transfer cap of ${capXpr} XPR (set MAX_TRANSFER_AMOUNT to raise it).`);
|
|
192
194
|
}
|
|
193
195
|
}
|
|
194
196
|
// ── Session Factory ──────────────────────────────
|
package/skills/defi/src/index.ts
CHANGED
|
@@ -175,10 +175,12 @@ function parseAssetString(s: string): { amount: number; symbol: string; precisio
|
|
|
175
175
|
// default); raise it to allow larger trades.
|
|
176
176
|
function assertXprWithinCap(amount: number, symbol: string, label: string): void {
|
|
177
177
|
if ((symbol || '').toUpperCase() !== 'XPR') return; // cap is XPR-denominated
|
|
178
|
-
const capXpr =
|
|
178
|
+
const capXpr = process.env.MAX_TRANSFER_AMOUNT
|
|
179
|
+
? Number(process.env.MAX_TRANSFER_AMOUNT) / 10000
|
|
180
|
+
: Number(process.env.MAX_TRANSFER_XPR || '1000'); // legacy name
|
|
179
181
|
if (!Number.isFinite(capXpr) || capXpr <= 0) return; // disabled/invalid -> no cap
|
|
180
182
|
if (Number.isFinite(amount) && amount > capXpr) {
|
|
181
|
-
throw new Error(`${label}: ${amount} XPR exceeds the transfer cap of ${capXpr} XPR (set
|
|
183
|
+
throw new Error(`${label}: ${amount} XPR exceeds the transfer cap of ${capXpr} XPR (set MAX_TRANSFER_AMOUNT to raise it).`);
|
|
182
184
|
}
|
|
183
185
|
}
|
|
184
186
|
|
package/skills/nft/dist/index.js
CHANGED
|
@@ -256,12 +256,14 @@ function parsePrice(price) {
|
|
|
256
256
|
function assertXprWithinCap(parsed, label) {
|
|
257
257
|
if (parsed.symbol !== 'XPR')
|
|
258
258
|
return; // cap is XPR-denominated
|
|
259
|
-
const capXpr =
|
|
259
|
+
const capXpr = process.env.MAX_TRANSFER_AMOUNT
|
|
260
|
+
? Number(process.env.MAX_TRANSFER_AMOUNT) / 10000
|
|
261
|
+
: Number(process.env.MAX_TRANSFER_XPR || '1000'); // legacy name
|
|
260
262
|
if (!Number.isFinite(capXpr) || capXpr <= 0)
|
|
261
263
|
return; // disabled/invalid -> no cap
|
|
262
264
|
const amt = Number(parsed.amount);
|
|
263
265
|
if (Number.isFinite(amt) && amt > capXpr) {
|
|
264
|
-
throw new Error(`${label}: ${parsed.amount} XPR exceeds the transfer cap of ${capXpr} XPR (set
|
|
266
|
+
throw new Error(`${label}: ${parsed.amount} XPR exceeds the transfer cap of ${capXpr} XPR (set MAX_TRANSFER_AMOUNT to raise it).`);
|
|
265
267
|
}
|
|
266
268
|
}
|
|
267
269
|
// ── Validation Helpers ───────────────────────────
|
package/skills/nft/src/index.ts
CHANGED
|
@@ -256,11 +256,13 @@ function parsePrice(price: string): { amount: string; symbol: string; precision:
|
|
|
256
256
|
// 1000, matching the core default); set it higher to allow larger trades.
|
|
257
257
|
function assertXprWithinCap(parsed: { amount: string; symbol: string }, label: string): void {
|
|
258
258
|
if (parsed.symbol !== 'XPR') return; // cap is XPR-denominated
|
|
259
|
-
const capXpr =
|
|
259
|
+
const capXpr = process.env.MAX_TRANSFER_AMOUNT
|
|
260
|
+
? Number(process.env.MAX_TRANSFER_AMOUNT) / 10000
|
|
261
|
+
: Number(process.env.MAX_TRANSFER_XPR || '1000'); // legacy name
|
|
260
262
|
if (!Number.isFinite(capXpr) || capXpr <= 0) return; // disabled/invalid -> no cap
|
|
261
263
|
const amt = Number(parsed.amount);
|
|
262
264
|
if (Number.isFinite(amt) && amt > capXpr) {
|
|
263
|
-
throw new Error(`${label}: ${parsed.amount} XPR exceeds the transfer cap of ${capXpr} XPR (set
|
|
265
|
+
throw new Error(`${label}: ${parsed.amount} XPR exceeds the transfer cap of ${capXpr} XPR (set MAX_TRANSFER_AMOUNT to raise it).`);
|
|
264
266
|
}
|
|
265
267
|
}
|
|
266
268
|
|
|
@@ -113,12 +113,12 @@ These tools replace `@proton/cli` commands for environments where the CLI isn't
|
|
|
113
113
|
### Resources
|
|
114
114
|
|
|
115
115
|
**RPC Endpoints:**
|
|
116
|
-
- Mainnet: `https://proton.
|
|
117
|
-
- Testnet: `https://
|
|
116
|
+
- Mainnet: `https://api-xprnetwork-main.saltant.io` (alt: `https://proton.protonuk.io`)
|
|
117
|
+
- Testnet: `https://api-xprnetwork-test.saltant.io`
|
|
118
118
|
|
|
119
119
|
**Chain IDs:**
|
|
120
120
|
- Mainnet: `384da888112027f0321850a169f737c33e53b388aad48b5adace4bab97f437e0`
|
|
121
|
-
- Testnet: `
|
|
121
|
+
- Testnet: `71ee83bcf52142d61019d95f9cc5427ba6a0d7ff8accd9e2088ae2abeaf3d3dd`
|
|
122
122
|
|
|
123
123
|
**Key Packages:**
|
|
124
124
|
- `proton-tsc` — AssemblyScript contract SDK (types, decorators, utilities)
|
|
@@ -50,11 +50,12 @@ async function rpcGet(endpoint, path) {
|
|
|
50
50
|
// ── Hyperion endpoint resolution ────────────────
|
|
51
51
|
function getHyperionEndpoint(rpcEndpoint) {
|
|
52
52
|
// Map known RPC endpoints to their Hyperion equivalents
|
|
53
|
-
if (rpcEndpoint.includes('proton-testnet') || rpcEndpoint.includes('proton-test')) {
|
|
54
|
-
return 'https://
|
|
53
|
+
if (rpcEndpoint.includes('proton-testnet') || rpcEndpoint.includes('proton-test') || rpcEndpoint.includes('tn1.protonnz.com') || rpcEndpoint.includes('xprnetwork-test')) {
|
|
54
|
+
return 'https://api-xprnetwork-test.saltant.io';
|
|
55
55
|
}
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
// nodeos-only public RPCs (no /v2 history) map to a Hyperion-serving producer endpoint
|
|
57
|
+
if (/proton\.eosusa\.io|proton\.greymass\.com|api\.protonnz\.com|proton\.cryptolions\.io/.test(rpcEndpoint)) {
|
|
58
|
+
return 'https://api-xprnetwork-main.saltant.io';
|
|
58
59
|
}
|
|
59
60
|
// Default: assume the RPC endpoint also serves Hyperion
|
|
60
61
|
return rpcEndpoint;
|
|
@@ -65,11 +65,12 @@ async function rpcGet(endpoint: string, path: string): Promise<any> {
|
|
|
65
65
|
|
|
66
66
|
function getHyperionEndpoint(rpcEndpoint: string): string {
|
|
67
67
|
// Map known RPC endpoints to their Hyperion equivalents
|
|
68
|
-
if (rpcEndpoint.includes('proton-testnet') || rpcEndpoint.includes('proton-test')) {
|
|
69
|
-
return 'https://
|
|
68
|
+
if (rpcEndpoint.includes('proton-testnet') || rpcEndpoint.includes('proton-test') || rpcEndpoint.includes('tn1.protonnz.com') || rpcEndpoint.includes('xprnetwork-test')) {
|
|
69
|
+
return 'https://api-xprnetwork-test.saltant.io';
|
|
70
70
|
}
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
// nodeos-only public RPCs (no /v2 history) map to a Hyperion-serving producer endpoint
|
|
72
|
+
if (/proton\.eosusa\.io|proton\.greymass\.com|api\.protonnz\.com|proton\.cryptolions\.io/.test(rpcEndpoint)) {
|
|
73
|
+
return 'https://api-xprnetwork-main.saltant.io';
|
|
73
74
|
}
|
|
74
75
|
// Default: assume the RPC endpoint also serves Hyperion
|
|
75
76
|
return rpcEndpoint;
|