@xpr-agents/openclaw 0.8.3 → 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.
@@ -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;AAKtF,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA6BD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG;IACzD,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,aAAa,CAAC;CACxB,CAkBA;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,CAYA"}
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"}
@@ -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://proton.greymass.com';
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
  },
@@ -1 +1 @@
1
- {"version":3,"file":"cli-session.js","sourceRoot":"","sources":["../src/cli-session.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;AA6CH,4CAqBC;AAqBD,oCAgBC;AArGD,mCAAqC;AAErC,6CAAmE;AAEnE,MAAM,kBAAkB,GAAG,QAAQ,CAAC;AAQpC;;;;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,6BAA6B,CAAC;IAEtE,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,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,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"}
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"}
@@ -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,CAyEpF"}
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
@@ -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":"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"}
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.
@@ -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;CACrB;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"}
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).
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;AAgBH,sCASC;AAKD,8CAEC;AA9BD,mCAAqC;AAErC,+CAAiD;AAQjD;;;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,CAAC,CAAC;AACpF,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,WAAmB;IACnD,OAAO,IAAI,YAAO,CAAC,WAAW,CAAC,CAAC;AAClC,CAAC"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xpr-agents/openclaw",
3
- "version": "0.8.3",
3
+ "version": "0.8.4",
4
4
  "description": "OpenClaw plugin for XPR Network Trustless Agent Registry - autonomous agent operation, escrow jobs, feedback, and validation",
5
5
  "author": "XPR Network",
6
6
  "bin": {
@@ -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 = Number(process.env.MAX_TRANSFER_XPR || '1000');
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 MAX_TRANSFER_XPR to raise it).`);
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 ──────────────────────────────
@@ -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 = Number(process.env.MAX_TRANSFER_XPR || '1000');
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 MAX_TRANSFER_XPR to raise it).`);
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
 
@@ -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 = Number(process.env.MAX_TRANSFER_XPR || '1000');
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 MAX_TRANSFER_XPR to raise it).`);
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 ───────────────────────────
@@ -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 = Number(process.env.MAX_TRANSFER_XPR || '1000');
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 MAX_TRANSFER_XPR to raise it).`);
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