stack_epic_api/foreign_rpc.rs
1// Copyright 2020 The Grin Developers
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15//! JSON-RPC Stub generation for the Foreign API
16
17use crate::core::core::hash::Hash;
18use crate::core::core::transaction::Transaction;
19use crate::foreign::Foreign;
20
21use crate::pool::{BlockChain, PoolAdapter, PoolEntry};
22use crate::rest::Error;
23use crate::types::{
24 BlockHeaderPrintable, BlockPrintable, LocatedTxKernel, OutputListing, OutputPrintable, Tip,
25 Version,
26};
27use crate::util;
28use epic_core::core::TxKernel;
29
30/// Public definition used to generate Node jsonrpc api.
31/// * When running `epic` with defaults, the V2 api is available at
32/// `localhost:3413/v2/foreign`
33/// * The endpoint only supports POST operations, with the json-rpc request as the body
34#[easy_jsonrpc_mw::rpc]
35pub trait ForeignRpc: Sync + Send {
36 /**
37 Networked version of [Foreign::get_header](struct.Node.html#method.get_header).
38
39 # Json rpc example
40
41 ```
42 # epic_api::doctest_helper_json_rpc_foreign_assert_response!(
43 # r#"
44 {
45 "jsonrpc": "2.0",
46 "method": "get_header",
47 "params": [null, "00000100c54dcb7a9cbb03aaf55da511aca2c98b801ffd45046b3991e4f697f9", null],
48 "id": 1
49 }
50 # "#
51 # ,
52 # r#"
53 {
54 "id": 1,
55 "jsonrpc": "2.0",
56 "result": {
57 "Ok": {
58 "cuckoo_solution": [
59 9886309,
60 35936712,
61 43170402,
62 48069549,
63 70022151,
64 97464262,
65 107044653,
66 108342481,
67 118947913,
68 130828808,
69 144192311,
70 149269998,
71 179888206,
72 180736988,
73 207416734,
74 227431174,
75 238941623,
76 245603454,
77 261819503,
78 280895459,
79 284655965,
80 293675096,
81 297070583,
82 299129598,
83 302141405,
84 313482158,
85 321703003,
86 351704938,
87 376529742,
88 381955038,
89 383597880,
90 408364901,
91 423241240,
92 436882285,
93 442043438,
94 446377997,
95 470779425,
96 473427731,
97 477149621,
98 483204863,
99 496335498,
100 534567776
101 ],
102 "edge_bits": 29,
103 "hash": "00000100c54dcb7a9cbb03aaf55da511aca2c98b801ffd45046b3991e4f697f9",
104 "height": 374336,
105 "kernel_root": "d294e6017b9905b288dc62f6f725c864665391c41da20a18a371e3492c448b88",
106 "nonce": 4715085839955132421,
107 "output_root": "12464313f7cd758a7761f65b2837e9b9af62ad4060c97180555bfc7e7e5808fa",
108 "prev_root": "e22090fefaece85df1441e62179af097458e2bdcf600f8629b977470db1b6db1",
109 "previous": "0000015957d92c9e04c6f3aec8c5b9976f3d25f52ff459c630a01a643af4a88c",
110 "range_proof_root": "4fd9a9189e0965aa9cdeb9cf7873ecd9e6586eac1dd9ca3915bc50824a253b02",
111 "secondary_scaling": 561,
112 "timestamp": "2019-10-03T16:08:11+00:00",
113 "total_difficulty": 1133587428693359,
114 "total_kernel_offset": "0320b6f8a4a4180ed79ecd67c8059c1d7bd74afe144d225395857386e5822314",
115 "version": 2
116 }
117 }
118 }
119 # "#
120 # );
121 ```
122 */
123 fn get_header(
124 &self,
125 height: Option<u64>,
126 hash: Option<String>,
127 commit: Option<String>,
128 ) -> Result<BlockHeaderPrintable, Error>;
129
130 /**
131 Networked version of [Foreign::get_block](struct.Node.html#method.get_block).
132
133 # Json rpc example
134
135 ```
136 # epic_api::doctest_helper_json_rpc_foreign_assert_response!(
137 # r#"
138 {
139 "jsonrpc": "2.0",
140 "method": "get_block",
141 "params": [374274, null, null],
142 "id": 1
143 }
144 # "#
145 # ,
146 # r#"
147 {
148 "id": 1,
149 "jsonrpc": "2.0",
150 "result": {
151 "Ok": {
152 "header": {
153 "cuckoo_solution": [
154 1263501,
155 14648727,
156 42430559,
157 58137254,
158 68666726,
159 72784903,
160 101936839,
161 104273571,
162 123886748,
163 131179768,
164 155443226,
165 162493783,
166 164784425,
167 167313215,
168 169806918,
169 183041591,
170 184403611,
171 210351649,
172 215159650,
173 239995384,
174 240935454,
175 257742462,
176 280820644,
177 300143903,
178 303146496,
179 311804841,
180 341039986,
181 354918290,
182 363508555,
183 377618528,
184 396693709,
185 397417856,
186 399875872,
187 413238540,
188 413767813,
189 432697194,
190 436903767,
191 447257325,
192 453337210,
193 459401597,
194 496068509,
195 511300624
196 ],
197 "edge_bits": 29,
198 "hash": "000001e16cb374e38c979c353a0aaffbf5b939da7688f69ad99efda6c112ea9b",
199 "height": 374274,
200 "kernel_root": "e17920c0e456a6feebf19e24a46f510a85f21cb60e81012f843c00fe2c4cad6e",
201 "nonce": 4354431877761457166,
202 "output_root": "1e9daee31b80c6b83573eacfd3048a4af57c614bd36f9acd5fb50fbd236beb16",
203 "prev_root": "9827b8ffab942e264b6ac81f2b487e3de65e411145c514092ce783df9344fa8a",
204 "previous": "00001266a73ba6a8032ef8b4d4f5508407ffb1c270c105dac06f4669c17af020",
205 "range_proof_root": "3491b8c46a3919df637a636ca72824377f89c4967dcfe4857379a4a82b510069",
206 "secondary_scaling": 571,
207 "timestamp": "2019-10-03T15:15:35+00:00",
208 "total_difficulty": 1133438031814173,
209 "total_kernel_offset": "63315ca0be65c9f6ddf2d3306876caf9f458a01d1a0bf50cc4d3c9b699161958",
210 "version": 2
211 },
212 "inputs": [],
213 "kernels": [
214 {
215 "excess": "08761e9cb1eea5bfcf771d1218b5ec802798d6eecaf75faae50ba3a1997aaef009",
216 "excess_sig": "971317046c533d21dff3e449cc9380c2be10b0274f70e009aa2453f755239e3299883c09a1785b15a141d89d563cdd59395886c7d63aba9c2b6438575555e2c4",
217 "features": "Coinbase",
218 "fee": 0,
219 "lock_height": 0
220 }
221 ],
222 "outputs": [
223 {
224 "block_height": 374274,
225 "commit": "09d33615563ba2d65acc2b295a024337166b9f520122d49730c73e8bfb43017610",
226 "merkle_proof": "00000000003e6f5e000000000000000f60fe09a7601a519d9be71135404580ad9de0964c70a7619b1731dca2cd8c1ae1dce9f544df671d63ff0e05b58f070cb48e163ca8f44fb4446c9fe1fc9cfef90e4b81e7119e8cf60acb9515363ecaea1ce20d2a8ea2f6f638f79a33a19d0d7b54cfff3daf8d21c243ba4ccd2c0fbda833edfa2506b1b326059d124e0c2e27cda90268e66f2dcc7576efac9ebbb831894d7776c191671c3294c2ca0af23201498a7f5ce98d5440ca24116b40ac98b1c5e38b28c8b560afc4f4684b81ab34f8cf162201040d4779195ba0e4967d1dd8184b579208e9ebebafa2f5004c51f5902a94bf268fd498f0247e8ba1a46efec8d88fa44d5ecb206fbe728ee56c24af36442eba416ea4d06e1ea267309bc2e6f961c57069e2525d17e78748254729d7fdec56720aa85fe6d89b2756a7eeed0a7aa5d13cfb874e3c65576ec8a15d6df17d7d4856653696b10fb9ec205f5e4d1c7a1f3e2dd2994b12eeed93e84776d8dcd8a5d78aecd4f96ae95c0b090d104adf2aa84f0a1fbd8d319fea5476d1a306b2800716e60b00115a5cca678617361c5a89660b4536c56254bc8dd7035d96f05de62b042d16acaeff57c111fdf243b859984063e3fcfdf40c4c4a52889706857a7c3e90e264f30f40cc87bd20e74689f14284bc5ea0a540950dfcc8d33c503477eb1c60",
227 "mmr_index": 4091742,
228 "output_type": "Coinbase",
229 "proof": "7adae7bcecf735c70eaa21e8fdce1d3c83d7b593f082fc29e16ff2c64ee5aaa15b682e5583257cf351de457dda8f877f4d8c1492af3aaf25cf5f496fce7ca54a0ef78cc61c4252c490386f3c69132960e9edc811add6415a6026d53d604414a5f4dd330a63fcbb005ba908a45b2fb1950a9529f793405832e57c89a36d3920715bc2d43db16a718ecd19aeb23428b5d3eeb89d73c28272a7f2b39b8923e777d8eb2c5ce9872353ba026dc79fdb093a6538868b4d184215afc29a9f90548f9c32aa663f9197fea1cadbb28d40d35ed79947b4b2b722e30e877a15aa2ecf95896faad173af2e2795b36ce342dfdacf13a2f4f273ab9927371f52913367d1d58246a0c35c8f0d2330fcddb9eec34c277b1cfdaf7639eec2095930b2adef17e0eb94f32e071bf1c607d2ef1757d66647477335188e5afc058c07fe0440a67804fbdd5d35d850391ead3e9c8a3136ae1c42a33d5b01fb2c6ec84a465df3f74358cbc28542036ae4ef3e63046fbd2bce6b12f829ed193fb51ea87790e88f1ea686d943c46714b076fb8c6be7c577bca5b2792e63d5f7b8f6018730b6f9ddaf5758a5fa6a3859d68b317ad4383719211e78f2ca832fd34c6a222a8488e40519179209ad1979f3095b7b7ba7f57e81c371989a4ace465149b0fe576d89473bc596c54cee663fbf78196e7eb31e4d56604c5226e9242a68bda95e1b45473c52f63fe865901839e82079a9935e25fe8d44e339484ba0a62d20857c6b3f15ab5c56b59c7523b63f86fa8977e3f4c35dc8b1c446c48a28947f9d9bd9992763404bcba95f94b45d643f07bb7c352bfad30809c741938b103a44218696206ca1e18f0b10b222d8685cc1ed89d5fdb0c7258b66486e35c0fd560a678864fd64c642b2b689a0c46d1be6b402265b7808cd61a95c2b4a4df280e3f0ec090197fb039d32538d05d3f0a082f5",
230 "proof_hash": "cfd97db403c274220bb0dbaf3ecc88e483c0b707d8e6f16dfda37cd4f2c3211c",
231 "spent": false
232 }
233 ]
234 }
235 }
236 }
237 # "#
238 # );
239 ```
240 */
241 fn get_block(
242 &self,
243 height: Option<u64>,
244 hash: Option<String>,
245 commit: Option<String>,
246 ) -> Result<BlockPrintable, Error>;
247
248 /*
249 # Json rpc example
250
251 ```
252 # epic_api::doctest_helper_json_rpc_foreign_assert_response!(
253 # r#"
254 {
255 "jsonrpc": "2.0",
256 "method": "get_blocks",
257 "params": [1, 3, null, null],
258 "id": 1
259 }
260 */
261
262 fn get_blocks(
263 &self,
264 start_height: Option<u64>,
265 end_height: Option<u64>,
266 hash: Option<String>,
267 commit: Option<String>,
268 ) -> Result<Vec<BlockPrintable>, Error>;
269
270 /**
271 Networked version of [Foreign::get_version](struct.Node.html#method.get_version).
272
273 # Json rpc example
274
275 ```
276 # epic_api::doctest_helper_json_rpc_foreign_assert_response!(
277 # r#"
278 {
279 "jsonrpc": "2.0",
280 "method": "get_version",
281 "params": [],
282 "id": 1
283 }
284 # "#
285 # ,
286 # r#"
287 {
288 "id": 1,
289 "jsonrpc": "2.0",
290 "result": {
291 "Ok": {
292 "node_version": "2.1.0-beta.2",
293 "block_header_version": 2
294 }
295 }
296 }
297 # "#
298 # );
299 ```
300 */
301 fn get_version(&self) -> Result<Version, Error>;
302
303 /**
304 Networked version of [Foreign::get_tip](struct.Node.html#method.get_tip).
305
306 # Json rpc example
307
308 ```
309 # epic_api::doctest_helper_json_rpc_foreign_assert_response!(
310 # r#"
311 {
312 "jsonrpc": "2.0",
313 "method": "get_tip",
314 "params": [],
315 "id": 1
316 }
317 # "#
318 # ,
319 # r#"
320 {
321 "id": 1,
322 "jsonrpc": "2.0",
323 "result": {
324 "Ok": {
325 "height": 374350,
326 "last_block_pushed": "000000543c69a0306b5463b92939643442a44a6d9be5bef72bea9fc1d718d310",
327 "prev_block_to_last": "000001237c6bac162f1add2b122fab6a254b9fcc2c4b4c8c632a8c39855521f1",
328 "total_difficulty": 1133621604919005
329 }
330 }
331 }
332 # "#
333 # );
334 ```
335 */
336 fn get_tip(&self) -> Result<Tip, Error>;
337
338 /**
339 Networked version of [Foreign::get_kernel](struct.Node.html#method.get_kernel).
340
341 # Json rpc example
342
343 ```
344 # epic_api::doctest_helper_json_rpc_foreign_assert_response!(
345 # r#"
346 {
347 "jsonrpc": "2.0",
348 "method": "get_kernel",
349 "params": ["09c868a2fed619580f296e91d2819b6b3ae61ab734bf3d9c3eafa6d9700f00361b", null, null],
350 "id": 1
351 }
352 # "#
353 # ,
354 # r#"
355 {
356 "id": 1,
357 "jsonrpc": "2.0",
358 "result": {
359 "Ok": {
360 "height": 374557,
361 "mmr_index": 2211662,
362 "tx_kernel": {
363 "excess": "09c868a2fed619580f296e91d2819b6b3ae61ab734bf3d9c3eafa6d9700f00361b",
364 "excess_sig": "1720ec1b94aa5d6ba4d567f7446314f9a6d064eea69c5675cc5659f65f290d80b0e9e3a48d818cadba0a4e894bbc6eb6754b56f53813e2ee0b1447969894ca4a",
365 "features": "Coinbase"
366 }
367 }
368 }
369 }
370 # "#
371 # );
372 ```
373 */
374 fn get_kernel(
375 &self,
376 excess: String,
377 min_height: Option<u64>,
378 max_height: Option<u64>,
379 ) -> Result<LocatedTxKernel, Error>;
380
381 /*
382 # Json rpc example
383
384 ```
385 # epic_api::doctest_helper_json_rpc_foreign_assert_response!(
386 # r#"
387 {
388 "jsonrpc": "2.0",
389 "method": "get_last_n_kernels",
390 "params": [1],
391 "id": 1
392 }
393 # "#
394 # ,
395 # r#"
396 {
397 "id": 1,
398 "jsonrpc": "2.0",
399 "result": {
400 "Ok": [
401 {
402 "excess": "08fa0cecd81956afb1b45cb749ff04291c9d8b711c780921995d81f5710f663ccd",
403 "excess_sig": "db717651f56341bdfcfe90427f5aa2c7dae81a46090301194259f9bbc2f98c9c5154a65a9c6ce9c0d9851383a4f0fe63d42b2ca93247322f4830788c947168b1",
404 "features": "Coinbase"
405 }
406 ]
407 }
408 }
409 # "#
410 # );
411 ```
412 */
413
414 fn get_last_n_kernels(&self, distance: u64) -> Result<Vec<TxKernel>, Error>;
415
416 /**
417 Networked version of [Foreign::get_outputs](struct.Node.html#method.get_outputs).
418
419 # Json rpc example
420
421 ```
422 # epic_api::doctest_helper_json_rpc_foreign_assert_response!(
423 # r#"
424 {
425 "jsonrpc": "2.0",
426 "method": "get_outputs",
427 "params": [
428 [
429 "09bab2bdba2e6aed690b5eda11accc13c06723ca5965bb460c5f2383655989af3f",
430 "08ecd94ae293863286e99d37f4685f07369bc084ba74d5c59c7f15359a75c84c03"
431 ],
432 376150,
433 376154,
434 true,
435 true
436 ],
437 "id": 1
438 }
439 # "#
440 # ,
441 # r#"
442 {
443 "id": 1,
444 "jsonrpc": "2.0",
445 "result": {
446 "Ok": [
447 {
448 "block_height": 374568,
449 "commit": "09bab2bdba2e6aed690b5eda11accc13c06723ca5965bb460c5f2383655989af3f",
450 "merkle_proof": null,
451 "mmr_index": 4093403,
452 "output_type": "Transaction",
453 "proof": "e30aa961d6f89361a9a3c60f73e3551f50a3887212e524b5874ac50c1759bb95bc8e588d82dd51d84c7cbaa9abe79e0b8fe902bcfda17276c24d269fbf636aa2016c65a760a02e18338a33e83dec8e51fbfd953ee5b765d97ce39ba0850790d2104812a1d15d5eaa174de548144d3a7d413906d85e22f89065ef727910ee4c573494520c43e36e83dacee8096666aa4033b5e8322e72930c3f8476bb7be9aef0838a2ad6c28f4f5212708bf3e5954fc3971d66b7835383b96406fa65415b64ecd53a747f41d785c3e3615c18dfdbe39a0920fefcf6bc55fe65b4b215b1ad98c80fdafbef6f21ab60596f2d9a3e7bc45d750e807d5eb883dadde1625d4f20af9f1315b8bea08c97fad922afe2000c84c9eb5f96b2a24da7a637f95c1102ecfc1257e19bc4120082f5ee76448c90abd55108256f8341e0f4009cfc3906a598de465467ee1ee072bfd3384e1a0b9039192d1edc33092d7b09d1164c4fc4c378227a391600a8a5d5ba5fe36a2a4eabe0dbae270aefa5a5f2df810cda79211805206ad93ae08689e2675aad025db3499d43f1effc110dfb2f540ccd6eb972c02f98e8151535c099381c8aeb1ea8aad2cfdf952e6ab9d26e74a5611d943d02315e212eb06ce2cd20b4675e6f245e5302cdb8b31d46bb2e718b50ecfad2d440323826570447c2498376c8bad6e4ee97bde41c47f6a20eea406d758c53fb9e8542f114c1a277a6335ad97fdc542c6bbec756dc4a9085c319fe6f0c9e1bb043f01a43c12aa6f4dff8b1220e7f16bc56dee9ccb59fb7c3b7aa6bb33b41c33d8e4b03b6b9cb89491504210dd691b46ffe2862387339d2b62a9dc4c20d629e23eb8b06490c4999433c1b4626fb4d21517072bd8e82511c115ee47bf9a5e40f0a74177f5b573db2e277459877a01b172e026cbb3f76aaf0c61f244584f3a76804dea62175a80d777238",
454 "proof_hash": "660d706330fc36f611c50d90cb965fddf750cc91f8891a58b5e39b83a5fc6b46",
455 "spent": false
456 },
457 {
458 "block_height": 376151,
459 "commit": "08ecd94ae293863286e99d37f4685f07369bc084ba74d5c59c7f15359a75c84c03",
460 "merkle_proof": "6b2abbd334c9d75409461fba9c1acd4a8d7bc2ab0bc43143f42388b2a3a87b881505ccf8ffc8737fa6fd4fe412a082d974911bd223eae612d0d1d7ddcc09b5e6079c40b011405b2ccb49ce32473c93aea6d843488d5765fea114d3368d34cd05fcb8c2de3903fbaf39b1f064c809f9f1c0d47959d81a508957040eda55c6dce6dd8c43a79c72faffacfabe1d73055790b6249de2f7c603f186cb109eee58fb1426ea48cb781f88df9acd8996d235fe6bfe60e02aae6e3bfe38ed2599baca1430b3b637072d9bdcdc7644f873728e3cd38eff7124ea848cfad67f8e114cf8595c89a3686a4271cfb2b5098597c315c01d04270ca8f70262af967a947f49adacfa4aad8b6fd196dd0ef4e5cefa132c38c7e5f43db12b3d74f0a8d83c3404e73c6b25a12bff70a8ef4526c89b1558810bb744ede53f8c4cc8cc2555e953637722adb41ea5752281cf1f75599f7e59b17f11f5f9ce4f6b2da4141a3398f51d8b834cdc8b00f61915a41d200572a10bb2102cbae7e94aa7ced3c388dcd58282932c99a8fa66f6fc511ff3e8c60d442bbdb49cca1166328ca8c9bbc97d024570b4cc1ca6c7dba3db223e9e27fd9345b94d3cf10e2b54915b87c57e32965bc2db1b1f956d1962812738ca9b2c93fd7825adf4dffddc97aa85ca0f3f412f02d30678a816d2efbfb6778305fd5e610b6e8af30030bc059880c337bfde326b392d5dcd7c36cb0076fbccc7099b94f1f03bdb525d6e3818b6d50b93ced802957a4b03892c71b6679052bd35e92ceea71a96b22b2ed2c129755f0c74fa172f43da2790f3132a7e57e408d2fc5f1126b088cd0398e6dedcb237242e6720e12e8d7a5a1e196eda6241cfee1cc85e9d20af67f3f9bdf91160516ebcd0b8da6bb7b12229e1112b22c9f1aaef1d75441465cfee2ac1c47b5255514316ed4637e192b00ff28491168f2f2b00",
461 "mmr_index": 4107711,
462 "output_type": "Coinbase",
463 "proof": "7083884b5f64e4e61fb910d2c3c603f7c94490716d95e7144b4c927d0ca6ccc0e069cc285e25f38ee90c402ef26005cad2b4073eeba17f0ae3ea2b87095106ef00634f321d8a49c2feaad485bc9ee552564a6a883c99886d0d3a85af3490d718f5a5cbc70f9dcc9bf5d987fb6072132a4c247d4bbd4af927532a887b1e4250b7277771f6b82f43f4fb5a48089ed58e7d3190a19197e07acfed650f8b2cd5f103e994fb3d3735c5727f06f302bd1f182586297dd57a7951ff296bdf6106704abedc39db77f1293effaa7496a77d19420a6208bc1c589b33dad9540cb6180cccf5e085006b01309419f931e54531d770e5fe00eca584072692a7e4883fd65ed4a7c460665608ab96bf0c7d564fe96a341f14066db413a6fddc359eb11f6f962aca70ca1414c35d7941ce06b77d0a0606081b78d5e64a4501f8e8eba9f0e0889042bc54b4cbfd71087a95af63e0306dba214084d4860b0ce66dc80af44224e5a6fef55800650b05cf1639f81bfdc30950f3634d1fd4375d50c22c7f13f3dfb690e5f155a535aff041b7f800bfe74c60f606e8ab47df60754a0e08221c2a50abe643bb086433afd040a7e6290d1d00b3fe657be3bb05c67f90eb183c2acb53c81e1ca15cd8d35fe9d7d52d8f455398e905bdc77ffb211697d477af25704cf9896e8ce797f4fed03e2ba1615e3ad5646eecaa698470f99437d01d5193f041201502763e8bde51e6dc830b5c676d05c8f7f87c4972c578b8d9d5922ba29f6e4a89a123311d02b5ac44a7d5307f7ed5e4e66aaf749afc76c6fc1114445d6fafeea816a0f985eeacdbe9e6d32a8514ca4aaf7faad4e9d43cde55327ac84bac4d70a9319840e136e713aa31d639e43302f3c71a79f08f4e5c9a19a48d4b46403734cd8f3cc9b67bc26ea8e2a01e63a6f5be6e044e8ed5db5f26d15d25de75f672a79315c5e2407e",
464 "proof_hash": "7cf77fdaecef6c6fc01edca744c1521581f854a9bac0153971edbb1618fc36ad",
465 "spent": false
466 },
467 {
468 "block_height": 376154,
469 "commit": "095c12db5e57e4a1ead0870219bda4ebfb1419f6ab1501386b9dd8dc9811a8c5ff",
470 "merkle_proof": "00000000003eadc6000000000000000e13c509a17cbb0d81634215cd2482ab6d9eb58b332fcbe6b2c4fa458a63d3cb0dfe3614ebe6e52657870df225d132179fa1ea0fdc2105f0e51d03bc3765a9cd059c60d434a7cae0a3d669b37588c25410f57405c841312cfa50cf514678877a3f4ce8bd3e57723ba75a2b7d61027b2088fbabebdb7336b97ea88b00a7e809a6245def980eba18d987601f4cbd6c3cc9f12a5684fe7a1bc2565a9f8ab63c2db1afa8304f5e23d4754cd97f29c8b06dcb3de4f6d3a83079676b6e9941afe5553a7195384b564ecd6d37522cb5e452cc930d2b549af22698a8fd9bf6cad05a06b09e3f6e672b94e82c0255394b5c187ab76fda653a2491378997ba3d49f9d9c34ca93bc627fe5d98b327c03d429b5473f62672e9d73c4eafd9cb8f62e5158a1ec7eb56653696b10fb9ec205f5e4d1c7a1f3e2dd2994b12eeed93e84776d8dcd8a5d78aecd4f96ae95c0b090d104adf2aa84f0a1fbd8d319fea5476d1a306b2800716e60b00115a5cca678617361c5a89660b4536c56254bc8dd7035d96f05de62b042d16acaeff57c111fdf243b859984063e3fcfdf40c4c4a52889706857a7c3e90e264f30f40cc87bd20e74689f14284bc5ea0a540950dfcc8d33c503477eb1c60",
471 "mmr_index": 4107717,
472 "output_type": "Coinbase",
473 "proof": "073593bc475478f1e4b648ab261df3b0a6e5a58a617176dd0c8f5e0e1d58b012b40eb9b341d16ee22baf3645ea37705895e731dee5c220b58b0f780d781806a10dfa33e870d0494fba18aaa8a7a709bfb3ddf9eb3e4e75a525b382df68dc6f710275cdffb623373c47c1310ae63479826f435ca4520fdc13bb0d995b7d9a10a7587d61bd4a51c9e32c87f3eb6b0f862cdff19a9ac6cb04d6f7fafb8e94508a851dcf5dc6acea4271bb40117a45319da5522b966091b089698f4f940842458b5b49e212d846be35e0c2b98a00ac3d0b7ceaf081272dbed8abd84fe8f26d57bac1340e8184602436ed8c4470ef9dc214df3405de0e71703abec4456b15e122a94706852bb476213ceadf00529d00d8d3b16dc57f4e4a9a86dacfa719e00366728de42f3f830e73f6113f1e391fab07eba1b40f6466203b0ce14701230e934f6138c575660a03dbb0e59d7295df3115a4fc0909a5520d74657b319fc83481079ad6c13400175e39fa2b86071ba563ce8836320713ef8f55d4e90bee3f57df96c7aef0f2e896f57192fae9675471cd9751bcaf2b15e5a65a9733a6f7f9b8147b8f6e8dac51d056018d411fd252225cf88e56f143143f49e8a0d2e43c10de0442dbc84966817532b1256b6769db987526790a389c371a1fe7a36eacffef82877b4db7a9b5e58722ffbd0fc4fdbd7624365ee326bb8b1e60b999f513715b30f37ef6116eabf53b3524b46c33a1fac49205b39e24aa388d823269c1fc43c3599a06b69433a0a47a03bd871321afb7846a6dbfd5891bd84f89c556231745c929d08445f66f332857bfda1c4f86ae58a01007b7303f870ac24e0ba72d84c0ef4903ac2ff777e2c2dcb4d8e303c74e0c8a559686b4d4c25024ee97601787d4e5a97224af41e5d35d91744292f5a41f64d4e1cae77bebebd77a473f3b54e86f7221aac230942f0468",
474 "proof_hash": "5dd69c083e2c0fd797a499bbafedee0728849afa3476034280ecadf6eb4bffc2",
475 "spent": false
476 },
477 {
478 "block_height": 376153,
479 "commit": "0948cb346b7affe004a6f84fa4b5b44995830f1c332b03537df4c258d51d1afb50",
480 "merkle_proof": "00000000003eadc4000000000000000dfe3614ebe6e52657870df225d132179fa1ea0fdc2105f0e51d03bc3765a9cd059c60d434a7cae0a3d669b37588c25410f57405c841312cfa50cf514678877a3f4ce8bd3e57723ba75a2b7d61027b2088fbabebdb7336b97ea88b00a7e809a6245def980eba18d987601f4cbd6c3cc9f12a5684fe7a1bc2565a9f8ab63c2db1afa8304f5e23d4754cd97f29c8b06dcb3de4f6d3a83079676b6e9941afe5553a7195384b564ecd6d37522cb5e452cc930d2b549af22698a8fd9bf6cad05a06b09e3f6e672b94e82c0255394b5c187ab76fda653a2491378997ba3d49f9d9c34ca93bc627fe5d98b327c03d429b5473f62672e9d73c4eafd9cb8f62e5158a1ec7eb56653696b10fb9ec205f5e4d1c7a1f3e2dd2994b12eeed93e84776d8dcd8a5d78aecd4f96ae95c0b090d104adf2aa84f0a1fbd8d319fea5476d1a306b2800716e60b00115a5cca678617361c5a89660b4536c56254bc8dd7035d96f05de62b042d16acaeff57c111fdf243b859984063e3fcfdf40c4c4a52889706857a7c3e90e264f30f40cc87bd20e74689f14284bc5ea0a540950dfcc8d33c503477eb1c60",
481 "mmr_index": 4107716,
482 "output_type": "Coinbase",
483 "proof": "72950da23ad7f0d0381e2f788bf0ac6b6bcb17aaccf0373534122a95714d2d0dbf6a24822b4aab0711a595c80bc36122957111c39292f2a36a973252fb88cbda0b1d61ea8ea84f5171a61f751cac97332637b7cf74cc73144b912ba700dedaa60895f06e947f1e42a8c79d70f924f45fdcb6df5d30289f36ff77d0ae368df5775a739b7a25cbfb63f0cdbdc167b046067c2a021fe0950c7b67515b185b9e4a00ce63b795d49ae184fe5cc726d72fc05d717c4fb55dd5f65967dc282d3c47cb6f8a92cb696e5a1d8cca21214bc766e3de6271791cebf646cda97ae77035da16606f3397f71e103137358c97b9943c3e15403184f61230bd0e3954c7681a0891aa7a0cc32e82d830fb7d8759a04d1da7058630a853508df095142f22158c28bd5e3f2477ad6c8990e63d0377a0fa3d588b6584453778eb38cbaec8a33c1d3772c97a826d4a2f6953c35342993b04567e9fea6fc64fb714653f934faa1a8f635d39eb2903de4bed960a3df07dce7c2e3ff517bbc15f467d0190a579bc07b0f1a910b23269d794835bbb34e8318dcc4fd4159f8f03faa77842d445cf61af9e33caf46aa5fae0812a6476a09c0757e929271a96a245701ab14c1fdd836b92b7e763afa623017f68f1bc4eb716ce735820a1311b743dd8d5c6bb275a2e4e7d2eff8f45417b60cc937086c3e7fd3b612ae064d7237eb6a7bd1a39d8575fac312068fa060bc1ceac4df0754601edaf04ecb1b89c0661ea01a593c3763e456bebbd8487edc0ff3bc6f203965cd92b1706070c59a3795f9dee23087cea0aaec015f1b7bfe4df81818d7a37af781ca7b757ace2fa489f85215ecb85976b1c74c7f1df6d834a8bc63e887407ef6e233c55ea040bc5f2471e99ebc92f2283ff592ff751d9226bd105e68e187c91ecb236c9fa4fb060ae4d706c571ac2123da1debd12737d98be118578",
484 "proof_hash": "0ce421970d13fe9b3981e308c5d0b549982cdda9f69918289cd95ffcd09e0fc2",
485 "spent": false
486 }
487 ]
488 }
489 }
490 # "#
491 # );
492 ```
493 */
494 fn get_outputs(
495 &self,
496 commits: Option<Vec<String>>,
497 start_height: Option<u64>,
498 end_height: Option<u64>,
499 include_proof: Option<bool>,
500 include_merkle_proof: Option<bool>,
501 ) -> Result<Vec<OutputPrintable>, Error>;
502
503 /**
504 Networked version of [Foreign::get_unspent_outputs](struct.Node.html#method.get_unspent_outputs).
505
506 # Json rpc example
507
508 ```
509 # epic_api::doctest_helper_json_rpc_foreign_assert_response!(
510 # r#"
511 {
512 "jsonrpc": "2.0",
513 "method": "get_unspent_outputs",
514 "params": [1, 2, null, true],
515 "id": 1
516 }
517 # "#
518 # ,
519 # r#"
520 {
521 "id": 1,
522 "jsonrpc": "2.0",
523 "result": {
524 "Ok": {
525 "highest_index": 2078061,
526 "last_retrieved_index": 30,
527 "outputs": [
528 {
529 "block_height": 1,
530 "commit": "08b7e57c448db5ef25aa119dde2312c64d7ff1b890c416c6dda5ec73cbfed2edea",
531 "merkle_proof": null,
532 "mmr_index": 1,
533 "output_type": "Coinbase",
534 "proof": "9330ad8cde205f317c6537eca96b866293a0489615a9a277b4d3a597c873544c82474932b641e06ac8719604ee52e895e8cd4621b6bfb85780cd9becce14d0700b83a664db2f52a26c425fd777ad88944cdfff38043a2793ed4d9aa67e36cbfd5585579fc69dda930418af5eaf603654f6f751258d2dfc8c2113c171e130f31ec1e6cce2a718e435298fce5d64ffe1bd3464fd7c87cfa92093855be034bfe4439e928bd92ad77fd0a0e00355ee1d1a9ceb1ed0c408dcfdba8c583e7598dc700aaa9f91432097259a405f5b7315a2f7658861e3349bb0dc8bf883726a215f0149ded6613e5ac0670c0c5202247d7c27c8a7d03bdb03c9cf5455463f9b42cf87403e31f8383cc4f49a34c62ae459f5801a9eed4f0ee3dfd5f55b7011c0cae393c474abd6f8c7965b9b5fff3104dd4e39542077c0c8dd2f8ffceb6bb598512d90506d0a7184f20f1498cf458787f23284b54888c9be416d103f760406357a16b6d841a303d5c95b6b474d2d7f0fea0a2a76c897dd2110e9303f54684169421147684c6f1819c33cef3f38ec995a508450c02cd1872f8065fdee723109c18b1dd2ddde75825546ecf0df0793c353b20c946cd64122cea8c116f432336899a16ad24a2aafcb8f900e09a1147135fcf2a54cbf81db308a47a08a49c77c130e5dc5e661cd55a5cc69e607055a5b08111bf61a62ea5778f85119043633f1cab8c756d756c5a34851024ac311a596b1cd919bbca43226f0ba057f6b57de2f6955b0823c3826de7f6096c1c1b6b9b8e4063e1645c0bff32f80561aaa959d97120fbc2ecd9d2be28bd0c17811dc59a88049f6d8952ee9a0a0207693c89ca3ad1197e9bfdfc03be9d845aea8d663969217e3b494cee9e652bc9f8713e2fd5cb1843848f46c3a6ab024d0e3d57ca45454cdbda414adaa835fa147deb4ffb7129cf3a8d86726a0144794",
535 "proof_hash": "6c301688d9186c3a99444f827bdfe3b858fe87fc314737a4dc1155d9884491d2",
536 "spent": false
537 },
538 {
539 "block_height": 29,
540 "commit": "09bab1ddad0f6fec1aedcd3830c5c647515ad543929e722344e4a8d390b6fdd51b",
541 "merkle_proof": null,
542 "mmr_index": 55,
543 "output_type": "Coinbase",
544 "proof": "4a5f858d4311bdd902f4446682f27f64be376283b1171060fd2ad33d85350fee13c25a030874d6308d2b325995a3fe545eb1d85ba66e2ba002b794edfdeacb3f0fd2a690b9a78137771b3633aaef2a77f62fbe4d6b4b373c4bdb7e5f58cfae361a3b4c2e4420cc0d38465b2444e01b50e57c6ebfc2afd6dda9017e54585638bddef17d181d1fd7064d975d8bb1dcfd96c89486aed4680b4d39294a141581d1f51c1acfbb80e2ffc40f8499cdc43be04cacda1e34dd6592edfc500229aa70db1c2869f974cfe9aee0cab696c198624de8ecdaf5ae481a1e46fe79fe983209459b89492f2b24416c368394c43c60c33d0fdd1792f0a58d11763e7c8b89d27da25109db346e4d7b62935d182b45dfb659829c55922350e6f7e3452d9311e527ec5b561f4d043cef865f683fce1ce2d410d414f5bcee63c4bbc00964b0fa757bdfd68158e22c1068d871a45759fbd527883c0451db6f36b15139864b6177a78ad64d326e0152914e5313a97ed7b685e5089f2758bf072c804560306bd944831f067c3413ded09330fd788f353e4ee875d3c9303dd4ec0dda9d55b4a27d7748b3247fe85cf3d26b7004e6e3379041fad136fccdacd02b06456a50ad40a3259842c0794f2d59dbd8fa6b4af065b38c388d76b82136b633b06779e4eb05b5b62ec37cdc2986327639bafa8651318f4c00c066e6f45504ec9a96874d5510b519f434a1a88175d51f86e8ee36ae18d107cfaf83e60b2e62fff032c7539be66d776e3a52c5f9b0ee6fe08820d65cd75d35c793e5ab3914adf5a97b7dba75e90d4a4c9aa844e2f1e9464cd5fc4923b475defca4e3b03e1b33353ff91ac1084712cf4445e329ffdbe1e2da16ae71dee0e914b546fdc0db9b0fcde80822ee716e9f2eec90db7aa4417d53a1266e1e8383e20c9a9548bae35c2a8e1293a49e7afbd8011a9e66e79ed6be",
545 "proof_hash": "a64ed774d824dc55123c6c5ba46d84bac15b6ead8cb60200836c2a0e74506ab0",
546 "spent": false
547 }
548 ]
549 }
550 }
551 }
552 # "#
553 # );
554 ```
555 */
556 fn get_unspent_outputs(
557 &self,
558 start_index: u64,
559 end_index: Option<u64>,
560 max: u64,
561 include_proof: Option<bool>,
562 ) -> Result<OutputListing, Error>;
563
564 /**
565 Networked version of [Foreign::get_pmmr_indices](struct.Node.html#method.get_pmmr_indices).
566
567 # Json rpc example
568
569 ```
570 # epic_api::doctest_helper_json_rpc_foreign_assert_response!(
571 # r#"
572 {
573 "jsonrpc": "2.0",
574 "method": "get_pmmr_indices",
575 "params": [0, 100],
576 "id": 1
577 }
578 # "#
579 # ,
580 # r#"
581 {
582 "id": 1,
583 "jsonrpc": "2.0",
584 "result": {
585 "Ok": {
586 "highest_index": 398,
587 "last_retrieved_index": 2,
588 "outputs": []
589 }
590 }
591 # "#
592 # );
593 ```
594 */
595 fn get_pmmr_indices(
596 &self,
597 start_block_height: u64,
598 end_block_height: Option<u64>,
599 ) -> Result<OutputListing, Error>;
600
601 /**
602 Networked version of [Foreign::get_pool_size](struct.Node.html#method.get_pool_size).
603
604 # Json rpc example
605
606 ```
607 # epic_api::doctest_helper_json_rpc_foreign_assert_response!(
608 # r#"
609 {
610 "jsonrpc": "2.0",
611 "method": "get_pool_size",
612 "params": [],
613 "id": 1
614 }
615 # "#
616 # ,
617 # r#"
618 {
619 "id": 1,
620 "jsonrpc": "2.0",
621 "result": {
622 "Ok": 1
623 }
624 }
625 # "#
626 # );
627 ```
628 */
629 fn get_pool_size(&self) -> Result<usize, Error>;
630
631 /**
632 Networked version of [Foreign::get_stempool_size](struct.Node.html#method.get_stempool_size).
633
634 # Json rpc example
635
636 ```
637 # epic_api::doctest_helper_json_rpc_foreign_assert_response!(
638 # r#"
639 {
640 "jsonrpc": "2.0",
641 "method": "get_stempool_size",
642 "params": [],
643 "id": 1
644 }
645 # "#
646 # ,
647 # r#"
648 {
649 "id": 1,
650 "jsonrpc": "2.0",
651 "result": {
652 "Ok": 0
653 }
654 }
655 # "#
656 # );
657 ```
658 */
659 fn get_stempool_size(&self) -> Result<usize, Error>;
660
661 /**
662 Networked version of [Foreign::get_unconfirmed_transactions](struct.Node.html#method.get_unconfirmed_transactions).
663
664 # Json rpc example
665
666 ```
667 # epic_api::doctest_helper_json_rpc_foreign_assert_response!(
668 # r#"
669 {
670 "jsonrpc": "2.0",
671 "method": "get_unconfirmed_transactions",
672 "params": [],
673 "id": 1
674 }
675 # "#
676 # ,
677 # r#"
678 {
679 "id": 1,
680 "jsonrpc": "2.0",
681 "result": {
682 "Ok": [
683 {
684 "src": "Broadcast",
685 "tx": {
686 "body": {
687 "inputs": [
688 {
689 "commit": "0992ce1827ec349e9f339ce183ffd01db39bf43999799d8191bfc267a58f0a715c",
690 "features": "Coinbase"
691 },
692 {
693 "commit": "0943a3c4ee4a22a5b086c26f8e6dc534204dafde0cf4c07e0c468d224dd79127ec",
694 "features": "Plain"
695 }
696 ],
697 "kernels": [
698 {
699 "excess": "083c49eaaf6380d44596f52cce4cf278cfac6dd34fbef73981002d8f1e8ee8abe4",
700 "excess_sig": "3f011e7e288231d67f42cb4f6416c4720e6170d5e3c805a52d33aa4521328f9be0303be654bc8ddcd3111aadc27c848b9cf07e0a70885ef79be70b7bb70f8c75",
701 "features": {
702 "Plain": {
703 "fee": 7000000
704 }
705 }
706 }
707 ],
708 "outputs": [
709 {
710 "commit": "0873fafd4a0e4f365939e24c68eeb18aafc6674ca244a364dcdbfa8fa525e7bae1",
711 "features": "Plain",
712 "proof": "4b675be40672d5965c43d9f03880560a8ac784ee3de8768e28c236a4bc43b8c3d4bc83dee00d2b96530af9607c3b91d9a828f0234bf2aaf7e7c0e9cf936db69c04ca1b267668fbdb2f08ce05c8b119c9d886ceaafb4634b7fae7ea01966ad825dddc9ffab8093155d9c5d268160b86fcad95f4f5e66bf46ff642a51629dbdfd7bba7936846915b925d547337a1b95c33030fad4178468825936242e631797aa3a8f0a5ae0d23040938622648c8432fc247a902abad27e383affb4ec518e4f6f55f55e264bc0f99957be203cfb26d4b8e561fb36da55a50b6ef5861134c484556d701133e1dceda5ea53e731184e0a11f33d06e13ca37d03d39dd047170580534b049862fcd6c73decc7c0af45a267ed148fe6ef2cc375ffebfa8187d2fa0a134428a036d2ec1f65d3ce036b955730fc1ee43b23b574bae2b58b7adfa2a7a45cdec393d9b658857c911560aa3c44cf4435a99d68f3dbc81c82ea43e426ef0198148a90336ee72472aab5f7feea1df93ec830fe5ec642c93c1046dec955df361bfdc3ab74477f847a1b72e8735ef65a8a6d1680745c0152bfb5cbb2a4b4671491a253a1a09d5a07d55f4872c9f0a3d25e07b257926629d5bb96aed96f5debab02503eb0ac45033323cc5a46c8e5d4469ee9f3dd618a20d54d6f5740c010fe5a0fe853efeb253a6df196bd24469ac51c1be8ba84737cecdb5ab73d7c52570d2273621fb69bd7ed985bbc6999dbd2d6fd2687ae44a391d604ff232cc6b3fbedd5d1cd0cd8c658c5d56069b5a5099cc5c9f48bbf7d7e83b4f9a7bdef6eabd164c8395468f818e8cd8c1c800bc3adfd66dbcb247d1bda5a7af38c288c0beb8e0d9160bf67500094530a0f8be52e97b5c2114f5a4a333a11c7f37f4c47a437422455d8cbcfa770cdc85ec55accf48cf14550b07f1346a02fccdf280fcb24c1fb38751d889a17e"
713 },
714 {
715 "commit": "08de9e42d361cabd99e566c67f7f8599c7e6985cd285a841277f1aeb89ad6c8fe3",
716 "features": "Plain",
717 "proof": "5eb7afa00e9681e3b6425fb4256c96905303505787d6a065e88a50154410b9a371b0f879d3f97cfa00425e9c8266e180188656acdbb46cacfdfb159fb135c5eb03b08be3c231c4b21df777da2e2afe8d30db91e602dc4ceed71aeb1b45a0266cfeadc4acbf9fdf7a67f67408fbbea7bf14182bc407373d243c6875373b655695604deb575369a9b28274885601b338882219c7f508aa2a0ae1d02736af2249327145f1d3d00093f9587f0e0b408692700fac0f2a048c329e81cabaa4b997dd88923fe97420125f394e21b4835e36cce9de383d9e223df1b5a6ba6f48ffeac315991189dc2716cc7ec07f6ccc8062344d5ed4fcaddf9070f44f0c59ffe8160d1f6fdfe42b40066f51e687d38b6b5255771800ac060bd8034cd68d14eee1b2f43b6d7bf20d71549ea9a50006dd30b9a795e785385801546eb9a83721a09fc34d3b69d4ccdc0ff0fb74d224048aeb66ecff5515296cadd57f42e0717cbba7c70719a10c007db4520e868efe98a51001b67952d7bda3174195a3d76b93ee4dac60137a38b2e8309cad13ef1cfb6c467f1969385e5b334b52f4fd55da440e036d2a428e9f3be905d79f717c169060468acc6d469636fed098b1aba5cd055a120314bcab55d5b8b6889321edf373517e93ef67fbe74557ec6c0211265efefa25a34ac267cf1db891c47163bfed20d2b535abfe60390c2844dcef5f0aad5fa7f1db9f726d7f223c025861069603936a22377707cdd3915e762e7061132124c716212b0e91bb7fc5d7816366f5d169d93fe75669a6ba19057bb2450958aa6f5ada09042570f46215af5a41b623d140be574b7a8c9ab24ea48da416dbe6ec0fa3b889206fb804df8d69805ceb80f1e9d4e8b664b3939491cba946d87585c830e3dab0638fa279b5e911642f18452e2731764aa62f92bbcf194c97f344c90c1931fd2c3af4bcf6b0"
718 }
719 ]
720 },
721 "offset": "0eb2c2669ce918675c72697891e5527bd13da5a499396381409219b8bbbd8129"
722 },
723 "tx_at": "2019-10-07T16:20:08.709114Z"
724 }
725 ]
726 }
727 }
728 # "#
729 # );
730 ```
731 */
732 fn get_unconfirmed_transactions(&self) -> Result<Vec<PoolEntry>, Error>;
733
734 /**
735 Networked version of [Foreign::push_transaction](struct.Node.html#method.push_transaction).
736
737 # Json rpc example
738
739 ```
740 # epic_api::doctest_helper_json_rpc_foreign_assert_response!(
741 # r#"
742 {
743 "jsonrpc": "2.0",
744 "method": "push_transaction",
745 "params": [ {
746 "body": {
747 "inputs": [
748 {
749 "commit": "0904cbd34d0745eb00ffc3e95c9f4746738794d00268e243e9b57163a73b384102",
750 "features": "Coinbase"
751 }
752 ],
753 "kernels": [
754 {
755 "excess": "08385257d22f1b8a758903f78ae12545245d620cffc50e7ee7bc852c5815513dc7",
756 "excess_sig": "e001a7349fd40d4a9dfc1df275d30906fb3b304f8c7892a20ed5c9b10923c871cbabedcf322511a9ce56f10113b48855441f681280133e121b25ea1ff7efad9e",
757 "features": {
758 "Plain": {
759 "fee": 8000000
760 }
761 }
762 }
763 ],
764 "outputs": [
765 {
766 "commit": "087c3ca7419751e96cdae4908bb8a92fc2826f2ad36690420b905d51beb7409ca0",
767 "features": "Plain",
768 "proof": "379ae236937883c2e1e613fb30f1b18d2a44d4173360e94bcd07862aafaf81b3aaa1154d67287cc03efde0d3981c6da8a18e2e426f5c30afc0f2e3a75012448402d8d56df52b87f4815575a56d4da174f8187e4faae64bf883b249ceed694271f84ef62a3711d36c997dff7a11111419011e36e3a070b7552415a55faaa3999f99439edccdfe5313277147fdb42be1798442bb225c2b546f5347920584b365aa81a0365b4a706c97c89617b0e6218d2c9bc15805caab27c438ed06340cc4f8dc7bfca0e9d38864c88bb0c834372f6b662b9159134f3f8ec9b8a87878739a7e516b97419ac29e1d4a2b250321470a9a6b98d07065bb7e79afc25a5ab6fc47108f53223078a64502bd4af1a109641447dab82741ebe3fbdbd803ee7a42fe2554e78fa86bd1d1e6e3b913118e9419b0be6f976b2404447d943b5f1bac19a5809fd6834797945a62d21b1ecb6ddebbc5ef94ca9e704d033bd64afde67bd3e06e2cca3bb10190188afc0af80b48dd862b86753d8b4af314763324deb1c97cf020cb87285a47cd28874bb91c6cdf858965e8b9daafbcbc1b4817d334a97d7e25e01b2d072d8dcc6418e3dc7b8e7712632f939238e65ed0731c7af02d55a8884cd8f7f88dc0f63a21955a7364562532f5716c89e14f8f23ad78f6fe2f1649e13ea8f8185f3ee63cc174684d1ef8d8c33fb25bc802f8e05e53fe200b1ea5231f588a020942e6fd7eec67301700088dae8816c16a337120063c21e1604e009df932032812f88be6473af13f802b42d8ad6fc14230fbe13ede178319a7b6540656234ec1f2fcfa70f6faa9c4b6b8150b81fe0fdc273a9bb385d766a02041a5c3f58471d42059c17d84d13ad592aa0ccf337970e7eef06f306b13288795123c9c005b815d848f359b23450656b310f09cda9ad4b7b6931805d47dcd10a8745d834a984e2055168ac3"
769 },
770 {
771 "commit": "09a7b2c1d4b346c4ebe9c6c979e32e7740446624d5439d9d7abb82166c2545e5be",
772 "features": "Plain",
773 "proof": "5fb0ee4093a153e2ed173207dbfa02b4d185f1f313ea4cbf222558819074543f19e9bcdb595a23d4ee971aafcc614b6d2774e22cee6627bc4388297fe6ebf03e0d422f3eb8003cc8516417a6b32eb22f87e1745e0ae5bf1733f2ea253399719b1ef0067934dc548c58729604d24a44040165b32d05e82c9efc9a1f30151dd73ce893ae94709ec2fe5d0f409bb54a86604f0e92915b4f93e7adde823eccf87830ae91d71a7b99967dbcc8531fee44c20c24fb6fe2a34fe86ba5da3a9235cbcdcde033ead57d65c03903a9c9ed877bf0fab9f26d08552c64ea668d5408c84b74bc3ac8335aaaa04ebcf523d36d2207fb8770e976b6fde7d04e2148de5a4169c60b1958bb840b79a8c8f356e1f1fadc35a5a7e276fcd67c354cde546548c9bf788981f38edf5a406977826aa4524004e770b3d3cd6b26f0dc99729ffd9929fa4509b145ef0c3e4293e71b964da731a47cc9f082350acf32afb64b3b12f8383c8f2cc9880131a80ea957b2908c92f21d2db7aa5d67bafb11eb07674e52b920e67a86259dd9c5dcdd18bad182fd85ec4b659c47ea2e2e8a89c57e4d2cde87958fc2ab932e169f6805d2fb14549ac93807bc426eb4cf6d29ff6a4cf22e35dbb27f04211b06b65173501c17a3bb3ff0eecc9bb05dca23379abe457ca3010ebea69e1a2f7f3ed6531bf766007cdd1ac7d6c762785fb56f36194cc2ccaee76a499a7383288e84981b103d76cbe007f66c913eacb277746e78ae08627b279ac1f9a43ab284d8a3b32c6edcd2ea99e8ea836b31a1e2582be6c41f2282cf5fc7bdb95e4b412a5eeccad29670197873a888a100c4b2704ce75137fc997a5632d81001f9b57300a9bf99edd857065be83f835e4c49d852165ba18e1c96316c153459a913773d5d86ddc26c5cd1fff38a8fbb62506b0aef6076382674c0fa95a50a03b0c3df0a688a2cbf"
774 }
775 ]
776 },
777 "offset": "0ec14d3875ad5a366418256fe65bad2a4d4ff1914e1b9488db72dd355138ca3a"
778 },
779 true
780 ],
781 "id": 1
782 }
783 # "#
784 # ,
785 # r#"
786 {
787 "id": 1,
788 "jsonrpc": "2.0",
789 "result": {
790 "Ok": null
791 }
792 }
793 # "#
794 # );
795 ```
796 */
797 fn push_transaction(&self, tx: Transaction, fluff: Option<bool>) -> Result<(), Error>;
798}
799
800impl<B, P> ForeignRpc for Foreign<B, P>
801where
802 B: BlockChain,
803 P: PoolAdapter,
804{
805 fn get_header(
806 &self,
807 height: Option<u64>,
808 hash: Option<String>,
809 commit: Option<String>,
810 ) -> Result<BlockHeaderPrintable, Error> {
811 let mut parsed_hash: Option<Hash> = None;
812 if let Some(hash) = hash {
813 let vec = util::from_hex(hash)
814 .map_err(|e| Error::Argument(format!("invalid block hash: {}", e)))?;
815 parsed_hash = Some(Hash::from_vec(&vec));
816 }
817 Foreign::get_header(self, height, parsed_hash, commit)
818 }
819
820 fn get_block(
821 &self,
822 height: Option<u64>,
823 hash: Option<String>,
824 commit: Option<String>,
825 ) -> Result<BlockPrintable, Error> {
826 let mut parsed_hash: Option<Hash> = None;
827 if let Some(hash) = hash {
828 let vec = util::from_hex(hash)
829 .map_err(|e| Error::Argument(format!("invalid block hash: {}", e)))?;
830 parsed_hash = Some(Hash::from_vec(&vec));
831 }
832 Foreign::get_block(self, height, parsed_hash, commit)
833 }
834
835 fn get_blocks(
836 &self,
837 start_height: Option<u64>,
838 end_height: Option<u64>,
839 hash: Option<String>,
840 commit: Option<String>,
841 ) -> Result<Vec<BlockPrintable>, Error> {
842 if Some(start_height) > Some(end_height) {
843 return Err(Error::Argument(
844 "Start_height must be lower or equal than end_height".to_string(),
845 ));
846 }
847 let mut parsed_hash: Option<Hash> = None;
848 if let Some(hash) = hash {
849 let vec = util::from_hex(hash)
850 .map_err(|e| Error::Argument(format!("invalid block hash: {}", e)))?;
851 parsed_hash = Some(Hash::from_vec(&vec));
852 }
853 if let Some(start_height) = start_height {
854 if let Some(end_height) = end_height {
855 let mut blocks: Vec<BlockPrintable> = vec![];
856 for height in start_height..=end_height {
857 let block = Foreign::get_block(self, Some(height), parsed_hash, commit.clone());
858
859 match block {
860 Ok(b) => blocks.push(b),
861 Err(_) => (),
862 }
863 }
864 return Ok(blocks);
865 }
866 }
867 return Err(Error::Argument(
868 "Start_height or end_height is not valid".to_string(),
869 ));
870 }
871
872 fn get_last_n_kernels(&self, distance: u64) -> Result<Vec<TxKernel>, Error> {
873 match Foreign::get_last_n_kernels(self, distance) {
874 Ok(k) => Ok(k),
875 Err(_) => Err(Error::Argument("Could not get kernels".to_string())),
876 }
877 }
878
879 fn get_version(&self) -> Result<Version, Error> {
880 Foreign::get_version(self)
881 }
882
883 fn get_tip(&self) -> Result<Tip, Error> {
884 Foreign::get_tip(self)
885 }
886
887 fn get_kernel(
888 &self,
889 excess: String,
890 min_height: Option<u64>,
891 max_height: Option<u64>,
892 ) -> Result<LocatedTxKernel, Error> {
893 Foreign::get_kernel(self, excess, min_height, max_height)
894 }
895
896 fn get_outputs(
897 &self,
898 commits: Option<Vec<String>>,
899 start_height: Option<u64>,
900 end_height: Option<u64>,
901 include_proof: Option<bool>,
902 include_merkle_proof: Option<bool>,
903 ) -> Result<Vec<OutputPrintable>, Error> {
904 Foreign::get_outputs(
905 self,
906 commits,
907 start_height,
908 end_height,
909 include_proof,
910 include_merkle_proof,
911 )
912 }
913
914 fn get_unspent_outputs(
915 &self,
916 start_index: u64,
917 end_index: Option<u64>,
918 max: u64,
919 include_proof: Option<bool>,
920 ) -> Result<OutputListing, Error> {
921 Foreign::get_unspent_outputs(self, start_index, end_index, max, include_proof)
922 }
923
924 fn get_pmmr_indices(
925 &self,
926 start_block_height: u64,
927 end_block_height: Option<u64>,
928 ) -> Result<OutputListing, Error> {
929 Foreign::get_pmmr_indices(self, start_block_height, end_block_height)
930 }
931
932 fn get_pool_size(&self) -> Result<usize, Error> {
933 Foreign::get_pool_size(self)
934 }
935
936 fn get_stempool_size(&self) -> Result<usize, Error> {
937 Foreign::get_stempool_size(self)
938 }
939
940 fn get_unconfirmed_transactions(&self) -> Result<Vec<PoolEntry>, Error> {
941 Foreign::get_unconfirmed_transactions(self)
942 }
943 fn push_transaction(&self, tx: Transaction, fluff: Option<bool>) -> Result<(), Error> {
944 Foreign::push_transaction(self, tx, fluff)
945 }
946}
947
948#[doc(hidden)]
949#[macro_export]
950macro_rules! doctest_helper_json_rpc_foreign_assert_response {
951 ($request:expr, $expected_response:expr) => {
952 // create temporary epic server, run jsonrpc request on node api, delete server, return
953 // json response.
954
955 {
956 /*use epic_servers::test_framework::framework::run_doctest;
957 use epic_util as util;
958 use serde_json;
959 use serde_json::Value;
960 use tempfile::tempdir;
961
962 let dir = tempdir().map_err(|e| format!("{:#?}", e)).unwrap();
963 let dir = dir
964 .path()
965 .to_str()
966 .ok_or("Failed to convert tmpdir path to string.".to_owned())
967 .unwrap();
968
969 let request_val: Value = serde_json::from_str($request).unwrap();
970 let expected_response: Value = serde_json::from_str($expected_response).unwrap();
971 let response = run_doctest(
972 request_val,
973 dir,
974 $use_token,
975 $blocks_to_mine,
976 $perform_tx,
977 $lock_tx,
978 $finalize_tx,
979 )
980 .unwrap()
981 .unwrap();
982 if response != expected_response {
983 panic!(
984 "(left != right) \nleft: {}\nright: {}",
985 serde_json::to_string_pretty(&response).unwrap(),
986 serde_json::to_string_pretty(&expected_response).unwrap()
987 );
988 }*/
989 }
990 };
991}