blue-js-sdk 2.0.0

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.
Files changed (215) hide show
  1. package/CHANGELOG.md +446 -0
  2. package/LICENSE +21 -0
  3. package/README.md +75 -0
  4. package/ai-path/ADMIN-ELEVATION.md +116 -0
  5. package/ai-path/AI-MANIFESTO.md +185 -0
  6. package/ai-path/BREAKING.md +74 -0
  7. package/ai-path/CHECKLIST.md +619 -0
  8. package/ai-path/CONNECTION-STEPS.md +724 -0
  9. package/ai-path/DECISION-TREE.md +378 -0
  10. package/ai-path/DEPENDENCIES.md +459 -0
  11. package/ai-path/E2E-FLOW.md +1555 -0
  12. package/ai-path/FAILURES.md +403 -0
  13. package/ai-path/GUIDE.md +1217 -0
  14. package/ai-path/README.md +558 -0
  15. package/ai-path/SPLIT-TUNNEL.md +266 -0
  16. package/ai-path/cli.js +535 -0
  17. package/ai-path/connect.js +884 -0
  18. package/ai-path/discover.js +178 -0
  19. package/ai-path/environment.js +266 -0
  20. package/ai-path/errors.js +86 -0
  21. package/ai-path/examples/autonomous-agent.mjs +220 -0
  22. package/ai-path/examples/multi-region.mjs +174 -0
  23. package/ai-path/examples/one-shot.mjs +31 -0
  24. package/ai-path/index.js +60 -0
  25. package/ai-path/pricing.js +136 -0
  26. package/ai-path/recommend.js +413 -0
  27. package/ai-path/run-admin.vbs +25 -0
  28. package/ai-path/setup.js +291 -0
  29. package/ai-path/wallet.js +137 -0
  30. package/app-helpers.js +363 -0
  31. package/app-settings.js +95 -0
  32. package/app-types.js +267 -0
  33. package/audit.js +847 -0
  34. package/batch.js +293 -0
  35. package/bin/setup.js +376 -0
  36. package/chain/authz.js +109 -0
  37. package/chain/broadcast.js +472 -0
  38. package/chain/client.js +160 -0
  39. package/chain/fee-grants.js +305 -0
  40. package/chain/index.js +891 -0
  41. package/chain/lcd.js +313 -0
  42. package/chain/queries.js +547 -0
  43. package/chain/rpc.js +408 -0
  44. package/chain/wallet.js +141 -0
  45. package/cli/config.js +143 -0
  46. package/cli/index.js +463 -0
  47. package/cli/output.js +182 -0
  48. package/cli.js +491 -0
  49. package/client/index.js +251 -0
  50. package/client.js +271 -0
  51. package/config/index.js +255 -0
  52. package/connection/connect.js +849 -0
  53. package/connection/disconnect.js +180 -0
  54. package/connection/discovery.js +321 -0
  55. package/connection/index.js +76 -0
  56. package/connection/proxy.js +148 -0
  57. package/connection/resilience.js +428 -0
  58. package/connection/security.js +232 -0
  59. package/connection/state.js +369 -0
  60. package/connection/tunnel.js +691 -0
  61. package/consumer.js +132 -0
  62. package/cosmjs-setup.js +1884 -0
  63. package/defaults.js +366 -0
  64. package/disk-cache.js +107 -0
  65. package/dist/client.d.ts +108 -0
  66. package/dist/client.d.ts.map +1 -0
  67. package/dist/client.js +400 -0
  68. package/dist/client.js.map +1 -0
  69. package/dist/index.d.ts +8 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +8 -0
  72. package/dist/index.js.map +1 -0
  73. package/errors/index.js +112 -0
  74. package/errors.js +218 -0
  75. package/examples/README.md +64 -0
  76. package/examples/connect-direct.mjs +106 -0
  77. package/examples/connect-plan.mjs +125 -0
  78. package/examples/error-handling.mjs +109 -0
  79. package/examples/query-nodes.mjs +94 -0
  80. package/examples/wallet-basics.mjs +61 -0
  81. package/generated/amino/amino.ts +9 -0
  82. package/generated/cosmos/base/v1beta1/coin.ts +365 -0
  83. package/generated/cosmos_proto/cosmos.ts +323 -0
  84. package/generated/gogoproto/gogo.ts +9 -0
  85. package/generated/google/protobuf/descriptor.ts +7601 -0
  86. package/generated/google/protobuf/duration.ts +208 -0
  87. package/generated/google/protobuf/timestamp.ts +238 -0
  88. package/generated/sentinel/lease/v1/events.ts +924 -0
  89. package/generated/sentinel/lease/v1/lease.ts +292 -0
  90. package/generated/sentinel/lease/v1/msg.ts +949 -0
  91. package/generated/sentinel/lease/v1/params.ts +164 -0
  92. package/generated/sentinel/node/v3/events.ts +881 -0
  93. package/generated/sentinel/node/v3/msg.ts +1002 -0
  94. package/generated/sentinel/node/v3/node.ts +263 -0
  95. package/generated/sentinel/node/v3/params.ts +183 -0
  96. package/generated/sentinel/plan/v3/events.ts +675 -0
  97. package/generated/sentinel/plan/v3/msg.ts +1191 -0
  98. package/generated/sentinel/plan/v3/plan.ts +283 -0
  99. package/generated/sentinel/provider/v2/events.ts +171 -0
  100. package/generated/sentinel/provider/v2/msg.ts +480 -0
  101. package/generated/sentinel/provider/v2/params.ts +131 -0
  102. package/generated/sentinel/provider/v2/provider.ts +246 -0
  103. package/generated/sentinel/session/v3/events.ts +480 -0
  104. package/generated/sentinel/session/v3/msg.ts +616 -0
  105. package/generated/sentinel/session/v3/params.ts +260 -0
  106. package/generated/sentinel/session/v3/proof.ts +180 -0
  107. package/generated/sentinel/session/v3/session.ts +384 -0
  108. package/generated/sentinel/subscription/v3/events.ts +1181 -0
  109. package/generated/sentinel/subscription/v3/msg.ts +1305 -0
  110. package/generated/sentinel/subscription/v3/params.ts +167 -0
  111. package/generated/sentinel/subscription/v3/subscription.ts +315 -0
  112. package/generated/sentinel/types/v1/bandwidth.ts +124 -0
  113. package/generated/sentinel/types/v1/price.ts +149 -0
  114. package/generated/sentinel/types/v1/renewal.ts +87 -0
  115. package/generated/sentinel/types/v1/status.ts +54 -0
  116. package/generated/typeRegistry.ts +27 -0
  117. package/index.js +486 -0
  118. package/node-connect.js +3015 -0
  119. package/operator.js +134 -0
  120. package/package.json +113 -0
  121. package/plan-operations.js +199 -0
  122. package/preflight.js +352 -0
  123. package/pricing/index.js +262 -0
  124. package/proto/amino/amino.proto +84 -0
  125. package/proto/cosmos/base/v1beta1/coin.proto +61 -0
  126. package/proto/cosmos_proto/cosmos.proto +112 -0
  127. package/proto/gogoproto/gogo.proto +145 -0
  128. package/proto/google/api/annotations.proto +31 -0
  129. package/proto/google/api/http.proto +370 -0
  130. package/proto/google/protobuf/any.proto +106 -0
  131. package/proto/google/protobuf/duration.proto +115 -0
  132. package/proto/google/protobuf/timestamp.proto +145 -0
  133. package/proto/sentinel/lease/v1/events.proto +52 -0
  134. package/proto/sentinel/lease/v1/genesis.proto +15 -0
  135. package/proto/sentinel/lease/v1/lease.proto +25 -0
  136. package/proto/sentinel/lease/v1/msg.proto +62 -0
  137. package/proto/sentinel/lease/v1/params.proto +17 -0
  138. package/proto/sentinel/node/v3/events.proto +50 -0
  139. package/proto/sentinel/node/v3/genesis.proto +15 -0
  140. package/proto/sentinel/node/v3/msg.proto +63 -0
  141. package/proto/sentinel/node/v3/node.proto +27 -0
  142. package/proto/sentinel/node/v3/params.proto +21 -0
  143. package/proto/sentinel/node/v3/querier.proto +63 -0
  144. package/proto/sentinel/plan/v3/events.proto +41 -0
  145. package/proto/sentinel/plan/v3/genesis.proto +21 -0
  146. package/proto/sentinel/plan/v3/msg.proto +83 -0
  147. package/proto/sentinel/plan/v3/plan.proto +32 -0
  148. package/proto/sentinel/plan/v3/querier.proto +53 -0
  149. package/proto/sentinel/provider/v2/events.proto +16 -0
  150. package/proto/sentinel/provider/v2/genesis.proto +15 -0
  151. package/proto/sentinel/provider/v2/msg.proto +35 -0
  152. package/proto/sentinel/provider/v2/params.proto +17 -0
  153. package/proto/sentinel/provider/v2/provider.proto +24 -0
  154. package/proto/sentinel/provider/v3/genesis.proto +15 -0
  155. package/proto/sentinel/provider/v3/params.proto +13 -0
  156. package/proto/sentinel/session/v3/events.proto +30 -0
  157. package/proto/sentinel/session/v3/genesis.proto +15 -0
  158. package/proto/sentinel/session/v3/msg.proto +50 -0
  159. package/proto/sentinel/session/v3/params.proto +25 -0
  160. package/proto/sentinel/session/v3/proof.proto +25 -0
  161. package/proto/sentinel/session/v3/querier.proto +100 -0
  162. package/proto/sentinel/session/v3/session.proto +50 -0
  163. package/proto/sentinel/subscription/v2/allocation.proto +21 -0
  164. package/proto/sentinel/subscription/v2/payout.proto +22 -0
  165. package/proto/sentinel/subscription/v3/events.proto +65 -0
  166. package/proto/sentinel/subscription/v3/genesis.proto +17 -0
  167. package/proto/sentinel/subscription/v3/msg.proto +83 -0
  168. package/proto/sentinel/subscription/v3/params.proto +21 -0
  169. package/proto/sentinel/subscription/v3/subscription.proto +33 -0
  170. package/proto/sentinel/types/v1/bandwidth.proto +19 -0
  171. package/proto/sentinel/types/v1/price.proto +21 -0
  172. package/proto/sentinel/types/v1/renewal.proto +21 -0
  173. package/proto/sentinel/types/v1/status.proto +16 -0
  174. package/protocol/encoding.js +341 -0
  175. package/protocol/events.js +361 -0
  176. package/protocol/handshake.js +297 -0
  177. package/protocol/index.js +15 -0
  178. package/protocol/messages.js +346 -0
  179. package/protocol/plans.js +199 -0
  180. package/protocol/v2ray.js +268 -0
  181. package/protocol/v3.js +723 -0
  182. package/protocol/wireguard.js +125 -0
  183. package/security/index.js +132 -0
  184. package/session-manager.js +329 -0
  185. package/session-tracker.js +80 -0
  186. package/setup.js +376 -0
  187. package/speedtest/index.js +528 -0
  188. package/speedtest.js +567 -0
  189. package/src/client.ts +502 -0
  190. package/src/index.ts +20 -0
  191. package/state/index.js +347 -0
  192. package/state.js +516 -0
  193. package/test-all-chain-ops.js +493 -0
  194. package/test-all-logic.js +199 -0
  195. package/test-all-msg-types.js +292 -0
  196. package/test-every-connection.js +208 -0
  197. package/test-feegrant-connect.js +98 -0
  198. package/test-logic.js +148 -0
  199. package/test-mainnet.js +176 -0
  200. package/test-plan-lifecycle.js +335 -0
  201. package/tls-trust.js +132 -0
  202. package/tsconfig.build.json +20 -0
  203. package/tsconfig.json +34 -0
  204. package/types/chain.d.ts +746 -0
  205. package/types/connection.d.ts +425 -0
  206. package/types/errors.d.ts +174 -0
  207. package/types/index.d.ts +1380 -0
  208. package/types/nodes.d.ts +187 -0
  209. package/types/pricing.d.ts +156 -0
  210. package/types/protocol.d.ts +332 -0
  211. package/types/session.d.ts +236 -0
  212. package/types/settings.d.ts +192 -0
  213. package/v3protocol.js +1053 -0
  214. package/wallet/index.js +153 -0
  215. package/wireguard.js +307 -0
package/operator.js ADDED
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Sentinel dVPN SDK — Operator Entry Point
3
+ *
4
+ * ~70 exports for operators, testers, plan managers, and auditing tools.
5
+ * Batch sessions, network audit, plan/provider/lease management, fee grants, authz.
6
+ *
7
+ * Usage:
8
+ * import { batchStartSessions, auditNetwork } from 'sentinel-dvpn-sdk/operator';
9
+ *
10
+ * For consumer VPN app functions (connect, disconnect, wallet, security):
11
+ * import { connect, disconnect, listNodes } from 'sentinel-dvpn-sdk/consumer';
12
+ *
13
+ * WARNING: These functions can cost real P2P tokens in bulk. They are NOT for
14
+ * end-user VPN apps. A consumer app accidentally using batchStartSessions
15
+ * will drain the wallet.
16
+ */
17
+
18
+ // ─── Batch Session Operations ───────────────────────────────────────────────
19
+
20
+ export {
21
+ batchStartSessions,
22
+ waitForBatchSessions,
23
+ } from './batch.js';
24
+
25
+ export {
26
+ buildBatchStartSession,
27
+ extractAllSessionIds,
28
+ } from './cosmjs-setup.js';
29
+
30
+ // ─── Network Audit & Node Testing ──────────────────────────────────────────
31
+
32
+ export {
33
+ testNode,
34
+ auditNetwork,
35
+ loadTransportCache,
36
+ saveTransportCache,
37
+ recordTransportSuccess,
38
+ recordTransportFailure,
39
+ } from './audit.js';
40
+
41
+ // ─── Plan Management ────────────────────────────────────────────────────────
42
+
43
+ export {
44
+ encodeMsgCreatePlan,
45
+ encodeMsgUpdatePlanStatus,
46
+ encodeMsgLinkNode,
47
+ encodeMsgUnlinkNode,
48
+ encodeMsgPlanStartSession,
49
+ } from './plan-operations.js';
50
+
51
+ export {
52
+ encodeMsgUpdatePlanDetails,
53
+ } from './v3protocol.js';
54
+
55
+ // ─── Provider Management ────────────────────────────────────────────────────
56
+
57
+ export {
58
+ encodeMsgRegisterProvider,
59
+ encodeMsgUpdateProviderDetails,
60
+ encodeMsgUpdateProviderStatus,
61
+ } from './plan-operations.js';
62
+
63
+ // ─── Lease Management ───────────────────────────────────────────────────────
64
+
65
+ export {
66
+ encodeMsgStartLease,
67
+ encodeMsgEndLease,
68
+ } from './plan-operations.js';
69
+
70
+ // ─── Fee Grants ─────────────────────────────────────────────────────────────
71
+
72
+ export {
73
+ buildFeeGrantMsg,
74
+ buildRevokeFeeGrantMsg,
75
+ queryFeeGrants,
76
+ queryFeeGrantsIssued,
77
+ grantPlanSubscribers,
78
+ renewExpiringGrants,
79
+ monitorFeeGrants,
80
+ } from './cosmjs-setup.js';
81
+
82
+ // ─── Authz ──────────────────────────────────────────────────────────────────
83
+
84
+ export {
85
+ buildAuthzGrantMsg,
86
+ buildAuthzRevokeMsg,
87
+ buildAuthzExecMsg,
88
+ encodeForExec,
89
+ queryAuthzGrants,
90
+ } from './cosmjs-setup.js';
91
+
92
+ // ─── Chain Direct (broadcast, registry, LCD) ────────────────────────────────
93
+
94
+ export {
95
+ broadcast,
96
+ broadcastWithFeeGrant,
97
+ createSafeBroadcaster,
98
+ createClient,
99
+ buildRegistry,
100
+ lcd,
101
+ MSG_TYPES,
102
+ } from './cosmjs-setup.js';
103
+
104
+ // ─── Address Conversion ─────────────────────────────────────────────────────
105
+
106
+ export {
107
+ sentToSentprov,
108
+ sentToSentnode,
109
+ sentprovToSent,
110
+ } from './cosmjs-setup.js';
111
+
112
+ // ─── Query Helpers (plans, subscriptions, network) ──────────────────────────
113
+
114
+ export {
115
+ discoverPlans,
116
+ queryPlanSubscribers,
117
+ getPlanStats,
118
+ queryPlanNodes,
119
+ getNetworkOverview,
120
+ } from './cosmjs-setup.js';
121
+
122
+ // ─── Session Encoders ───────────────────────────────────────────────────────
123
+
124
+ export {
125
+ encodeMsgStartSession,
126
+ encodeMsgEndSession,
127
+ encodeMsgStartSubscription,
128
+ encodeMsgSubStartSession,
129
+ encodeMsgCancelSubscription,
130
+ encodeMsgRenewSubscription,
131
+ encodeMsgShareSubscription,
132
+ encodeMsgUpdateSubscription,
133
+ encodeMsgUpdateSession,
134
+ } from './v3protocol.js';
package/package.json ADDED
@@ -0,0 +1,113 @@
1
+ {
2
+ "name": "blue-js-sdk",
3
+ "version": "2.0.0",
4
+ "description": "Decentralized VPN SDK for the Sentinel P2P bandwidth network. WireGuard + V2Ray tunnels, Cosmos blockchain, 900+ nodes across 90+ countries. TypeScript types included.",
5
+ "type": "module",
6
+ "main": "index.js",
7
+ "types": "types/index.d.ts",
8
+ "bin": {
9
+ "sentinel": "./cli/index.js",
10
+ "sentinel-ai": "./ai-path/cli.js"
11
+ },
12
+ "exports": {
13
+ ".": {
14
+ "types": "./types/index.d.ts",
15
+ "default": "./index.js"
16
+ },
17
+ "./consumer": "./consumer.js",
18
+ "./operator": "./operator.js",
19
+ "./ai-path": "./ai-path/index.js",
20
+ "./blue": {
21
+ "types": "./dist/index.d.ts",
22
+ "default": "./dist/index.js"
23
+ }
24
+ },
25
+ "typesVersions": {
26
+ "*": {
27
+ "types/*": [
28
+ "types/*"
29
+ ]
30
+ }
31
+ },
32
+ "engines": {
33
+ "node": ">=20.0.0"
34
+ },
35
+ "files": [
36
+ "*.js",
37
+ "types/",
38
+ "chain/",
39
+ "connection/",
40
+ "protocol/",
41
+ "wallet/",
42
+ "security/",
43
+ "pricing/",
44
+ "speedtest/",
45
+ "state/",
46
+ "client/",
47
+ "cli/",
48
+ "config/",
49
+ "errors/",
50
+ "examples/",
51
+ "ai-path/",
52
+ "bin/setup.js",
53
+ "dist/",
54
+ "src/",
55
+ "generated/",
56
+ "proto/",
57
+ "tsconfig.json",
58
+ "tsconfig.build.json",
59
+ "README.md",
60
+ "CHANGELOG.md",
61
+ "LICENSE"
62
+ ],
63
+ "scripts": {
64
+ "build": "npx tsc --project tsconfig.build.json",
65
+ "proto:generate": "npx protoc --ts_proto_out=generated --ts_proto_opt=esModuleInterop=true --ts_proto_opt=env=node --ts_proto_opt=outputTypeRegistry=true --proto_path=proto proto/sentinel/types/v1/*.proto proto/sentinel/node/v3/*.proto proto/sentinel/session/v3/*.proto proto/sentinel/plan/v3/*.proto proto/sentinel/subscription/v3/*.proto proto/sentinel/lease/v1/*.proto proto/sentinel/provider/v2/*.proto",
66
+ "test": "node test/smoke.js",
67
+ "test:exports": "node -e \"import('./index.js').then(m => console.log(Object.keys(m).length + ' exports OK'))\"",
68
+ "postinstall": "node bin/setup.js || true"
69
+ },
70
+ "keywords": [
71
+ "vpn",
72
+ "dvpn",
73
+ "sentinel",
74
+ "decentralized",
75
+ "wireguard",
76
+ "v2ray",
77
+ "p2p",
78
+ "privacy",
79
+ "cosmos",
80
+ "blockchain",
81
+ "socks5",
82
+ "tunnel",
83
+ "bandwidth",
84
+ "peer-to-peer",
85
+ "censorship-resistant",
86
+ "typescript"
87
+ ],
88
+ "license": "MIT",
89
+ "repository": {
90
+ "type": "git",
91
+ "url": "https://github.com/Sentinel-Autonomybuilder/sentinel-dvpn-sdk.git"
92
+ },
93
+ "bugs": {
94
+ "url": "https://github.com/Sentinel-Autonomybuilder/sentinel-dvpn-sdk/issues"
95
+ },
96
+ "homepage": "https://github.com/Sentinel-Autonomybuilder/sentinel-dvpn-sdk#readme",
97
+ "dependencies": {
98
+ "@cosmjs/amino": "0.32.2",
99
+ "@cosmjs/crypto": "0.32.2",
100
+ "@cosmjs/encoding": "0.32.2",
101
+ "@cosmjs/proto-signing": "0.32.2",
102
+ "@cosmjs/stargate": "0.32.2",
103
+ "@noble/curves": "^1.4.0",
104
+ "axios": "^1.7.0",
105
+ "dotenv": "^16.4.0",
106
+ "socks-proxy-agent": "^8.0.0"
107
+ },
108
+ "devDependencies": {
109
+ "@bufbuild/protobuf": "^2.11.0",
110
+ "ts-proto": "^2.11.6",
111
+ "typescript": "^6.0.2"
112
+ }
113
+ }
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Plan, Provider & Lease Operations for Sentinel dVPN
3
+ *
4
+ * Contains all encoder functions for plan management, provider registration,
5
+ * and node leasing. These are the 10 message types NOT in v3protocol.js.
6
+ *
7
+ * v3protocol.js handles: direct session, subscription, sub-session (3 types)
8
+ * This file handles: provider (3), plan (4), lease (2), plan-session (1) = 10 types
9
+ */
10
+
11
+ // ─── Protobuf Encoding Primitives ────────────────────────────────────────────
12
+ // Shared with v3protocol.js — single source of truth for protobuf encoding.
13
+ import { encodeVarint, protoString, protoInt64, protoEmbedded, decToScaledInt, encodePrice } from './v3protocol.js';
14
+
15
+ // protoUint64 is identical to protoInt64 — both use varint wire type 0
16
+ function protoUint64(fieldNum, n) {
17
+ return protoInt64(fieldNum, n);
18
+ }
19
+
20
+ function protoBool(fieldNum, val) {
21
+ if (!val) return Buffer.alloc(0); // false = omit (protobuf default)
22
+ return Buffer.concat([encodeVarint((BigInt(fieldNum) << 3n) | 0n), encodeVarint(1)]);
23
+ }
24
+
25
+ // decToScaledInt and encodePrice imported from v3protocol.js (single source of truth)
26
+
27
+ /**
28
+ * Encode google.protobuf.Duration { seconds, nanos }
29
+ * Used by MsgCreatePlanRequest for plan duration.
30
+ */
31
+ function encodeDuration({ seconds, nanos = 0 }) {
32
+ return Buffer.concat([
33
+ protoInt64(1, seconds),
34
+ nanos ? protoInt64(2, nanos) : Buffer.alloc(0),
35
+ ]);
36
+ }
37
+
38
+ // ─── Provider Messages ───────────────────────────────────────────────────────
39
+
40
+ /**
41
+ * MsgRegisterProviderRequest (sentinel.provider.v3)
42
+ * Register a new provider. One wallet = one provider.
43
+ * from: sent prefix (account address)
44
+ */
45
+ export function encodeMsgRegisterProvider({ from, name, identity, website, description }) {
46
+ return Uint8Array.from(Buffer.concat([
47
+ protoString(1, from),
48
+ protoString(2, name),
49
+ protoString(3, identity || ''),
50
+ protoString(4, website || ''),
51
+ protoString(5, description || ''),
52
+ ]));
53
+ }
54
+
55
+ /**
56
+ * MsgUpdateProviderDetailsRequest (sentinel.provider.v3)
57
+ * Update existing provider info.
58
+ * from: sentprov prefix (provider address)
59
+ */
60
+ export function encodeMsgUpdateProviderDetails({ from, name, identity, website, description }) {
61
+ return Uint8Array.from(Buffer.concat([
62
+ protoString(1, from),
63
+ protoString(2, name || ''),
64
+ protoString(3, identity || ''),
65
+ protoString(4, website || ''),
66
+ protoString(5, description || ''),
67
+ ]));
68
+ }
69
+
70
+ /**
71
+ * MsgUpdateProviderStatusRequest (sentinel.provider.v3)
72
+ * Activate/deactivate provider. Status: 1=active, 2=inactive_pending, 3=inactive
73
+ * from: sentprov prefix (provider address — use sentToSentprov() to derive)
74
+ */
75
+ export function encodeMsgUpdateProviderStatus({ from, status }) {
76
+ return Uint8Array.from(Buffer.concat([
77
+ protoString(1, from),
78
+ protoInt64(2, status),
79
+ ]));
80
+ }
81
+
82
+ // ─── Plan Messages ───────────────────────────────────────────────────────────
83
+
84
+ /**
85
+ * MsgCreatePlanRequest (sentinel.plan.v3)
86
+ * Create a new subscription plan.
87
+ * from: sentprov prefix (provider address)
88
+ * bytes: total bandwidth as string (e.g. "10000000000" for 10GB)
89
+ * duration: { seconds: N } — plan validity period
90
+ * prices: [{ denom, base_value, quote_value }] — subscription cost
91
+ * isPrivate: boolean
92
+ *
93
+ * NOTE: Plans start INACTIVE by default — must send MsgUpdatePlanStatusRequest separately!
94
+ */
95
+ export function encodeMsgCreatePlan({ from, bytes, duration, prices, isPrivate }) {
96
+ const parts = [protoString(1, from)];
97
+ if (bytes) parts.push(protoString(2, String(bytes)));
98
+ if (duration) parts.push(protoEmbedded(3, encodeDuration(
99
+ typeof duration === 'number' ? { seconds: duration } : duration
100
+ )));
101
+ for (const p of (prices || [])) {
102
+ parts.push(protoEmbedded(4, encodePrice(p)));
103
+ }
104
+ if (isPrivate) parts.push(protoBool(5, true));
105
+ return Uint8Array.from(Buffer.concat(parts));
106
+ }
107
+
108
+ /**
109
+ * MsgUpdatePlanStatusRequest (sentinel.plan.v3)
110
+ * Activate/deactivate a plan. Status: 1=active, 2=inactive_pending, 3=inactive
111
+ * from: sentprov prefix (provider address)
112
+ */
113
+ export function encodeMsgUpdatePlanStatus({ from, id, status }) {
114
+ return Uint8Array.from(Buffer.concat([
115
+ protoString(1, from),
116
+ protoUint64(2, id),
117
+ protoInt64(3, status),
118
+ ]));
119
+ }
120
+
121
+ /**
122
+ * MsgLinkNodeRequest (sentinel.plan.v3)
123
+ * Link a leased node to a plan. Requires active lease for the node.
124
+ * from: sentprov prefix (provider address)
125
+ */
126
+ export function encodeMsgLinkNode({ from, id, nodeAddress }) {
127
+ return Uint8Array.from(Buffer.concat([
128
+ protoString(1, from),
129
+ protoUint64(2, id),
130
+ protoString(3, nodeAddress),
131
+ ]));
132
+ }
133
+
134
+ /**
135
+ * MsgUnlinkNodeRequest (sentinel.plan.v3)
136
+ * Remove a node from a plan.
137
+ * from: sentprov prefix (provider address)
138
+ */
139
+ export function encodeMsgUnlinkNode({ from, id, nodeAddress }) {
140
+ return Uint8Array.from(Buffer.concat([
141
+ protoString(1, from),
142
+ protoUint64(2, id),
143
+ protoString(3, nodeAddress),
144
+ ]));
145
+ }
146
+
147
+ /**
148
+ * MsgStartSessionRequest (sentinel.plan.v3) — COMBINED subscribe + session
149
+ * Subscribes to a plan AND starts a session in one TX.
150
+ * from: sent prefix (account address)
151
+ */
152
+ export function encodeMsgPlanStartSession({ from, id, denom = 'udvpn', renewalPricePolicy = 0, nodeAddress }) {
153
+ const parts = [
154
+ protoString(1, from),
155
+ protoUint64(2, id),
156
+ protoString(3, denom),
157
+ ];
158
+ if (renewalPricePolicy) parts.push(protoInt64(4, renewalPricePolicy));
159
+ if (nodeAddress) parts.push(protoString(5, nodeAddress));
160
+ return Uint8Array.from(Buffer.concat(parts));
161
+ }
162
+
163
+ // ─── Lease Messages ──────────────────────────────────────────────────────────
164
+
165
+ /**
166
+ * MsgStartLeaseRequest (sentinel.lease.v1)
167
+ * Lease a node from its operator. Provider pays node's hourly price.
168
+ * from: sentprov prefix (provider address)
169
+ *
170
+ * CRITICAL: maxPrice must EXACTLY match the node's hourly_prices from LCD.
171
+ * Any mismatch → "invalid price" error.
172
+ */
173
+ export function encodeMsgStartLease({ from, nodeAddress, hours, maxPrice, renewalPricePolicy = 0 }) {
174
+ const parts = [
175
+ protoString(1, from),
176
+ protoString(2, nodeAddress),
177
+ protoInt64(3, hours),
178
+ ];
179
+ if (maxPrice) parts.push(protoEmbedded(4, encodePrice(maxPrice)));
180
+ if (renewalPricePolicy) parts.push(protoInt64(5, renewalPricePolicy));
181
+ return Uint8Array.from(Buffer.concat(parts));
182
+ }
183
+
184
+ /**
185
+ * MsgEndLeaseRequest (sentinel.lease.v1)
186
+ * End an active lease.
187
+ * from: sentprov prefix (provider address)
188
+ */
189
+ export function encodeMsgEndLease({ from, id }) {
190
+ return Uint8Array.from(Buffer.concat([
191
+ protoString(1, from),
192
+ protoUint64(2, id),
193
+ ]));
194
+ }
195
+
196
+ // ─── Exported Helpers ────────────────────────────────────────────────────────
197
+
198
+ export { encodePrice, encodeDuration, decToScaledInt };
199
+ export { encodeVarint, protoString, protoInt64, protoUint64, protoBool, protoEmbedded };