From 772df39300989299507d959beb2b37fb633efd83 Mon Sep 17 00:00:00 2001 From: Don Kackman Date: Sun, 15 Aug 2021 17:44:19 -0500 Subject: [PATCH] Static types (#14) * first shot * first shot * checkpoint * checkpoint * well that works * default data argument to null * get rid of SendMessageCollection * get_connection converted to static type * make records init only * lint * update coverlet * make get_block_chain_state statically type * make BlockRecord methods statically typed * convert to static types * convert to static types * convert to static types * consistent naming * Add Coin type * lint * add TrasnactionRecord and associated types * add serialization tests * ensure snake case serialization of json content * wrap communciation failures in ResponseException * lint * static typing * static type GetBlocks * replace List with IEnumerable * add UnfinishedHeaderBlock types * add WalletInfo type * add PoolState type * CoinRecord * Delete transactions.json * ProperCase * move chia types to sub-folder * version bump * replace IEnumerable with ICollection * add DateTime helper properties * fix get additions and removals * check * update to fix GetAdditionsAndRemovals test * version bump * ICollection * commenta * mempool start * core mempoolitem serizilaer * static types get_all_mempool_items * Add ConvertList * static types GetPuzzleAndSolution * static types GetRecentSignagePoint * static types GetRecentEOS * lint * nump version * static type * comments * static types * comments * lint * allow serivce names to be used for config endpoint * ConvertList not ToObject * cleaning up * comments * make AbsorbRewards static * add TODOs for remaining dyanmic return types * static types * static types * make static types * static types * static types * fixing up tests * test cleanup * test cleanup * test cleanup * test cleanup * alias Name as TransactionId * test cleanup * comments * comments --- README.md | 10 +- data.json | 3623 +++++++++++++++++ .../ColouredCoinWalletTests.cs | 1 + src/chia-dotnet.tests/DIDWalletTests.cs | 11 +- src/chia-dotnet.tests/DaemonTests.cs | 4 +- src/chia-dotnet.tests/DirectTests.cs | 41 +- src/chia-dotnet.tests/Factory.cs | 33 +- src/chia-dotnet.tests/FarmerProxyTests.cs | 58 +- src/chia-dotnet.tests/FullNodeProxyTests.cs | 132 +- src/chia-dotnet.tests/HarvesterProxyTests.cs | 10 + src/chia-dotnet.tests/PlotterProxyTests.cs | 18 +- src/chia-dotnet.tests/SerializationTests.cs | 84 + src/chia-dotnet.tests/WalletProxyTests.cs | 51 +- src/chia-dotnet.tests/WalletTests.cs | 43 +- src/chia-dotnet.tests/block.json | 168 + .../chia-dotnet.tests.csproj | 11 +- src/chia-dotnet.tests/mempoolItem.json | 152 + src/chia-dotnet.tests/signagepoint.json | 29 + src/chia-dotnet.tests/transaction.json | 73 + src/chia-dotnet/AssemblyInfo.cs | 3 + src/chia-dotnet/ChiaTypes/BlockRecord.cs | 126 + src/chia-dotnet/ChiaTypes/BlockchainState.cs | 15 + src/chia-dotnet/ChiaTypes/Coin.cs | 12 + src/chia-dotnet/ChiaTypes/CoinRecord.cs | 25 + .../ChiaTypes/ConditionConverter.cs | 37 + src/chia-dotnet/ChiaTypes/ConnectionInfo.cs | 27 + src/chia-dotnet/ChiaTypes/ErrorResponse.cs | 11 + .../ChiaTypes/FarmerSignagePoint.cs | 16 + src/chia-dotnet/ChiaTypes/FullBlock.cs | 251 ++ src/chia-dotnet/ChiaTypes/HarvesterInfo.cs | 19 + src/chia-dotnet/ChiaTypes/MempoolItem.cs | 58 + src/chia-dotnet/ChiaTypes/PlotInfo.cs | 21 + .../ChiaTypes/PoolPointConverter.cs | 32 + src/chia-dotnet/ChiaTypes/PoolState.cs | 112 + src/chia-dotnet/ChiaTypes/PoolWalletInfo.cs | 24 + src/chia-dotnet/ChiaTypes/QueuedPlotInfo.cs | 19 + .../ChiaTypes/SendPeerConverter.cs | 35 + src/chia-dotnet/ChiaTypes/SignagePoint.cs | 10 + src/chia-dotnet/ChiaTypes/SyncState.cs | 10 + src/chia-dotnet/ChiaTypes/TradeRecord.cs | 36 + .../ChiaTypes/TransactionRecord.cs | 89 + .../ChiaTypes/UnfinishedHeaderBlock.cs | 66 + src/chia-dotnet/ChiaTypes/WalletInfo.cs | 36 + src/chia-dotnet/ColouredCoinWallet.cs | 19 +- src/chia-dotnet/Config.cs | 17 +- src/chia-dotnet/Converters.cs | 98 + src/chia-dotnet/DIDWallet.cs | 19 +- src/chia-dotnet/DaemonProxy.cs | 24 +- src/chia-dotnet/Deserializer.cs | 81 - src/chia-dotnet/FarmerProxy.cs | 44 +- src/chia-dotnet/FullNodeProxy.cs | 188 +- src/chia-dotnet/HarvesterProxy.cs | 13 +- src/chia-dotnet/HttpRpcClient.cs | 27 +- src/chia-dotnet/Message.cs | 37 - src/chia-dotnet/PlotterProxy.cs | 9 +- src/chia-dotnet/PoolWallet.cs | 31 +- src/chia-dotnet/RateLimitedWallet.cs | 11 +- src/chia-dotnet/ResponseException.cs | 1 + src/chia-dotnet/ServiceProxy.cs | 54 +- src/chia-dotnet/ServicesNames.cs | 16 + src/chia-dotnet/Wallet.cs | 45 +- src/chia-dotnet/WalletProxy.cs | 124 +- src/chia-dotnet/WebSocketRpcClient.cs | 12 +- src/chia-dotnet/chia-dotnet.csproj | 8 +- 64 files changed, 6029 insertions(+), 491 deletions(-) create mode 100644 data.json create mode 100644 src/chia-dotnet.tests/SerializationTests.cs create mode 100644 src/chia-dotnet.tests/block.json create mode 100644 src/chia-dotnet.tests/mempoolItem.json create mode 100644 src/chia-dotnet.tests/signagepoint.json create mode 100644 src/chia-dotnet.tests/transaction.json create mode 100644 src/chia-dotnet/AssemblyInfo.cs create mode 100644 src/chia-dotnet/ChiaTypes/BlockRecord.cs create mode 100644 src/chia-dotnet/ChiaTypes/BlockchainState.cs create mode 100644 src/chia-dotnet/ChiaTypes/Coin.cs create mode 100644 src/chia-dotnet/ChiaTypes/CoinRecord.cs create mode 100644 src/chia-dotnet/ChiaTypes/ConditionConverter.cs create mode 100644 src/chia-dotnet/ChiaTypes/ConnectionInfo.cs create mode 100644 src/chia-dotnet/ChiaTypes/ErrorResponse.cs create mode 100644 src/chia-dotnet/ChiaTypes/FarmerSignagePoint.cs create mode 100644 src/chia-dotnet/ChiaTypes/FullBlock.cs create mode 100644 src/chia-dotnet/ChiaTypes/HarvesterInfo.cs create mode 100644 src/chia-dotnet/ChiaTypes/MempoolItem.cs create mode 100644 src/chia-dotnet/ChiaTypes/PlotInfo.cs create mode 100644 src/chia-dotnet/ChiaTypes/PoolPointConverter.cs create mode 100644 src/chia-dotnet/ChiaTypes/PoolState.cs create mode 100644 src/chia-dotnet/ChiaTypes/PoolWalletInfo.cs create mode 100644 src/chia-dotnet/ChiaTypes/QueuedPlotInfo.cs create mode 100644 src/chia-dotnet/ChiaTypes/SendPeerConverter.cs create mode 100644 src/chia-dotnet/ChiaTypes/SignagePoint.cs create mode 100644 src/chia-dotnet/ChiaTypes/SyncState.cs create mode 100644 src/chia-dotnet/ChiaTypes/TradeRecord.cs create mode 100644 src/chia-dotnet/ChiaTypes/TransactionRecord.cs create mode 100644 src/chia-dotnet/ChiaTypes/UnfinishedHeaderBlock.cs create mode 100644 src/chia-dotnet/ChiaTypes/WalletInfo.cs create mode 100644 src/chia-dotnet/Converters.cs delete mode 100644 src/chia-dotnet/Deserializer.cs create mode 100644 src/chia-dotnet/ServicesNames.cs diff --git a/README.md b/README.md index 4f56d49c..c70da66d 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,11 @@ https://dkackman.github.io/chia-dotnet/ - Coverage of all of chia's rpc endpoints - Daemon, Full Node, Farmer, Harvester Wallet, Plotter -- Complete coverage the methods at each endpoint +- Coverage of all of the methods at each endpoint - as of 1.2.3 (if you find something missing please create an issue) -- Supports connecting via the `daemon` on `wss` or directly to each service over `https` - - both `https` and `wss` use tha same interfaces, so switching is seemless +- Static types for chia input and outputs +- Supports connecting via teh `daemon` on `wss` or directly to each service over `https` + - both `https` and `wss` use tha same interfaces so switching is seemless ### Examples @@ -35,6 +36,7 @@ await daemon.RegisterService(); var fullNode = new FullNodeProxy(rpcClient, "unit_tests"); var state = await fullNode.GetBlockchainState(e); +Console.Log($"This node is synced: {state.Sync.Synced}") ``` #### Send me some chia @@ -78,7 +80,7 @@ In addition to static vs dynamic typing, C# and Python have very different conve - The chia RPC uses unsigned integers where dotnet might use signed. In cases where chia expects an unsigned number, it is unsigned on the dotnet side. - `ulong` is used for the python 64 bit unsigned int. - `BigInteger` is used for the python 128 bit unsigned int. -- Where the RPC return a scalar value, the dotnet code will as well. +- Where the RPC return a scalar value, the dotnet code will as well. If it is optional in python it will be `Nullable` in dotnet - Where the RPC returns a list of named scalar values, they are returned as a Tuple with named fields. - Complex types and structs are currently returned as a `dynamic` [`ExpandoObject`](https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.expandoobject?view=net-5.0). Static types are [coming soon](https://github.com/dkackman/chia-dotnet/discussions/13). - Lists of things are returned as [`IEnumberable`](https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1?view=net-5.0). diff --git a/data.json b/data.json new file mode 100644 index 00000000..e8c1c482 --- /dev/null +++ b/data.json @@ -0,0 +1,3623 @@ +{ + "05613d723b1090797235b9a1f40cd0c60e1c547e2ff9fef05d5f9feaa862b4e8": { + "additions": [ + { + "amount": 1, + "parent_coin_info": "0xd2ab06f9568607ea6a6f66b8c81095f9685656d3ea789cf51f6ffa401bba3473", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + }, + { + "amount": 74287139999, + "parent_coin_info": "0xd2ab06f9568607ea6a6f66b8c81095f9685656d3ea789cf51f6ffa401bba3473", + "puzzle_hash": "0xd75218ea0c13ec4ee82e010b73565afd344df8d6da3d34deb99a0f80dc4ab379" + }, + { + "amount": 1, + "parent_coin_info": "0x6bfd185c1bea08bad84959d3f6cc1b36f98afd0d42cf42bcc2448aa5793de5ef", + "puzzle_hash": "0x765a83f74b471e181019916f8beb682218243dacafbb398b141f08d7647fa219" + } + ], + "cost": 18439459, + "fee": 0, + "npc_result": { + "clvm_cost": 727459, + "error": null, + "npc_list": [ + { + "coin_name": "0xd2ab06f9568607ea6a6f66b8c81095f9685656d3ea789cf51f6ffa401bba3473", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0xad6f7bb6d3f43c69907de17a0812941ca94eee83e3f781dc99ebf75cba691cd1ede0011a9bc001a998969b7489364535", + "0x0faa40fc4eb5264897515dc42c88a5c81db10e10528610b74e32d2f3ae654d6b" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9", + "0x01" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xd75218ea0c13ec4ee82e010b73565afd344df8d6da3d34deb99a0f80dc4ab379", + "0x114bdbcc9f" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x3a5e61f3f49096edb6a67f258bf26c7d9025795f70584fb83fd0ac98ca2c7fa3" + ] + } + ] + ], + [ + "0x3d", + [ + { + "opcode": "ASSERT_COIN_ANNOUNCEMENT", + "vars": [ + "0x5bb3487e221455e7b797fb9c6f75d01f8b2d79491c5a05be9be6f1fd17af8b32" + ] + } + ] + ] + ], + "puzzle_hash": "0x227b8b65f272c5ac7559b29fdf30fc95e627d0ab342b9ca5377c5db0fe12ade0" + }, + { + "coin_name": "0x6bfd185c1bea08bad84959d3f6cc1b36f98afd0d42cf42bcc2448aa5793de5ef", + "conditions": [ + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x765a83f74b471e181019916f8beb682218243dacafbb398b141f08d7647fa219", + "0x01" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x68cf159df856e92f70d298bbf62c7d5db51ac3fcfa76e2a64b61b1d93e427bb4" + ] + } + ] + ] + ], + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + } + ] + }, + "program": "0xff01ffffffa051f22a1500d7d218193ae6510b6185ace2467ddeac60ad787982fe5b52829669ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0ad6f7bb6d3f43c69907de17a0812941ca94eee83e3f781dc99ebf75cba691cd1ede0011a9bc001a998969b7489364535ff018080ff85114bdbcca0ffff80ffff01ffff33ffa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ff0180ffff33ffa0d75218ea0c13ec4ee82e010b73565afd344df8d6da3d34deb99a0f80dc4ab379ff85114bdbcc9f80ffff3cffa03a5e61f3f49096edb6a67f258bf26c7d9025795f70584fb83fd0ac98ca2c7fa380ffff3dffa05bb3487e221455e7b797fb9c6f75d01f8b2d79491c5a05be9be6f1fd17af8b328080ff808080ffffa0d2ab06f9568607ea6a6f66b8c81095f9685656d3ea789cf51f6ffa401bba3473ffff02ffff01ff04ffff04ff04ffff04ff05ffff04ff0bff80808080ffff04ffff04ff0affff04ffff02ff0effff04ff02ffff04ffff04ff05ffff04ff0bffff04ff17ff80808080ff80808080ff808080ff808080ffff04ffff01ff33ff3cff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ff09ff80808080ffff02ff0effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ff01ffffa0765a83f74b471e181019916f8beb682218243dacafbb398b141f08d7647fa219ff01ffffff70c07101032f2c9ba1b2315d413a92b5f034fa03282ccba1767fd9ae7b14d942b969ed5d578c3039a323611ddf48cc01e44395246c3139fda5b55b36367a83861dda4d44d3c3179d2edef746ac6f441b8790c2983d010000001668747470733a2f2f6575312e706f6f6c2e737061636500000040ffff7483093a80ffff68a0c93e53a35ce7aa338dbcf29af43f48acdd5f8b4109d000ead2ca593a6d42ffbf8080808080", + "removals": [ + { + "amount": 74287140000, + "parent_coin_info": "0x51f22a1500d7d218193ae6510b6185ace2467ddeac60ad787982fe5b52829669", + "puzzle_hash": "0x227b8b65f272c5ac7559b29fdf30fc95e627d0ab342b9ca5377c5db0fe12ade0" + }, + { + "amount": 1, + "parent_coin_info": "0xd2ab06f9568607ea6a6f66b8c81095f9685656d3ea789cf51f6ffa401bba3473", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + } + ], + "spend_bundle": { + "aggregated_signature": "0xa411479d4b2e2d3f6b83fe29644c27f16d9b8740ce8b665ddb2366a748ce7a2f58f6fdfe9671c33f615e30d3b152a5dd0bc9ee29160e8e00e2d01aa9094a3abc8abb1e667eb27557dc10889a50e417b740619a178377c3f099151ae6e79e5f83", + "coin_spends": [ + { + "coin": { + "amount": 74287140000, + "parent_coin_info": "0x51f22a1500d7d218193ae6510b6185ace2467ddeac60ad787982fe5b52829669", + "puzzle_hash": "0x227b8b65f272c5ac7559b29fdf30fc95e627d0ab342b9ca5377c5db0fe12ade0" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0ad6f7bb6d3f43c69907de17a0812941ca94eee83e3f781dc99ebf75cba691cd1ede0011a9bc001a998969b7489364535ff018080", + "solution": "0xff80ffff01ffff33ffa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ff0180ffff33ffa0d75218ea0c13ec4ee82e010b73565afd344df8d6da3d34deb99a0f80dc4ab379ff85114bdbcc9f80ffff3cffa03a5e61f3f49096edb6a67f258bf26c7d9025795f70584fb83fd0ac98ca2c7fa380ffff3dffa05bb3487e221455e7b797fb9c6f75d01f8b2d79491c5a05be9be6f1fd17af8b328080ff8080" + }, + { + "coin": { + "amount": 1, + "parent_coin_info": "0xd2ab06f9568607ea6a6f66b8c81095f9685656d3ea789cf51f6ffa401bba3473", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + }, + "puzzle_reveal": "0xff02ffff01ff04ffff04ff04ffff04ff05ffff04ff0bff80808080ffff04ffff04ff0affff04ffff02ff0effff04ff02ffff04ffff04ff05ffff04ff0bffff04ff17ff80808080ff80808080ff808080ff808080ffff04ffff01ff33ff3cff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ff09ff80808080ffff02ff0effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080", + "solution": "0xffa0765a83f74b471e181019916f8beb682218243dacafbb398b141f08d7647fa219ff01ffffff70c07101032f2c9ba1b2315d413a92b5f034fa03282ccba1767fd9ae7b14d942b969ed5d578c3039a323611ddf48cc01e44395246c3139fda5b55b36367a83861dda4d44d3c3179d2edef746ac6f441b8790c2983d010000001668747470733a2f2f6575312e706f6f6c2e737061636500000040ffff7483093a80ffff68a0c93e53a35ce7aa338dbcf29af43f48acdd5f8b4109d000ead2ca593a6d42ffbf8080" + } + ] + }, + "spend_bundle_name": "0x05613d723b1090797235b9a1f40cd0c60e1c547e2ff9fef05d5f9feaa862b4e8" + }, + "0afff89a858e0ed8b25fd6b24045f5cc09ac0b03b5affb0dd1ec4d4fc8b722c5": { + "additions": [ + { + "amount": 1, + "parent_coin_info": "0xbc0192418c52f208e772a27e2721d17978191d650bc8730583352a98c32e35c9", + "puzzle_hash": "0x1642c732944afd2e9d82f9da80b4f5afcf2e229814d2bd69d4e87b1fabcaebf1" + } + ], + "cost": 32364767, + "fee": 0, + "npc_result": { + "clvm_cost": 3264767, + "error": null, + "npc_list": [ + { + "coin_name": "0xbc0192418c52f208e772a27e2721d17978191d650bc8730583352a98c32e35c9", + "conditions": [ + [ + "0x46", + [ + { + "opcode": "ASSERT_MY_COIN_ID", + "vars": [ + "0xbc0192418c52f208e772a27e2721d17978191d650bc8730583352a98c32e35c9" + ] + } + ] + ], + [ + "0x52", + [ + { + "opcode": "ASSERT_HEIGHT_RELATIVE", + "vars": [ + "0x20" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x1642c732944afd2e9d82f9da80b4f5afcf2e229814d2bd69d4e87b1fabcaebf1", + "0x01" + ] + } + ] + ], + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0x85fa96631f1e5027d47a0481ad0edd2e0bb81116a39eacc018ef3370eea859d793569d56eed873249ab5921632c2e548", + "0x8352da5626ed3a290707f265e4674281a88b22f1862ba6a4861dbd8edcda18ed" + ] + } + ] + ] + ], + "puzzle_hash": "0xac8885f73b2073c78cdbed67674567184418595e74c6d2fd23eacce458e96b86" + } + ] + }, + "program": "0xff01ffffffa05c8345fbc51c5e21029d602ceabb23fc746d4fe5c6ebbd6bcc15118eca87f0c2ffff02ffff01ff02ffff01ff02ffff03ffff18ff2fffff010180ffff01ff02ff36ffff04ff02ffff04ff05ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff0bff80808080ffff04ff2fffff04ff0bffff04ff5fff808080808080808080ffff01ff088080ff0180ffff04ffff01ffffffff4602ff3304ffff0101ff02ffff02ffff03ff05ffff01ff02ff5cffff04ff02ffff04ff0dffff04ffff0bff2cffff0bff24ff3880ffff0bff2cffff0bff2cffff0bff24ff3480ff0980ffff0bff2cff0bffff0bff24ff8080808080ff8080808080ffff010b80ff0180ff02ffff03ff0bffff01ff02ff32ffff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ffff02ff2affff04ff02ffff04ffff02ffff03ffff09ff23ff2880ffff0181b3ff8080ff0180ff80808080ff80808080808080ffff01ff02ffff03ff17ff80ffff01ff088080ff018080ff0180ffffffff0bffff0bff17ffff02ff3affff04ff02ffff04ff09ffff04ff2fffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ff5f80ff0bff81bf80ff02ffff03ffff20ffff22ff4fff178080ffff01ff02ff7effff04ff02ffff04ff6fffff04ffff04ffff02ffff03ff4fffff01ff04ff23ffff04ffff02ff3affff04ff02ffff04ff09ffff04ff53ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff81b3ff80808080ffff011380ff0180ffff02ff7cffff04ff02ffff04ff05ffff04ff1bffff04ffff21ff4fff1780ff80808080808080ff8080808080ffff01ff088080ff0180ffff04ffff09ffff18ff05ffff010180ffff010180ffff09ff05ffff01818f8080ff0bff2cffff0bff24ff3080ffff0bff2cffff0bff2cffff0bff24ff3480ff0580ffff0bff2cffff02ff5cffff04ff02ffff04ff07ffff04ffff0bff24ff2480ff8080808080ffff0bff24ff8080808080ffffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff26ffff04ff02ffff04ff09ff80808080ffff02ff26ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ff5effff04ff02ffff04ff05ffff04ff0bffff04ffff02ff3affff04ff02ffff04ff09ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfff80808080808080808080ffff04ffff04ff20ffff04ff17ff808080ffff02ff7cffff04ff02ffff04ff05ffff04ffff02ff82017fffff04ffff04ffff04ff17ff2f80ffff04ffff04ff5fff81bf80ffff04ff0bff05808080ff8202ff8080ffff01ff80808080808080ffff02ff2effff04ff02ffff04ff05ffff04ff0bffff04ffff02ffff03ff3bffff01ff02ff22ffff04ff02ffff04ff05ffff04ff17ffff04ff13ffff04ff2bffff04ff5bffff04ff5fff808080808080808080ffff01ff02ffff03ffff09ff15ffff0bff13ff1dff2b8080ffff01ff0bff15ff17ff5f80ffff01ff088080ff018080ff0180ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfffff04ff82017fff8080808080808080808080ff02ffff03ff05ffff011bffff010b80ff0180ff018080ffff04ffff01ffa024e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fdffa0aba2ae7def840a536fbd60c1818b7c815ec5d0f83bed16f7f556ac0636e5a61da0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff82017fffff01ff04ffff04ff1cffff04ff5fff808080ffff04ffff04ff12ffff04ff8205ffffff04ff8206bfff80808080ffff04ffff04ff08ffff04ff17ffff04ffff02ff1effff04ff02ffff04ffff04ff8205ffffff04ff8202ffff808080ff80808080ff80808080ff80808080ffff01ff02ff16ffff04ff02ffff04ff05ffff04ff8204bfffff04ff8206bfffff04ff8202ffffff04ffff0bffff19ff2fffff18ffff019100ffffffffffffffffffffffffffffffffff8205ff8080ff0bff8202ff80ff808080808080808080ff0180ffff04ffff01ffff32ff3d52ffff333effff04ffff04ff12ffff04ff0bffff04ff17ff80808080ffff04ffff04ff12ffff04ff05ffff04ff2fff80808080ffff04ffff04ff1affff04ff5fff808080ffff04ffff04ff14ffff04ffff0bff5fffff012480ff808080ff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01a00213db9cb540a52c39071ef70acdf81796303189061b5aa0ee8098a05d5ceff5ffff04ffff01a0da9a807d0eb2eb4a11b6f118697eb3de93191bb8990ad2be61c58bb63ec36fcdffff04ffff01b085fa96631f1e5027d47a0481ad0edd2e0bb81116a39eacc018ef3370eea859d793569d56eed873249ab5921632c2e548ffff04ffff01a0ccd5bb71183532bff220ba46c268991a00000000000000000000000000000000ffff04ffff0120ff01808080808080ff01808080ff01ffffffa08e93618941c242874797845c565d8db0d317adb112762223db268164e473be9fffa090bd2ae4aed43a595d0dd784aee4364589c2742c382b1f4b173dc20b34ba78ddff0180ff01ffff01ffffff70c07301032f2c9ba1b2315d413a92b5f034fa03282ccba1767fd9ae7b14d942b969ed5d5785fa96631f1e5027d47a0481ad0edd2e0bb81116a39eacc018ef3370eea859d793569d56eed873249ab5921632c2e548010000001868747470733a2f2f61736961312e706f6f6c2e73706163650000004080ffa043010414af95289931e0772fc9d6cc56dd846a4e1cdf4818d41b11ceccb3a0008080808080", + "removals": [ + { + "amount": 1, + "parent_coin_info": "0x5c8345fbc51c5e21029d602ceabb23fc746d4fe5c6ebbd6bcc15118eca87f0c2", + "puzzle_hash": "0xac8885f73b2073c78cdbed67674567184418595e74c6d2fd23eacce458e96b86" + } + ], + "spend_bundle": { + "aggregated_signature": "0x85286de0c8c2713f98e0a2caeeb12432030e80c99a3c705cc2347018e06fab97f813949223eff8b5e66f590b488eadd31423555976e881073565be81c25756dd196edf75fa881c9674897af68b928ce5a84654e376c92320303a07220590e74e", + "coin_spends": [ + { + "coin": { + "amount": 1, + "parent_coin_info": "0x5c8345fbc51c5e21029d602ceabb23fc746d4fe5c6ebbd6bcc15118eca87f0c2", + "puzzle_hash": "0xac8885f73b2073c78cdbed67674567184418595e74c6d2fd23eacce458e96b86" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ffff18ff2fffff010180ffff01ff02ff36ffff04ff02ffff04ff05ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff0bff80808080ffff04ff2fffff04ff0bffff04ff5fff808080808080808080ffff01ff088080ff0180ffff04ffff01ffffffff4602ff3304ffff0101ff02ffff02ffff03ff05ffff01ff02ff5cffff04ff02ffff04ff0dffff04ffff0bff2cffff0bff24ff3880ffff0bff2cffff0bff2cffff0bff24ff3480ff0980ffff0bff2cff0bffff0bff24ff8080808080ff8080808080ffff010b80ff0180ff02ffff03ff0bffff01ff02ff32ffff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ffff02ff2affff04ff02ffff04ffff02ffff03ffff09ff23ff2880ffff0181b3ff8080ff0180ff80808080ff80808080808080ffff01ff02ffff03ff17ff80ffff01ff088080ff018080ff0180ffffffff0bffff0bff17ffff02ff3affff04ff02ffff04ff09ffff04ff2fffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ff5f80ff0bff81bf80ff02ffff03ffff20ffff22ff4fff178080ffff01ff02ff7effff04ff02ffff04ff6fffff04ffff04ffff02ffff03ff4fffff01ff04ff23ffff04ffff02ff3affff04ff02ffff04ff09ffff04ff53ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff81b3ff80808080ffff011380ff0180ffff02ff7cffff04ff02ffff04ff05ffff04ff1bffff04ffff21ff4fff1780ff80808080808080ff8080808080ffff01ff088080ff0180ffff04ffff09ffff18ff05ffff010180ffff010180ffff09ff05ffff01818f8080ff0bff2cffff0bff24ff3080ffff0bff2cffff0bff2cffff0bff24ff3480ff0580ffff0bff2cffff02ff5cffff04ff02ffff04ff07ffff04ffff0bff24ff2480ff8080808080ffff0bff24ff8080808080ffffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff26ffff04ff02ffff04ff09ff80808080ffff02ff26ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ff5effff04ff02ffff04ff05ffff04ff0bffff04ffff02ff3affff04ff02ffff04ff09ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfff80808080808080808080ffff04ffff04ff20ffff04ff17ff808080ffff02ff7cffff04ff02ffff04ff05ffff04ffff02ff82017fffff04ffff04ffff04ff17ff2f80ffff04ffff04ff5fff81bf80ffff04ff0bff05808080ff8202ff8080ffff01ff80808080808080ffff02ff2effff04ff02ffff04ff05ffff04ff0bffff04ffff02ffff03ff3bffff01ff02ff22ffff04ff02ffff04ff05ffff04ff17ffff04ff13ffff04ff2bffff04ff5bffff04ff5fff808080808080808080ffff01ff02ffff03ffff09ff15ffff0bff13ff1dff2b8080ffff01ff0bff15ff17ff5f80ffff01ff088080ff018080ff0180ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfffff04ff82017fff8080808080808080808080ff02ffff03ff05ffff011bffff010b80ff0180ff018080ffff04ffff01ffa024e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fdffa0aba2ae7def840a536fbd60c1818b7c815ec5d0f83bed16f7f556ac0636e5a61da0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff82017fffff01ff04ffff04ff1cffff04ff5fff808080ffff04ffff04ff12ffff04ff8205ffffff04ff8206bfff80808080ffff04ffff04ff08ffff04ff17ffff04ffff02ff1effff04ff02ffff04ffff04ff8205ffffff04ff8202ffff808080ff80808080ff80808080ff80808080ffff01ff02ff16ffff04ff02ffff04ff05ffff04ff8204bfffff04ff8206bfffff04ff8202ffffff04ffff0bffff19ff2fffff18ffff019100ffffffffffffffffffffffffffffffffff8205ff8080ff0bff8202ff80ff808080808080808080ff0180ffff04ffff01ffff32ff3d52ffff333effff04ffff04ff12ffff04ff0bffff04ff17ff80808080ffff04ffff04ff12ffff04ff05ffff04ff2fff80808080ffff04ffff04ff1affff04ff5fff808080ffff04ffff04ff14ffff04ffff0bff5fffff012480ff808080ff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01a00213db9cb540a52c39071ef70acdf81796303189061b5aa0ee8098a05d5ceff5ffff04ffff01a0da9a807d0eb2eb4a11b6f118697eb3de93191bb8990ad2be61c58bb63ec36fcdffff04ffff01b085fa96631f1e5027d47a0481ad0edd2e0bb81116a39eacc018ef3370eea859d793569d56eed873249ab5921632c2e548ffff04ffff01a0ccd5bb71183532bff220ba46c268991a00000000000000000000000000000000ffff04ffff0120ff01808080808080ff01808080", + "solution": "0xffffa08e93618941c242874797845c565d8db0d317adb112762223db268164e473be9fffa090bd2ae4aed43a595d0dd784aee4364589c2742c382b1f4b173dc20b34ba78ddff0180ff01ffff01ffffff70c07301032f2c9ba1b2315d413a92b5f034fa03282ccba1767fd9ae7b14d942b969ed5d5785fa96631f1e5027d47a0481ad0edd2e0bb81116a39eacc018ef3370eea859d793569d56eed873249ab5921632c2e548010000001868747470733a2f2f61736961312e706f6f6c2e73706163650000004080ffa043010414af95289931e0772fc9d6cc56dd846a4e1cdf4818d41b11ceccb3a0008080" + } + ] + }, + "spend_bundle_name": "0x0afff89a858e0ed8b25fd6b24045f5cc09ac0b03b5affb0dd1ec4d4fc8b722c5" + }, + "0d70ec6cac7ed6d97016e5928d8882adab98d542172ad7eabe0b5203abbbed04": { + "additions": [ + { + "amount": 300, + "parent_coin_info": "0xd8740fdaf400688a58827b0b5f66d72ebc175c646c88c0912486c5eb5a00afb0", + "puzzle_hash": "0x12faa57919dc324df3439ba7c60b215c3f0a748a8ac12da96fddb4be14e94cc7" + }, + { + "amount": 1174784, + "parent_coin_info": "0xd8740fdaf400688a58827b0b5f66d72ebc175c646c88c0912486c5eb5a00afb0", + "puzzle_hash": "0x391772b05db0d6a39d6ec1b9b16081d98bdf2e5f9ebb8da89cc61eeb14dbea5f" + } + ], + "cost": 10868858, + "fee": 0, + "npc_result": { + "clvm_cost": 416858, + "error": null, + "npc_list": [ + { + "coin_name": "0xd8740fdaf400688a58827b0b5f66d72ebc175c646c88c0912486c5eb5a00afb0", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0xadb52494d40518b1e9100884f47996153b2d6a12b474c4e5d88e8cf05e60328395e6a9f65288e177c92c8a7e8e0f8e40", + "0x539560a15c02ced24ab326c87dfe5f9082362a03ef359064e5e30161e7cb3798" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x12faa57919dc324df3439ba7c60b215c3f0a748a8ac12da96fddb4be14e94cc7", + "0x012c" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x391772b05db0d6a39d6ec1b9b16081d98bdf2e5f9ebb8da89cc61eeb14dbea5f", + "0x11ed00" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x0ac224604ad490370604abdeda4087ed0068c667fee073a79a208d4a045cc7e1" + ] + } + ] + ] + ], + "puzzle_hash": "0x5439a79dde66afdfb06ad5cfb9922520f1e28a73f07cf2f5975fd985e8f67f86" + } + ] + }, + "program": "0xff01ffffffa0f31757af36ca119bc8f8b094073aec7e2768117d620aafe7e63224f7e98554a6ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0adb52494d40518b1e9100884f47996153b2d6a12b474c4e5d88e8cf05e60328395e6a9f65288e177c92c8a7e8e0f8e40ff018080ff8311ee2cffff80ffff01ffff33ffa012faa57919dc324df3439ba7c60b215c3f0a748a8ac12da96fddb4be14e94cc7ff82012c80ffff33ffa0391772b05db0d6a39d6ec1b9b16081d98bdf2e5f9ebb8da89cc61eeb14dbea5fff8311ed0080ffff3cffa00ac224604ad490370604abdeda4087ed0068c667fee073a79a208d4a045cc7e18080ff8080808080", + "removals": [ + { + "amount": 1175084, + "parent_coin_info": "0xf31757af36ca119bc8f8b094073aec7e2768117d620aafe7e63224f7e98554a6", + "puzzle_hash": "0x5439a79dde66afdfb06ad5cfb9922520f1e28a73f07cf2f5975fd985e8f67f86" + } + ], + "spend_bundle": { + "aggregated_signature": "0xa6a689301118e0691e67f4be4a6abb44c08ef9f1063c8c2a587918311d8f1a09986ee2bb61d05ddcf35963e52815e0480f6758470cecd50ecf9a1e6d9d5149a0824c36b9178a7c7709872022d5d4a16310652c2bdfd837158005918d9e7fa549", + "coin_spends": [ + { + "coin": { + "amount": 1175084, + "parent_coin_info": "0xf31757af36ca119bc8f8b094073aec7e2768117d620aafe7e63224f7e98554a6", + "puzzle_hash": "0x5439a79dde66afdfb06ad5cfb9922520f1e28a73f07cf2f5975fd985e8f67f86" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0adb52494d40518b1e9100884f47996153b2d6a12b474c4e5d88e8cf05e60328395e6a9f65288e177c92c8a7e8e0f8e40ff018080", + "solution": "0xff80ffff01ffff33ffa012faa57919dc324df3439ba7c60b215c3f0a748a8ac12da96fddb4be14e94cc7ff82012c80ffff33ffa0391772b05db0d6a39d6ec1b9b16081d98bdf2e5f9ebb8da89cc61eeb14dbea5fff8311ed0080ffff3cffa00ac224604ad490370604abdeda4087ed0068c667fee073a79a208d4a045cc7e18080ff8080" + } + ] + }, + "spend_bundle_name": "0x0d70ec6cac7ed6d97016e5928d8882adab98d542172ad7eabe0b5203abbbed04" + }, + "100018ef137644d9e8062d097a63f6b6ab34ae5d126b1e1a3c0c3006afd65951": { + "additions": [ + { + "amount": 1, + "parent_coin_info": "0xb3c54ba1f6461a0a44a0c4115bdc8ef311279f8c1d254b4115c5d8d452bb7ed9", + "puzzle_hash": "0x47d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3" + }, + { + "amount": 99209, + "parent_coin_info": "0xb3c54ba1f6461a0a44a0c4115bdc8ef311279f8c1d254b4115c5d8d452bb7ed9", + "puzzle_hash": "0xf7eaf9b81c1b46307591c6261c2d99e2118fec8d6440dd64614a1e1c274bb7c4" + } + ], + "cost": 10844856, + "fee": 0, + "npc_result": { + "clvm_cost": 416856, + "error": null, + "npc_list": [ + { + "coin_name": "0xb3c54ba1f6461a0a44a0c4115bdc8ef311279f8c1d254b4115c5d8d452bb7ed9", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0xadc7d846106fa23afbbb25fe9ce0712dc30f23a1ac7a3a1c5eeb4e73dcfb78f47983071d1506e7148a08a062f8f64b6f", + "0x3c131f2b0e7ca0e568cb13261cdfa8d548f47bc9e58cfecf16a4c85b6845b761" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x47d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3", + "0x01" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xf7eaf9b81c1b46307591c6261c2d99e2118fec8d6440dd64614a1e1c274bb7c4", + "0x018389" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0xe375cc6cc985bf0749349108756cacf72af66f4510471fd64bcbf3529b173ffa" + ] + } + ] + ] + ], + "puzzle_hash": "0x2b4812882f57f9d45dcc9911e751e6b8f82bf13e5ac1d669b49e9dbda681471f" + } + ] + }, + "program": "0xff01ffffffa08b9f53d3b7b6140c51fd10797497756659cd5af3fca700fc0657299385a59549ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0adc7d846106fa23afbbb25fe9ce0712dc30f23a1ac7a3a1c5eeb4e73dcfb78f47983071d1506e7148a08a062f8f64b6fff018080ff8301838affff80ffff01ffff33ffa047d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3ff0180ffff33ffa0f7eaf9b81c1b46307591c6261c2d99e2118fec8d6440dd64614a1e1c274bb7c4ff8301838980ffff3cffa0e375cc6cc985bf0749349108756cacf72af66f4510471fd64bcbf3529b173ffa8080ff8080808080", + "removals": [ + { + "amount": 99210, + "parent_coin_info": "0x8b9f53d3b7b6140c51fd10797497756659cd5af3fca700fc0657299385a59549", + "puzzle_hash": "0x2b4812882f57f9d45dcc9911e751e6b8f82bf13e5ac1d669b49e9dbda681471f" + } + ], + "spend_bundle": { + "aggregated_signature": "0x87b91de8a56915a129419d78a5441f3eb00f7b3667c30d8568f117c5172929df69493dda3926e0298d8982711304515012cbe884f69a519e7ea6b869988e9fdc2ab856d3351e0a93955faaf403172fbf1f45afef42e42afdd2c8a04898a0079c", + "coin_spends": [ + { + "coin": { + "amount": 99210, + "parent_coin_info": "0x8b9f53d3b7b6140c51fd10797497756659cd5af3fca700fc0657299385a59549", + "puzzle_hash": "0x2b4812882f57f9d45dcc9911e751e6b8f82bf13e5ac1d669b49e9dbda681471f" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0adc7d846106fa23afbbb25fe9ce0712dc30f23a1ac7a3a1c5eeb4e73dcfb78f47983071d1506e7148a08a062f8f64b6fff018080", + "solution": "0xff80ffff01ffff33ffa047d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3ff0180ffff33ffa0f7eaf9b81c1b46307591c6261c2d99e2118fec8d6440dd64614a1e1c274bb7c4ff8301838980ffff3cffa0e375cc6cc985bf0749349108756cacf72af66f4510471fd64bcbf3529b173ffa8080ff8080" + } + ] + }, + "spend_bundle_name": "0x100018ef137644d9e8062d097a63f6b6ab34ae5d126b1e1a3c0c3006afd65951" + }, + "17b0b2f9081904e3f6ad8d7342688f55203ebdc7e6eabb62e31c6057f7bb7039": { + "additions": [ + { + "amount": 1, + "parent_coin_info": "0x6d6e61cf384d159a6b5cd245f89b06ea57079984bf25c4895c89cfe3b2854a55", + "puzzle_hash": "0x8db955a69beb441f2cd283a4fc03f52149a0d306994dbc461d2011cbbd47fe28" + } + ], + "cost": 31796662, + "fee": 0, + "npc_result": { + "clvm_cost": 3152662, + "error": null, + "npc_list": [ + { + "coin_name": "0x6d6e61cf384d159a6b5cd245f89b06ea57079984bf25c4895c89cfe3b2854a55", + "conditions": [ + [ + "0x46", + [ + { + "opcode": "ASSERT_MY_COIN_ID", + "vars": [ + "0x6d6e61cf384d159a6b5cd245f89b06ea57079984bf25c4895c89cfe3b2854a55" + ] + } + ] + ], + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0x925116106bb4772c143c10bc2ad540ba578ffa5ca4751d9df3228c461955f8e7521c31cbabbc64ec9ba67955b51e3fa5", + "0xc0e8cee4804d5ada193f5855a1f60fbbec20149d6a13df3707cf7118f2765257" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x8db955a69beb441f2cd283a4fc03f52149a0d306994dbc461d2011cbbd47fe28", + "0x01" + ] + } + ] + ] + ], + "puzzle_hash": "0x81eba9365e9e091a03e3d32cf5520bcaf3c6aa4e0e049e178d44a928e6e99e51" + } + ] + }, + "program": "0xff01ffffffa0ff37b9bf46360eb64d6956a914852dba8f0f2c21f6774e7362c8167070e20812ffff02ffff01ff02ffff01ff02ffff03ffff18ff2fffff010180ffff01ff02ff36ffff04ff02ffff04ff05ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff0bff80808080ffff04ff2fffff04ff0bffff04ff5fff808080808080808080ffff01ff088080ff0180ffff04ffff01ffffffff4602ff3304ffff0101ff02ffff02ffff03ff05ffff01ff02ff5cffff04ff02ffff04ff0dffff04ffff0bff2cffff0bff24ff3880ffff0bff2cffff0bff2cffff0bff24ff3480ff0980ffff0bff2cff0bffff0bff24ff8080808080ff8080808080ffff010b80ff0180ff02ffff03ff0bffff01ff02ff32ffff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ffff02ff2affff04ff02ffff04ffff02ffff03ffff09ff23ff2880ffff0181b3ff8080ff0180ff80808080ff80808080808080ffff01ff02ffff03ff17ff80ffff01ff088080ff018080ff0180ffffffff0bffff0bff17ffff02ff3affff04ff02ffff04ff09ffff04ff2fffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ff5f80ff0bff81bf80ff02ffff03ffff20ffff22ff4fff178080ffff01ff02ff7effff04ff02ffff04ff6fffff04ffff04ffff02ffff03ff4fffff01ff04ff23ffff04ffff02ff3affff04ff02ffff04ff09ffff04ff53ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff81b3ff80808080ffff011380ff0180ffff02ff7cffff04ff02ffff04ff05ffff04ff1bffff04ffff21ff4fff1780ff80808080808080ff8080808080ffff01ff088080ff0180ffff04ffff09ffff18ff05ffff010180ffff010180ffff09ff05ffff01818f8080ff0bff2cffff0bff24ff3080ffff0bff2cffff0bff2cffff0bff24ff3480ff0580ffff0bff2cffff02ff5cffff04ff02ffff04ff07ffff04ffff0bff24ff2480ff8080808080ffff0bff24ff8080808080ffffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff26ffff04ff02ffff04ff09ff80808080ffff02ff26ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ff5effff04ff02ffff04ff05ffff04ff0bffff04ffff02ff3affff04ff02ffff04ff09ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfff80808080808080808080ffff04ffff04ff20ffff04ff17ff808080ffff02ff7cffff04ff02ffff04ff05ffff04ffff02ff82017fffff04ffff04ffff04ff17ff2f80ffff04ffff04ff5fff81bf80ffff04ff0bff05808080ff8202ff8080ffff01ff80808080808080ffff02ff2effff04ff02ffff04ff05ffff04ff0bffff04ffff02ffff03ff3bffff01ff02ff22ffff04ff02ffff04ff05ffff04ff17ffff04ff13ffff04ff2bffff04ff5bffff04ff5fff808080808080808080ffff01ff02ffff03ffff09ff15ffff0bff13ff1dff2b8080ffff01ff0bff15ff17ff5f80ffff01ff088080ff018080ff0180ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfffff04ff82017fff8080808080808080808080ff02ffff03ff05ffff011bffff010b80ff0180ff018080ffff04ffff01ffa024e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fdffa07ec000afffda35ecd260b8e6818473424ba94563f60241e3e366f736c9997838a0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff8202ffffff01ff02ff16ffff04ff02ffff04ff05ffff04ff8204bfffff04ff8206bfffff04ff82017fffff04ffff0bffff19ff2fffff18ffff019100ffffffffffffffffffffffffffffffffff8202ff8080ff0bff82017f80ff8080808080808080ffff01ff04ffff04ff08ffff04ff17ffff04ffff02ff1effff04ff02ffff04ff82017fff80808080ff80808080ffff04ffff04ff1cffff04ff5fffff04ff8206bfff80808080ff80808080ff0180ffff04ffff01ffff32ff3d33ff3effff04ffff04ff1cffff04ff0bffff04ff17ff80808080ffff04ffff04ff1cffff04ff05ffff04ff2fff80808080ffff04ffff04ff0affff04ff5fff808080ffff04ffff04ff14ffff04ffff0bff5fffff012480ff808080ff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01a00d82c2e32037b77da9c8fdd5d1d4fa4b8cfa08026d2c04834906b741fdcb6fe2ffff04ffff01a048b756b1bcf2c72263cecb0297330d71fdb063201c2056cab85608534433fa51ffff04ffff01b0925116106bb4772c143c10bc2ad540ba578ffa5ca4751d9df3228c461955f8e7521c31cbabbc64ec9ba67955b51e3fa5ffff04ffff01a0ccd5bb71183532bff220ba46c268991a00000000000000000000000000000000ffff04ffff01a09e749777ebfc918f9b94616ec0dfb99419669a180b17d8a46983db93054b0423ff01808080808080ff01808080ff01ffffffa0ff461204bb3a014ec2a1783ef6e5d6e22180b75fb44537c3e1908cc01ebca780ffa0485f22117ead3511f4ea07a0a9f50cbe5d608695c7d8cd2e7a23f44ac601482cff0180ff01ffffffff70c07301020d82c2e32037b77da9c8fdd5d1d4fa4b8cfa08026d2c04834906b741fdcb6fe2925116106bb4772c143c10bc2ad540ba578ffa5ca4751d9df3228c461955f8e7521c31cbabbc64ec9ba67955b51e3fa5010000001868747470733a2f2f706f6f6c2e786368706f6f6c2e6f72670000006480ff808080808080", + "removals": [ + { + "amount": 1, + "parent_coin_info": "0xff37b9bf46360eb64d6956a914852dba8f0f2c21f6774e7362c8167070e20812", + "puzzle_hash": "0x81eba9365e9e091a03e3d32cf5520bcaf3c6aa4e0e049e178d44a928e6e99e51" + } + ], + "spend_bundle": { + "aggregated_signature": "0x894e2815c14aae03b0664ef6bee86a5e47088beca579d095b9583fad9af3faf14d49aa28dcf6725d8bdb28872a3946d505f91b95a49a1d459548d04b182e541f17805608f06eb07919df438b85c83bf8c4023a1c5bc843ee35284559e672983b", + "coin_spends": [ + { + "coin": { + "amount": 1, + "parent_coin_info": "0xff37b9bf46360eb64d6956a914852dba8f0f2c21f6774e7362c8167070e20812", + "puzzle_hash": "0x81eba9365e9e091a03e3d32cf5520bcaf3c6aa4e0e049e178d44a928e6e99e51" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ffff18ff2fffff010180ffff01ff02ff36ffff04ff02ffff04ff05ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff0bff80808080ffff04ff2fffff04ff0bffff04ff5fff808080808080808080ffff01ff088080ff0180ffff04ffff01ffffffff4602ff3304ffff0101ff02ffff02ffff03ff05ffff01ff02ff5cffff04ff02ffff04ff0dffff04ffff0bff2cffff0bff24ff3880ffff0bff2cffff0bff2cffff0bff24ff3480ff0980ffff0bff2cff0bffff0bff24ff8080808080ff8080808080ffff010b80ff0180ff02ffff03ff0bffff01ff02ff32ffff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ffff02ff2affff04ff02ffff04ffff02ffff03ffff09ff23ff2880ffff0181b3ff8080ff0180ff80808080ff80808080808080ffff01ff02ffff03ff17ff80ffff01ff088080ff018080ff0180ffffffff0bffff0bff17ffff02ff3affff04ff02ffff04ff09ffff04ff2fffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ff5f80ff0bff81bf80ff02ffff03ffff20ffff22ff4fff178080ffff01ff02ff7effff04ff02ffff04ff6fffff04ffff04ffff02ffff03ff4fffff01ff04ff23ffff04ffff02ff3affff04ff02ffff04ff09ffff04ff53ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff81b3ff80808080ffff011380ff0180ffff02ff7cffff04ff02ffff04ff05ffff04ff1bffff04ffff21ff4fff1780ff80808080808080ff8080808080ffff01ff088080ff0180ffff04ffff09ffff18ff05ffff010180ffff010180ffff09ff05ffff01818f8080ff0bff2cffff0bff24ff3080ffff0bff2cffff0bff2cffff0bff24ff3480ff0580ffff0bff2cffff02ff5cffff04ff02ffff04ff07ffff04ffff0bff24ff2480ff8080808080ffff0bff24ff8080808080ffffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff26ffff04ff02ffff04ff09ff80808080ffff02ff26ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ff5effff04ff02ffff04ff05ffff04ff0bffff04ffff02ff3affff04ff02ffff04ff09ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfff80808080808080808080ffff04ffff04ff20ffff04ff17ff808080ffff02ff7cffff04ff02ffff04ff05ffff04ffff02ff82017fffff04ffff04ffff04ff17ff2f80ffff04ffff04ff5fff81bf80ffff04ff0bff05808080ff8202ff8080ffff01ff80808080808080ffff02ff2effff04ff02ffff04ff05ffff04ff0bffff04ffff02ffff03ff3bffff01ff02ff22ffff04ff02ffff04ff05ffff04ff17ffff04ff13ffff04ff2bffff04ff5bffff04ff5fff808080808080808080ffff01ff02ffff03ffff09ff15ffff0bff13ff1dff2b8080ffff01ff0bff15ff17ff5f80ffff01ff088080ff018080ff0180ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfffff04ff82017fff8080808080808080808080ff02ffff03ff05ffff011bffff010b80ff0180ff018080ffff04ffff01ffa024e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fdffa07ec000afffda35ecd260b8e6818473424ba94563f60241e3e366f736c9997838a0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff8202ffffff01ff02ff16ffff04ff02ffff04ff05ffff04ff8204bfffff04ff8206bfffff04ff82017fffff04ffff0bffff19ff2fffff18ffff019100ffffffffffffffffffffffffffffffffff8202ff8080ff0bff82017f80ff8080808080808080ffff01ff04ffff04ff08ffff04ff17ffff04ffff02ff1effff04ff02ffff04ff82017fff80808080ff80808080ffff04ffff04ff1cffff04ff5fffff04ff8206bfff80808080ff80808080ff0180ffff04ffff01ffff32ff3d33ff3effff04ffff04ff1cffff04ff0bffff04ff17ff80808080ffff04ffff04ff1cffff04ff05ffff04ff2fff80808080ffff04ffff04ff0affff04ff5fff808080ffff04ffff04ff14ffff04ffff0bff5fffff012480ff808080ff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01a00d82c2e32037b77da9c8fdd5d1d4fa4b8cfa08026d2c04834906b741fdcb6fe2ffff04ffff01a048b756b1bcf2c72263cecb0297330d71fdb063201c2056cab85608534433fa51ffff04ffff01b0925116106bb4772c143c10bc2ad540ba578ffa5ca4751d9df3228c461955f8e7521c31cbabbc64ec9ba67955b51e3fa5ffff04ffff01a0ccd5bb71183532bff220ba46c268991a00000000000000000000000000000000ffff04ffff01a09e749777ebfc918f9b94616ec0dfb99419669a180b17d8a46983db93054b0423ff01808080808080ff01808080", + "solution": "0xffffa0ff461204bb3a014ec2a1783ef6e5d6e22180b75fb44537c3e1908cc01ebca780ffa0485f22117ead3511f4ea07a0a9f50cbe5d608695c7d8cd2e7a23f44ac601482cff0180ff01ffffffff70c07301020d82c2e32037b77da9c8fdd5d1d4fa4b8cfa08026d2c04834906b741fdcb6fe2925116106bb4772c143c10bc2ad540ba578ffa5ca4751d9df3228c461955f8e7521c31cbabbc64ec9ba67955b51e3fa5010000001868747470733a2f2f706f6f6c2e786368706f6f6c2e6f72670000006480ff808080" + } + ] + }, + "spend_bundle_name": "0x17b0b2f9081904e3f6ad8d7342688f55203ebdc7e6eabb62e31c6057f7bb7039" + }, + "1d172d142099cb2e57e09e0939ea43e6c534b0f6bd779200da0df1b4a473cf60": { + "additions": [ + { + "amount": 300, + "parent_coin_info": "0xb7ef20f1b5cc1b8bbe0263d32f1f044b448b775f994e602d8993b1fe7ee4f315", + "puzzle_hash": "0x553a5a091c73f93df732df10e1fcf42742b49b542264debafe9f81bf94f3088f" + }, + { + "amount": 1174798, + "parent_coin_info": "0xb7ef20f1b5cc1b8bbe0263d32f1f044b448b775f994e602d8993b1fe7ee4f315", + "puzzle_hash": "0xb5444e21729acf2d62199f6d2f0045a5f6ecb5b0273de87b9f7e2c63b0a8df41" + } + ], + "cost": 10868858, + "fee": 0, + "npc_result": { + "clvm_cost": 416858, + "error": null, + "npc_list": [ + { + "coin_name": "0xb7ef20f1b5cc1b8bbe0263d32f1f044b448b775f994e602d8993b1fe7ee4f315", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0xa401bfb63f9bd0bb4f5b57e2d2550e825d4b80081ae0ab428221a8924bed17e3d006e1c6739310158108585f47ed315c", + "0x92ce3f124b0abe43f101db5d2eaf515e3cf4a4caf738e3d88a86de95578f437c" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x553a5a091c73f93df732df10e1fcf42742b49b542264debafe9f81bf94f3088f", + "0x012c" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xb5444e21729acf2d62199f6d2f0045a5f6ecb5b0273de87b9f7e2c63b0a8df41", + "0x11ed0e" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x4f1166faab99ca96fac782da3f044aac3311cc8670e5c1df950e15a8428b9c58" + ] + } + ] + ] + ], + "puzzle_hash": "0xe6a8851776490a06d4835f67a678afb3ce5a3591df5f961a5b1fcffae6fe39e0" + } + ] + }, + "program": "0xff01ffffffa0fb5b5e2727acf98c4903731737c6d9deef55b53f5590a0bfcdeae4d2df34dceeffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a401bfb63f9bd0bb4f5b57e2d2550e825d4b80081ae0ab428221a8924bed17e3d006e1c6739310158108585f47ed315cff018080ff8311ee3affff80ffff01ffff33ffa0553a5a091c73f93df732df10e1fcf42742b49b542264debafe9f81bf94f3088fff82012c80ffff33ffa0b5444e21729acf2d62199f6d2f0045a5f6ecb5b0273de87b9f7e2c63b0a8df41ff8311ed0e80ffff3cffa04f1166faab99ca96fac782da3f044aac3311cc8670e5c1df950e15a8428b9c588080ff8080808080", + "removals": [ + { + "amount": 1175098, + "parent_coin_info": "0xfb5b5e2727acf98c4903731737c6d9deef55b53f5590a0bfcdeae4d2df34dcee", + "puzzle_hash": "0xe6a8851776490a06d4835f67a678afb3ce5a3591df5f961a5b1fcffae6fe39e0" + } + ], + "spend_bundle": { + "aggregated_signature": "0xb45fcfc2442ecfa46b425b1b2ea652da39abda41d81ca41572f16729873918c545544fa61d8a3fdc300236703e116aea17828823c16ba7e0cfa55aa0aa1852009e3383d28e29ecbce8b91e2eaf64fe6b1ba89a9f56099a62b5237e63c59dd634", + "coin_spends": [ + { + "coin": { + "amount": 1175098, + "parent_coin_info": "0xfb5b5e2727acf98c4903731737c6d9deef55b53f5590a0bfcdeae4d2df34dcee", + "puzzle_hash": "0xe6a8851776490a06d4835f67a678afb3ce5a3591df5f961a5b1fcffae6fe39e0" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a401bfb63f9bd0bb4f5b57e2d2550e825d4b80081ae0ab428221a8924bed17e3d006e1c6739310158108585f47ed315cff018080", + "solution": "0xff80ffff01ffff33ffa0553a5a091c73f93df732df10e1fcf42742b49b542264debafe9f81bf94f3088fff82012c80ffff33ffa0b5444e21729acf2d62199f6d2f0045a5f6ecb5b0273de87b9f7e2c63b0a8df41ff8311ed0e80ffff3cffa04f1166faab99ca96fac782da3f044aac3311cc8670e5c1df950e15a8428b9c588080ff8080" + } + ] + }, + "spend_bundle_name": "0x1d172d142099cb2e57e09e0939ea43e6c534b0f6bd779200da0df1b4a473cf60" + }, + "2a0f7ba8d79c9872a3d72f770e3984f0637e2019a8b0688831764db903eb1282": { + "additions": [ + { + "amount": 1, + "parent_coin_info": "0xba31442942234843552aea4a77ad89105509751a70c83dbe1132d824b65d871b", + "puzzle_hash": "0x47d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3" + }, + { + "amount": 99389, + "parent_coin_info": "0xba31442942234843552aea4a77ad89105509751a70c83dbe1132d824b65d871b", + "puzzle_hash": "0x8b2781a5d5486f02dab9774b270cd1498405fd33ad7ccb1b66417cd4dfccedbc" + } + ], + "cost": 10844856, + "fee": 0, + "npc_result": { + "clvm_cost": 416856, + "error": null, + "npc_list": [ + { + "coin_name": "0xba31442942234843552aea4a77ad89105509751a70c83dbe1132d824b65d871b", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0xacb482bf5d94f0daa38f7c2e823bb494913e22ecf1eb66fbe85652526540d082d7d7d6ecc035f514f030cdb4e8b98297", + "0x950d7ef3ffd3d7519762196a80e0eceb070fec524075405644cc43c313a13dec" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x47d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3", + "0x01" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x8b2781a5d5486f02dab9774b270cd1498405fd33ad7ccb1b66417cd4dfccedbc", + "0x01843d" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x61e59d12d674efe81d8c173def793814d8daaf43894758120d8675c9b50a1bf5" + ] + } + ] + ] + ], + "puzzle_hash": "0x88eac074163cd2b54fd016847d78cf44965e1acfe18d8eb2ceb872fc4565d0b7" + } + ] + }, + "program": "0xff01ffffffa00c2f5ef2faab04274894bc7d0877cbe472cdbfa149f6ac7e7be862ba6ae24723ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0acb482bf5d94f0daa38f7c2e823bb494913e22ecf1eb66fbe85652526540d082d7d7d6ecc035f514f030cdb4e8b98297ff018080ff8301843effff80ffff01ffff33ffa047d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3ff0180ffff33ffa08b2781a5d5486f02dab9774b270cd1498405fd33ad7ccb1b66417cd4dfccedbcff8301843d80ffff3cffa061e59d12d674efe81d8c173def793814d8daaf43894758120d8675c9b50a1bf58080ff8080808080", + "removals": [ + { + "amount": 99390, + "parent_coin_info": "0x0c2f5ef2faab04274894bc7d0877cbe472cdbfa149f6ac7e7be862ba6ae24723", + "puzzle_hash": "0x88eac074163cd2b54fd016847d78cf44965e1acfe18d8eb2ceb872fc4565d0b7" + } + ], + "spend_bundle": { + "aggregated_signature": "0x82c56d7164b45a1329a57aceb6966db0ef408ab380f7c22375d7743ac4de2db47fb319a8c4cecb922a5e2b85c76aad3d182965b71f1eb93ba8c9462f4352c99586b4695573d85d0f0ee4ddc2e52eecac65a46207d17bce77f8634460a4604baf", + "coin_spends": [ + { + "coin": { + "amount": 99390, + "parent_coin_info": "0x0c2f5ef2faab04274894bc7d0877cbe472cdbfa149f6ac7e7be862ba6ae24723", + "puzzle_hash": "0x88eac074163cd2b54fd016847d78cf44965e1acfe18d8eb2ceb872fc4565d0b7" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0acb482bf5d94f0daa38f7c2e823bb494913e22ecf1eb66fbe85652526540d082d7d7d6ecc035f514f030cdb4e8b98297ff018080", + "solution": "0xff80ffff01ffff33ffa047d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3ff0180ffff33ffa08b2781a5d5486f02dab9774b270cd1498405fd33ad7ccb1b66417cd4dfccedbcff8301843d80ffff3cffa061e59d12d674efe81d8c173def793814d8daaf43894758120d8675c9b50a1bf58080ff8080" + } + ] + }, + "spend_bundle_name": "0x2a0f7ba8d79c9872a3d72f770e3984f0637e2019a8b0688831764db903eb1282" + }, + "307a7b33269cb5122b7fc6881f2883cab4602cb392eb875151aebaf93bf98a1c": { + "additions": [ + { + "amount": 1, + "parent_coin_info": "0x5c2df20b92a5b28860d97d83f812ba94a4f95b8c2bcef7c069b4a65de7f25076", + "puzzle_hash": "0x940432d074a9ff9b4a9b03f5c1851cba99290939e87c3c4dac03d404b55e8245" + } + ], + "cost": 31844670, + "fee": 0, + "npc_result": { + "clvm_cost": 3152670, + "error": null, + "npc_list": [ + { + "coin_name": "0x5c2df20b92a5b28860d97d83f812ba94a4f95b8c2bcef7c069b4a65de7f25076", + "conditions": [ + [ + "0x46", + [ + { + "opcode": "ASSERT_MY_COIN_ID", + "vars": [ + "0x5c2df20b92a5b28860d97d83f812ba94a4f95b8c2bcef7c069b4a65de7f25076" + ] + } + ] + ], + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0x957020199fa3f30cd1944261be5d5fa1df5c6fcb7cab55a300fb1491089fa0b4c817e67112836cc5214f62264f38ba58", + "0xc69e99d131f96bfffb26250ec653b26c752e79ed9c61207e765c0fe30cc7c749" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x940432d074a9ff9b4a9b03f5c1851cba99290939e87c3c4dac03d404b55e8245", + "0x01" + ] + } + ] + ] + ], + "puzzle_hash": "0x1addfd434269dab2bcc5d377b7cc60a6d66ade0caa6694f891493d1888416894" + } + ] + }, + "program": "0xff01ffffffa0d3321d108fae5fb10abe60e3d1c7ce06974c1f59efbcfd78b0d17f02f42fce34ffff02ffff01ff02ffff01ff02ffff03ffff18ff2fffff010180ffff01ff02ff36ffff04ff02ffff04ff05ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff0bff80808080ffff04ff2fffff04ff0bffff04ff5fff808080808080808080ffff01ff088080ff0180ffff04ffff01ffffffff4602ff3304ffff0101ff02ffff02ffff03ff05ffff01ff02ff5cffff04ff02ffff04ff0dffff04ffff0bff2cffff0bff24ff3880ffff0bff2cffff0bff2cffff0bff24ff3480ff0980ffff0bff2cff0bffff0bff24ff8080808080ff8080808080ffff010b80ff0180ff02ffff03ff0bffff01ff02ff32ffff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ffff02ff2affff04ff02ffff04ffff02ffff03ffff09ff23ff2880ffff0181b3ff8080ff0180ff80808080ff80808080808080ffff01ff02ffff03ff17ff80ffff01ff088080ff018080ff0180ffffffff0bffff0bff17ffff02ff3affff04ff02ffff04ff09ffff04ff2fffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ff5f80ff0bff81bf80ff02ffff03ffff20ffff22ff4fff178080ffff01ff02ff7effff04ff02ffff04ff6fffff04ffff04ffff02ffff03ff4fffff01ff04ff23ffff04ffff02ff3affff04ff02ffff04ff09ffff04ff53ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff81b3ff80808080ffff011380ff0180ffff02ff7cffff04ff02ffff04ff05ffff04ff1bffff04ffff21ff4fff1780ff80808080808080ff8080808080ffff01ff088080ff0180ffff04ffff09ffff18ff05ffff010180ffff010180ffff09ff05ffff01818f8080ff0bff2cffff0bff24ff3080ffff0bff2cffff0bff2cffff0bff24ff3480ff0580ffff0bff2cffff02ff5cffff04ff02ffff04ff07ffff04ffff0bff24ff2480ff8080808080ffff0bff24ff8080808080ffffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff26ffff04ff02ffff04ff09ff80808080ffff02ff26ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ff5effff04ff02ffff04ff05ffff04ff0bffff04ffff02ff3affff04ff02ffff04ff09ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfff80808080808080808080ffff04ffff04ff20ffff04ff17ff808080ffff02ff7cffff04ff02ffff04ff05ffff04ffff02ff82017fffff04ffff04ffff04ff17ff2f80ffff04ffff04ff5fff81bf80ffff04ff0bff05808080ff8202ff8080ffff01ff80808080808080ffff02ff2effff04ff02ffff04ff05ffff04ff0bffff04ffff02ffff03ff3bffff01ff02ff22ffff04ff02ffff04ff05ffff04ff17ffff04ff13ffff04ff2bffff04ff5bffff04ff5fff808080808080808080ffff01ff02ffff03ffff09ff15ffff0bff13ff1dff2b8080ffff01ff0bff15ff17ff5f80ffff01ff088080ff018080ff0180ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfffff04ff82017fff8080808080808080808080ff02ffff03ff05ffff011bffff010b80ff0180ff018080ffff04ffff01ffa024e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fdffa0ec5af1eea043892e7ff3afea1bee6e4f8535294c7b8d9378a3d490c973d0874aa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff8202ffffff01ff02ff16ffff04ff02ffff04ff05ffff04ff8204bfffff04ff8206bfffff04ff82017fffff04ffff0bffff19ff2fffff18ffff019100ffffffffffffffffffffffffffffffffff8202ff8080ff0bff82017f80ff8080808080808080ffff01ff04ffff04ff08ffff04ff17ffff04ffff02ff1effff04ff02ffff04ff82017fff80808080ff80808080ffff04ffff04ff1cffff04ff5fffff04ff8206bfff80808080ff80808080ff0180ffff04ffff01ffff32ff3d33ff3effff04ffff04ff1cffff04ff0bffff04ff17ff80808080ffff04ffff04ff1cffff04ff05ffff04ff2fff80808080ffff04ffff04ff0affff04ff5fff808080ffff04ffff04ff14ffff04ffff0bff5fffff012480ff808080ff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01a00213db9cb540a52c39071ef70acdf81796303189061b5aa0ee8098a05d5ceff5ffff04ffff01a06b6e8c3148bf59ac525b30d4467dc90c18ea02cc030b5fdf6bf950e8113944edffff04ffff01b0957020199fa3f30cd1944261be5d5fa1df5c6fcb7cab55a300fb1491089fa0b4c817e67112836cc5214f62264f38ba58ffff04ffff01a0ccd5bb71183532bff220ba46c268991a00000000000000000000000000000000ffff04ffff01a0f40194bed1e3e48c4ddf15d2e2e7539d262c369e2f4bec69c15d7d19ebb542f9ff01808080808080ff01808080ff01ffffffa0342fbcfb03fe2c1d0e3e00bb74a6af2f6f22f0624210a6f8e5b6c994cc21da98ffa0f1e813ea4df12c7454319309cb90cc17d2aa9a6ac571ab20630bb854f9cb2409ff0180ff01ffffffff70c07701020213db9cb540a52c39071ef70acdf81796303189061b5aa0ee8098a05d5ceff5957020199fa3f30cd1944261be5d5fa1df5c6fcb7cab55a300fb1491089fa0b4c817e67112836cc5214f62264f38ba58010000001c68747470733a2f2f7669702e746565706f6f6c2e636f6d3a393434330000002080ff808080808080", + "removals": [ + { + "amount": 1, + "parent_coin_info": "0xd3321d108fae5fb10abe60e3d1c7ce06974c1f59efbcfd78b0d17f02f42fce34", + "puzzle_hash": "0x1addfd434269dab2bcc5d377b7cc60a6d66ade0caa6694f891493d1888416894" + } + ], + "spend_bundle": { + "aggregated_signature": "0x99ab45235e4e352c904c8bf1b97f3b570008bf5d9d49e02678f5021ac88920ff77da330f44c5d796ed35ff22f80d910f108f164c94e017a119f75b273f3ff004ff009a8614bc518912b2789c80b85b04e030351b8e1c91b1023b3a9f69855714", + "coin_spends": [ + { + "coin": { + "amount": 1, + "parent_coin_info": "0xd3321d108fae5fb10abe60e3d1c7ce06974c1f59efbcfd78b0d17f02f42fce34", + "puzzle_hash": "0x1addfd434269dab2bcc5d377b7cc60a6d66ade0caa6694f891493d1888416894" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ffff18ff2fffff010180ffff01ff02ff36ffff04ff02ffff04ff05ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff0bff80808080ffff04ff2fffff04ff0bffff04ff5fff808080808080808080ffff01ff088080ff0180ffff04ffff01ffffffff4602ff3304ffff0101ff02ffff02ffff03ff05ffff01ff02ff5cffff04ff02ffff04ff0dffff04ffff0bff2cffff0bff24ff3880ffff0bff2cffff0bff2cffff0bff24ff3480ff0980ffff0bff2cff0bffff0bff24ff8080808080ff8080808080ffff010b80ff0180ff02ffff03ff0bffff01ff02ff32ffff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ffff02ff2affff04ff02ffff04ffff02ffff03ffff09ff23ff2880ffff0181b3ff8080ff0180ff80808080ff80808080808080ffff01ff02ffff03ff17ff80ffff01ff088080ff018080ff0180ffffffff0bffff0bff17ffff02ff3affff04ff02ffff04ff09ffff04ff2fffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ff5f80ff0bff81bf80ff02ffff03ffff20ffff22ff4fff178080ffff01ff02ff7effff04ff02ffff04ff6fffff04ffff04ffff02ffff03ff4fffff01ff04ff23ffff04ffff02ff3affff04ff02ffff04ff09ffff04ff53ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff81b3ff80808080ffff011380ff0180ffff02ff7cffff04ff02ffff04ff05ffff04ff1bffff04ffff21ff4fff1780ff80808080808080ff8080808080ffff01ff088080ff0180ffff04ffff09ffff18ff05ffff010180ffff010180ffff09ff05ffff01818f8080ff0bff2cffff0bff24ff3080ffff0bff2cffff0bff2cffff0bff24ff3480ff0580ffff0bff2cffff02ff5cffff04ff02ffff04ff07ffff04ffff0bff24ff2480ff8080808080ffff0bff24ff8080808080ffffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff26ffff04ff02ffff04ff09ff80808080ffff02ff26ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ff5effff04ff02ffff04ff05ffff04ff0bffff04ffff02ff3affff04ff02ffff04ff09ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfff80808080808080808080ffff04ffff04ff20ffff04ff17ff808080ffff02ff7cffff04ff02ffff04ff05ffff04ffff02ff82017fffff04ffff04ffff04ff17ff2f80ffff04ffff04ff5fff81bf80ffff04ff0bff05808080ff8202ff8080ffff01ff80808080808080ffff02ff2effff04ff02ffff04ff05ffff04ff0bffff04ffff02ffff03ff3bffff01ff02ff22ffff04ff02ffff04ff05ffff04ff17ffff04ff13ffff04ff2bffff04ff5bffff04ff5fff808080808080808080ffff01ff02ffff03ffff09ff15ffff0bff13ff1dff2b8080ffff01ff0bff15ff17ff5f80ffff01ff088080ff018080ff0180ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfffff04ff82017fff8080808080808080808080ff02ffff03ff05ffff011bffff010b80ff0180ff018080ffff04ffff01ffa024e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fdffa0ec5af1eea043892e7ff3afea1bee6e4f8535294c7b8d9378a3d490c973d0874aa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff8202ffffff01ff02ff16ffff04ff02ffff04ff05ffff04ff8204bfffff04ff8206bfffff04ff82017fffff04ffff0bffff19ff2fffff18ffff019100ffffffffffffffffffffffffffffffffff8202ff8080ff0bff82017f80ff8080808080808080ffff01ff04ffff04ff08ffff04ff17ffff04ffff02ff1effff04ff02ffff04ff82017fff80808080ff80808080ffff04ffff04ff1cffff04ff5fffff04ff8206bfff80808080ff80808080ff0180ffff04ffff01ffff32ff3d33ff3effff04ffff04ff1cffff04ff0bffff04ff17ff80808080ffff04ffff04ff1cffff04ff05ffff04ff2fff80808080ffff04ffff04ff0affff04ff5fff808080ffff04ffff04ff14ffff04ffff0bff5fffff012480ff808080ff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01a00213db9cb540a52c39071ef70acdf81796303189061b5aa0ee8098a05d5ceff5ffff04ffff01a06b6e8c3148bf59ac525b30d4467dc90c18ea02cc030b5fdf6bf950e8113944edffff04ffff01b0957020199fa3f30cd1944261be5d5fa1df5c6fcb7cab55a300fb1491089fa0b4c817e67112836cc5214f62264f38ba58ffff04ffff01a0ccd5bb71183532bff220ba46c268991a00000000000000000000000000000000ffff04ffff01a0f40194bed1e3e48c4ddf15d2e2e7539d262c369e2f4bec69c15d7d19ebb542f9ff01808080808080ff01808080", + "solution": "0xffffa0342fbcfb03fe2c1d0e3e00bb74a6af2f6f22f0624210a6f8e5b6c994cc21da98ffa0f1e813ea4df12c7454319309cb90cc17d2aa9a6ac571ab20630bb854f9cb2409ff0180ff01ffffffff70c07701020213db9cb540a52c39071ef70acdf81796303189061b5aa0ee8098a05d5ceff5957020199fa3f30cd1944261be5d5fa1df5c6fcb7cab55a300fb1491089fa0b4c817e67112836cc5214f62264f38ba58010000001c68747470733a2f2f7669702e746565706f6f6c2e636f6d3a393434330000002080ff808080" + } + ] + }, + "spend_bundle_name": "0x307a7b33269cb5122b7fc6881f2883cab4602cb392eb875151aebaf93bf98a1c" + }, + "3595c11d0234cc0903499a1a5e328d1a349822ab9c9216ad93cbb43b7d86965f": { + "additions": [ + { + "amount": 1, + "parent_coin_info": "0xb2fadfa0875713e315ea84dfb1e41494dc7db839271ca84ce8b886bc4a352b81", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + }, + { + "amount": 99, + "parent_coin_info": "0xb2fadfa0875713e315ea84dfb1e41494dc7db839271ca84ce8b886bc4a352b81", + "puzzle_hash": "0x2199566f82acb2295b2e713944fe14292bb1fa321cf3058e16e7c8b276497377" + }, + { + "amount": 1, + "parent_coin_info": "0xe4b8ec7f99d7f3c1066967cd8a96fbdeb552ccaa2771c9f006d602e4c1f05eec", + "puzzle_hash": "0x6a7650e7455248a06c1dd23db305ff97c406bce07080e6999de3d40e06051ba0" + } + ], + "cost": 18343455, + "fee": 0, + "npc_result": { + "clvm_cost": 727455, + "error": null, + "npc_list": [ + { + "coin_name": "0xb2fadfa0875713e315ea84dfb1e41494dc7db839271ca84ce8b886bc4a352b81", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0xb59cc439f667fa2daee2aaafb7b88db9e4f6bab6ef2f194f3cec9ee90b8e45841a0a353833ee1331874c1f546bc4c1af", + "0x5b0a32f2f2df91f1940f8e76062e4759193b929e72084eaa0f04aa234e1d82ee" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9", + "0x01" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x2199566f82acb2295b2e713944fe14292bb1fa321cf3058e16e7c8b276497377", + "0x63" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x1f9a0701aec16c2e9aeec1fcd400dd943ffa5a9e99f02e09b6e8ffaeadaadbea" + ] + } + ] + ], + [ + "0x3d", + [ + { + "opcode": "ASSERT_COIN_ANNOUNCEMENT", + "vars": [ + "0xe1bf80b1557a88ed9310709553fec8f7e3398231f18c80baf814a3d0f47c8549" + ] + } + ] + ] + ], + "puzzle_hash": "0x33ea7523a2c9aa379d39cc9c9e6ad9f9d8584a7aed7622747d3de9df2135d5b5" + }, + { + "coin_name": "0xe4b8ec7f99d7f3c1066967cd8a96fbdeb552ccaa2771c9f006d602e4c1f05eec", + "conditions": [ + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x6a7650e7455248a06c1dd23db305ff97c406bce07080e6999de3d40e06051ba0", + "0x01" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x2d1ff423a5f13cd0fc57d9787bfc1744d811026a4c50f0a019b582bb2a5b3ad6" + ] + } + ] + ] + ], + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + } + ] + }, + "program": "0xff01ffffffa0acdad8dbc4c2eb1d76868d85217d53f983f1d7eecaeecead257e1a27569eab5cffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b59cc439f667fa2daee2aaafb7b88db9e4f6bab6ef2f194f3cec9ee90b8e45841a0a353833ee1331874c1f546bc4c1afff018080ff64ffff80ffff01ffff33ffa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ff0180ffff33ffa02199566f82acb2295b2e713944fe14292bb1fa321cf3058e16e7c8b276497377ff6380ffff3cffa01f9a0701aec16c2e9aeec1fcd400dd943ffa5a9e99f02e09b6e8ffaeadaadbea80ffff3dffa0e1bf80b1557a88ed9310709553fec8f7e3398231f18c80baf814a3d0f47c85498080ff808080ffffa0b2fadfa0875713e315ea84dfb1e41494dc7db839271ca84ce8b886bc4a352b81ffff02ffff01ff04ffff04ff04ffff04ff05ffff04ff0bff80808080ffff04ffff04ff0affff04ffff02ff0effff04ff02ffff04ffff04ff05ffff04ff0bffff04ff17ff80808080ff80808080ff808080ff808080ffff04ffff01ff33ff3cff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ff09ff80808080ffff02ff0effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ff01ffffa06a7650e7455248a06c1dd23db305ff97c406bce07080e6999de3d40e06051ba0ff01ffffff70c07301032f2c9ba1b2315d413a92b5f034fa03282ccba1767fd9ae7b14d942b969ed5d57a735ac48b5dada136dc4c7cc1a62fce6e979d47333e6734ff0f7dd021211ef7768f8a3ed344585d16566092b70719f5d010000001868747470733a2f2f61736961312e706f6f6c2e737061636500000040ffff7483093a80ffff68a00385375573c01965a5d439d268f5f7e7337f1828b06918ea1e4af4721c2545588080808080", + "removals": [ + { + "amount": 100, + "parent_coin_info": "0xacdad8dbc4c2eb1d76868d85217d53f983f1d7eecaeecead257e1a27569eab5c", + "puzzle_hash": "0x33ea7523a2c9aa379d39cc9c9e6ad9f9d8584a7aed7622747d3de9df2135d5b5" + }, + { + "amount": 1, + "parent_coin_info": "0xb2fadfa0875713e315ea84dfb1e41494dc7db839271ca84ce8b886bc4a352b81", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + } + ], + "spend_bundle": { + "aggregated_signature": "0xa343336d539e08aba31745485e244e4fb6ba88ec782ae5e999641c6eb907f36ee0d25bedb3a370fe9d014f76fd59ebfa1523b2d0ed84bd049f8b3cb397013e61a885f082ecacfd1f836ee4cb77ac4be621076b527012e0413f7bb914971412b8", + "coin_spends": [ + { + "coin": { + "amount": 100, + "parent_coin_info": "0xacdad8dbc4c2eb1d76868d85217d53f983f1d7eecaeecead257e1a27569eab5c", + "puzzle_hash": "0x33ea7523a2c9aa379d39cc9c9e6ad9f9d8584a7aed7622747d3de9df2135d5b5" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b59cc439f667fa2daee2aaafb7b88db9e4f6bab6ef2f194f3cec9ee90b8e45841a0a353833ee1331874c1f546bc4c1afff018080", + "solution": "0xff80ffff01ffff33ffa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ff0180ffff33ffa02199566f82acb2295b2e713944fe14292bb1fa321cf3058e16e7c8b276497377ff6380ffff3cffa01f9a0701aec16c2e9aeec1fcd400dd943ffa5a9e99f02e09b6e8ffaeadaadbea80ffff3dffa0e1bf80b1557a88ed9310709553fec8f7e3398231f18c80baf814a3d0f47c85498080ff8080" + }, + { + "coin": { + "amount": 1, + "parent_coin_info": "0xb2fadfa0875713e315ea84dfb1e41494dc7db839271ca84ce8b886bc4a352b81", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + }, + "puzzle_reveal": "0xff02ffff01ff04ffff04ff04ffff04ff05ffff04ff0bff80808080ffff04ffff04ff0affff04ffff02ff0effff04ff02ffff04ffff04ff05ffff04ff0bffff04ff17ff80808080ff80808080ff808080ff808080ffff04ffff01ff33ff3cff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ff09ff80808080ffff02ff0effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080", + "solution": "0xffa06a7650e7455248a06c1dd23db305ff97c406bce07080e6999de3d40e06051ba0ff01ffffff70c07301032f2c9ba1b2315d413a92b5f034fa03282ccba1767fd9ae7b14d942b969ed5d57a735ac48b5dada136dc4c7cc1a62fce6e979d47333e6734ff0f7dd021211ef7768f8a3ed344585d16566092b70719f5d010000001868747470733a2f2f61736961312e706f6f6c2e737061636500000040ffff7483093a80ffff68a00385375573c01965a5d439d268f5f7e7337f1828b06918ea1e4af4721c2545588080" + } + ] + }, + "spend_bundle_name": "0x3595c11d0234cc0903499a1a5e328d1a349822ab9c9216ad93cbb43b7d86965f" + }, + "531e5b9c45edfbe9f22f6cdc9234d78eff2d92513877d19bf8e4ce3632ab1677": { + "additions": [ + { + "amount": 30180000000, + "parent_coin_info": "0x09283debbe4b9c9a7db61fd2faeb303df9b42fe272d53cd1682678585177692e", + "puzzle_hash": "0x489d004706e88bbf814066bd4ff8b3eb0b4613873825319e9fb5e9a79dfa486f" + }, + { + "amount": 5369457, + "parent_coin_info": "0x09283debbe4b9c9a7db61fd2faeb303df9b42fe272d53cd1682678585177692e", + "puzzle_hash": "0xa3d623359623ab8e6d190852cfdada6e835fbe0e87f371696e122e5b0f52008c" + } + ], + "cost": 29557311, + "fee": 1, + "npc_result": { + "clvm_cost": 1597311, + "error": null, + "npc_list": [ + { + "coin_name": "0x09283debbe4b9c9a7db61fd2faeb303df9b42fe272d53cd1682678585177692e", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0x9598084db821c507c17d79bd6ab2bf8747fc611dfa154b0ea8021e0e0575db99a568a3f15e9066761771c6fedccd91b0", + "0x2a8c2e245a90234f6a5107582497057c14e3d0467999c916732f63eebeee24b3" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x489d004706e88bbf814066bd4ff8b3eb0b4613873825319e9fb5e9a79dfa486f", + "0x0706de4100" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xa3d623359623ab8e6d190852cfdada6e835fbe0e87f371696e122e5b0f52008c", + "0x51ee71" + ] + } + ] + ], + [ + "0x34", + [ + { + "opcode": "RESERVE_FEE", + "vars": [ + "0x01" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x00fdd6f93a66f30936794811303bbd45ef37616f17e1fea67ce60c7849b7baab" + ] + } + ] + ] + ], + "puzzle_hash": "0x965be050912802a7a070174a84d141d5b8e711d434ddabc950364e8c9863fd9f" + }, + { + "coin_name": "0xb27149b7a67ab1a9509e166e16d5d5d62ccb78c3d875ec0a7d5df62d083db97b", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0x9598084db821c507c17d79bd6ab2bf8747fc611dfa154b0ea8021e0e0575db99a568a3f15e9066761771c6fedccd91b0", + "0x0b92e47def73152a694d50cf610ee625b05fb603a44cd257979e7035dd71a78b" + ] + } + ] + ], + [ + "0x3d", + [ + { + "opcode": "ASSERT_COIN_ANNOUNCEMENT", + "vars": [ + "0x33717cb7ae6729651e452e9d012cda6c5280090684980ffe7ec7ad4de9fcfcba" + ] + } + ] + ] + ], + "puzzle_hash": "0x965be050912802a7a070174a84d141d5b8e711d434ddabc950364e8c9863fd9f" + }, + { + "coin_name": "0xc736e57fdf9772714e2c1968170109a8330f05aaa447b2b8ba54f6f916cb13c1", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0x9598084db821c507c17d79bd6ab2bf8747fc611dfa154b0ea8021e0e0575db99a568a3f15e9066761771c6fedccd91b0", + "0x0b92e47def73152a694d50cf610ee625b05fb603a44cd257979e7035dd71a78b" + ] + } + ] + ], + [ + "0x3d", + [ + { + "opcode": "ASSERT_COIN_ANNOUNCEMENT", + "vars": [ + "0x33717cb7ae6729651e452e9d012cda6c5280090684980ffe7ec7ad4de9fcfcba" + ] + } + ] + ] + ], + "puzzle_hash": "0x965be050912802a7a070174a84d141d5b8e711d434ddabc950364e8c9863fd9f" + }, + { + "coin_name": "0x329a05e52bdd9c4008ae43f0ab0eef821e8b806c0e979fecbf58e3deb9cddbda", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0x8da120b42a08428a28f0e8a1f158897b6c459b2128b5fcfdfca57c47e839577d521a9345fb3f4f6fe2a3e3869c1f01b0", + "0x0b92e47def73152a694d50cf610ee625b05fb603a44cd257979e7035dd71a78b" + ] + } + ] + ], + [ + "0x3d", + [ + { + "opcode": "ASSERT_COIN_ANNOUNCEMENT", + "vars": [ + "0x33717cb7ae6729651e452e9d012cda6c5280090684980ffe7ec7ad4de9fcfcba" + ] + } + ] + ] + ], + "puzzle_hash": "0x9d2b622632abbf9d64d253c8de871796c2f934fcc73aa6b1b09984f73ce50b23" + } + ] + }, + "program": "0xff01ffffffa010a61657d0a88e6f2c3c58cd161d103b613d14fa03dd1f9b6752359f33ae936effff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b09598084db821c507c17d79bd6ab2bf8747fc611dfa154b0ea8021e0e0575db99a568a3f15e9066761771c6fedccd91b0ff018080ff850254e24d01ffff80ffff01ffff33ffa0489d004706e88bbf814066bd4ff8b3eb0b4613873825319e9fb5e9a79dfa486fff850706de410080ffff33ffa0a3d623359623ab8e6d190852cfdada6e835fbe0e87f371696e122e5b0f52008cff8351ee7180ffff34ff0180ffff3cffa000fdd6f93a66f30936794811303bbd45ef37616f17e1fea67ce60c7849b7baab8080ff808080ffffa0ef1e67f59aa6214e9511739960293b5b03405cf35d6c0a13354e8891e65ec5a0ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b09598084db821c507c17d79bd6ab2bf8747fc611dfa154b0ea8021e0e0575db99a568a3f15e9066761771c6fedccd91b0ff018080ff85025761c990ffff80ffff01ffff3dffa033717cb7ae6729651e452e9d012cda6c5280090684980ffe7ec7ad4de9fcfcba8080ff808080ffffa02bd28d78338ad822f43ef0a76399afe0229237c7391bfdf8e3efb8a588f5ce4dffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b09598084db821c507c17d79bd6ab2bf8747fc611dfa154b0ea8021e0e0575db99a568a3f15e9066761771c6fedccd91b0ff018080ff850257704f4effff80ffff01ffff3dffa033717cb7ae6729651e452e9d012cda6c5280090684980ffe7ec7ad4de9fcfcba8080ff808080ffffa0b421df82a49f01adcfd7d28e7ad7b7f0a31a0e71e21de5c482183fa507ac458bffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b08da120b42a08428a28f0e8a1f158897b6c459b2128b5fcfdfca57c47e839577d521a9345fb3f4f6fe2a3e3869c1f01b0ff018080ff84037bc993ffff80ffff01ffff3dffa033717cb7ae6729651e452e9d012cda6c5280090684980ffe7ec7ad4de9fcfcba8080ff8080808080", + "removals": [ + { + "amount": 10014051585, + "parent_coin_info": "0x10a61657d0a88e6f2c3c58cd161d103b613d14fa03dd1f9b6752359f33ae936e", + "puzzle_hash": "0x965be050912802a7a070174a84d141d5b8e711d434ddabc950364e8c9863fd9f" + }, + { + "amount": 10055960976, + "parent_coin_info": "0xef1e67f59aa6214e9511739960293b5b03405cf35d6c0a13354e8891e65ec5a0", + "puzzle_hash": "0x965be050912802a7a070174a84d141d5b8e711d434ddabc950364e8c9863fd9f" + }, + { + "amount": 10056912718, + "parent_coin_info": "0x2bd28d78338ad822f43ef0a76399afe0229237c7391bfdf8e3efb8a588f5ce4d", + "puzzle_hash": "0x965be050912802a7a070174a84d141d5b8e711d434ddabc950364e8c9863fd9f" + }, + { + "amount": 58444179, + "parent_coin_info": "0xb421df82a49f01adcfd7d28e7ad7b7f0a31a0e71e21de5c482183fa507ac458b", + "puzzle_hash": "0x9d2b622632abbf9d64d253c8de871796c2f934fcc73aa6b1b09984f73ce50b23" + } + ], + "spend_bundle": { + "aggregated_signature": "0xa535394e5b2acaef1bd71323bad868f7ed714a712a9052298ce9f4dcccb2e82f7ee5400d11e12ad2a731c7e33514d685121c3d95ffac0143fd481357abfb26ae13b8036f929905a4abad54f0d746aff57a38c859fedee396f001b7b03a8b87c4", + "coin_spends": [ + { + "coin": { + "amount": 10014051585, + "parent_coin_info": "0x10a61657d0a88e6f2c3c58cd161d103b613d14fa03dd1f9b6752359f33ae936e", + "puzzle_hash": "0x965be050912802a7a070174a84d141d5b8e711d434ddabc950364e8c9863fd9f" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b09598084db821c507c17d79bd6ab2bf8747fc611dfa154b0ea8021e0e0575db99a568a3f15e9066761771c6fedccd91b0ff018080", + "solution": "0xff80ffff01ffff33ffa0489d004706e88bbf814066bd4ff8b3eb0b4613873825319e9fb5e9a79dfa486fff850706de410080ffff33ffa0a3d623359623ab8e6d190852cfdada6e835fbe0e87f371696e122e5b0f52008cff8351ee7180ffff34ff0180ffff3cffa000fdd6f93a66f30936794811303bbd45ef37616f17e1fea67ce60c7849b7baab8080ff8080" + }, + { + "coin": { + "amount": 10055960976, + "parent_coin_info": "0xef1e67f59aa6214e9511739960293b5b03405cf35d6c0a13354e8891e65ec5a0", + "puzzle_hash": "0x965be050912802a7a070174a84d141d5b8e711d434ddabc950364e8c9863fd9f" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b09598084db821c507c17d79bd6ab2bf8747fc611dfa154b0ea8021e0e0575db99a568a3f15e9066761771c6fedccd91b0ff018080", + "solution": "0xff80ffff01ffff3dffa033717cb7ae6729651e452e9d012cda6c5280090684980ffe7ec7ad4de9fcfcba8080ff8080" + }, + { + "coin": { + "amount": 10056912718, + "parent_coin_info": "0x2bd28d78338ad822f43ef0a76399afe0229237c7391bfdf8e3efb8a588f5ce4d", + "puzzle_hash": "0x965be050912802a7a070174a84d141d5b8e711d434ddabc950364e8c9863fd9f" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b09598084db821c507c17d79bd6ab2bf8747fc611dfa154b0ea8021e0e0575db99a568a3f15e9066761771c6fedccd91b0ff018080", + "solution": "0xff80ffff01ffff3dffa033717cb7ae6729651e452e9d012cda6c5280090684980ffe7ec7ad4de9fcfcba8080ff8080" + }, + { + "coin": { + "amount": 58444179, + "parent_coin_info": "0xb421df82a49f01adcfd7d28e7ad7b7f0a31a0e71e21de5c482183fa507ac458b", + "puzzle_hash": "0x9d2b622632abbf9d64d253c8de871796c2f934fcc73aa6b1b09984f73ce50b23" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b08da120b42a08428a28f0e8a1f158897b6c459b2128b5fcfdfca57c47e839577d521a9345fb3f4f6fe2a3e3869c1f01b0ff018080", + "solution": "0xff80ffff01ffff3dffa033717cb7ae6729651e452e9d012cda6c5280090684980ffe7ec7ad4de9fcfcba8080ff8080" + } + ] + }, + "spend_bundle_name": "0x531e5b9c45edfbe9f22f6cdc9234d78eff2d92513877d19bf8e4ce3632ab1677" + }, + "6f5af47a80089719c282e04a7c9e996a3c26b0c60b0eb22bf63e210ea30f369d": { + "additions": [ + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x625c136559151a618bef0f2cda3c27c3daeed9bb614711ec50d387e6638f4f95" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xae009fce4fd79faf9f124787124620ac1e15f5429c38616e69ada33d900918d0" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x26768ae8f0dae51dab44ce80335f57bb193202bfc8bc3237a22f8a96586b3742" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x4d1ab3b2feaf2d2de401e3169c806d3db29e30ca13e49f125ca0766d1d3d5702" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x9d8c67cc069f389eb3fcaaaed4a6fe15dead3f5246c07dbe2b8dda1012866395" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xca5883a2de2bdb9a5694481d11d531417915a1abacf24cd162312cf7c6160333" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x40095aec3600ab14dc2d64db41eceb645f413f95d53cdbc6115efa8b8755b9fa" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xfac8f13889faceacb3594fa8d86ed3dc39ed603f1236f38f3eb503cd65cfce66" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xef9153006fe91736c855d9390d06bfbf896689b8ec9c0f217d95b465007ddc6a" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xd191d47ea8cce976e609816606052e331ed76d12dd207e9b86b40ee3c317c8c2" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x1a75ddbe9e47c0efed4b1683d3c0828ce89e97cd306fa0afdf7e250ef559f033" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x7541917743dee2a2e6481b7302d66b77173588da962740b53a5a3e485b2cabd2" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xf3301a343aa748e4cf1903df297fd88d5ec0428d72d248fc0e6e32f2f0fbbf4d" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x316e69e0c518ab47a319e1ae77add29ace19f1ca61c56a7f53cf48d9a4cd6130" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x16ce107c47d81b34e4f516ed5188b9435f5e70a128cc4a2f048e2bd54b0ef3f8" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x8a0aa4ae579352a5e57ac9aca552781655d2d2340ec49b99ddc9c9fba91b3ca5" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xebd6bdba6f9a359dbbd9448218737eb425995340aba10ad8ececb743e0ef9724" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xb28dedf16d81b46aff36777f124bab268363b7cbb43564844855bee5e3ef1375" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x2ce2d326b6af88f2df1ecfe40c4c57f3a1573961309c085019015ad2cabe0e4f" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xb86a8459b4bb502411444684b67b1949c59b69b9f4fece000b8689b875c9fc8f" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xe879783d8e818804a6953f62ef0875ab53cf48b8a9c506a6d82c8c2fb12b9a16" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xdead68caed43d10ee5c81b949bca8b5ae6caba002b62ed2dccb587b69098314d" + }, + { + "amount": 8812151, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x04eb0e2cb6609d0052cc674be6ff4db676fc9ed71c3fa42fe71a4ea87038ed3e" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x63540bb301f238d590f2b9de4982e1ed17625e70d5675c8134f997390b8341b8" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xa2ab6882e54d82d166a6a9756ed861fa05c4bbc3928fd4dc6625c80bc73e1615" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x668ceabe66a996cc3b1a9810a2940feb34b371544a0c3e81b9cf76cde68b56ce" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x9fc3c5d72422218e0c4d5a5f7f2500da7bf6e76bfe08f8d5037246536a4aa2f9" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xb019ff629fa0fb9c33181a4cf276a6e349c009ef6fede51e00cdb9f46452389b" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x5d7cd5ca459d4dc635845c125ada44e3f36126abe98e5a0ac54c884b36b143d6" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x7c3b99fb11b160a312ddaa4d76ac15f1851363013f85625529238ae69040e7d9" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x6d52f2797b570c7178d6a2c52d7f28379ac34217aefdb888a61c034df4959990" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xd36b710b17743c61998f14a0ac57ac9b2bf664772329298912c9a530bf236955" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x1f703c501db4dcb4c28e8782f5af5ba7e315047b5f8c766a222525708d9137b2" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xa1fc54fb99d1bea0fe6142a3d14450e4d9111975e939a8dc7726717962bd5e80" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x661211cf6ee9c6a5241afc726928cfc7809c8ca6eb3401685354e96133d19efa" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x3d111cd5cf78f84176bfb427a1010f5f2b5fdd3f3d255ed6216bc52667a28ca1" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x3c7409e7ba3e0e9d99821f29fddadce364eba8b4e0a4c105bcf50c0651c66472" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xaab1dda86c65cd9f49e1e7cfa1a981da71eb39aaf431c0a517a4a0ffae36207e" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xa0890da9b904bedf7f3920f7a06c8b5e23281de7469841ec61b23cd1959740ff" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x041b71e085cb1c981f07c72d54b1733f3077c7a79b4e395a32fffd34f4dbad5f" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xa9fd4e96a5c370b292e0a094555a49fc1ffd9c2ae5f0fd3532f0b8bb59f14fb4" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x471de390fca8b03321e3a9d257a21556c0d5539b19fbee15fa5620b6b1d13148" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x1b9d80e73fb4e700d236197c19dfdfc08c38c2e35378bc91e9ca10d5ccb79e2c" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xe752a54c415b0e7f0881afebd3384fcf9f2178e88c0f71dc457c8f3afcd80013" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xa2428ee75a5f4b70b8ad4e13d1957c1bfbc6f346c8f46562d698c4ddc4e6dc81" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x9963c596b89907803933656d88ccc3eb061d36444a5439bc62884ac265c37b46" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x7fa97c07c8ccd6e96e59c62522332ab47bed45431dba50ded1acd7017733fa05" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x93f6fde6e238b7de4b97ca7e9d9597ae62035e4d63be5e929875e118b09e385d" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xa7e463b7f851cb0a2fdbfaea2a3bca2e30606579841ce7734d16702e896e3439" + }, + { + "amount": 75904003, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xc2644a968106ac1398936948cee3581c648bcec3f59be82f2fdc5b4cd5f6746c" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xf735b314842a855d3ff7fa72c162b9fe3992aef96e7adc6d3c84086b1faeab3a" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x82261f6308d86d01dd086432a8adf5f53752fb22af80827f527ea2a68b2adf14" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x4bb17528eb424cd83f5a4d467f56cc7db533d6e0b731a2ee13437d80719c9e05" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x8dc7e347640f2256ef23e90efa41d9466f24d2ee64276f57acc9f6a5dca30f6f" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x35f4db0c2d0b285c71cd39e4226183dd554985fd30b18e3ed2b5c1515eb2c9d1" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xb60e3e4867addd00b81e7602576252496ffbcefb6b9156ae89cae73cbbb6c718" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xca706632f1009e7333ade65266ce9c7fe5401cde3172c2f0b8e005bd1469fc44" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xecee67295fe24914cc9050330672b8b8d656889416133c91d24c57d1814ea78a" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x31bab1d699410cd2cbc17f7946f294ed49b1fbc57b7f18d42fc6e394ea1e13fb" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xeef94c037583357a0e4be16230ea2f79326b6f6b75c525061714dee81dc4ce13" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xa378adaeb6a3b888a5c8732dd866e8647accb70f452b9fdbdd9ed6b638f44090" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x0826d85e608843d64ef61d7f284c3d5e4191d1d211406e997f6d22f2f8ae0d26" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x4d75d05cd351a6db07b70397522d08ce3203518b3ace706abf54003c3aaddb5f" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x17e300582ae7615d9cbac9e8b77edf84488abb5820416074d40c4ce0dbb868d2" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xe9873dbe14c04515c7dae6025881bf3bdc3c2101b31c7a70ae542d4c88815b62" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x34d91616aecc88f9b35d7c5fe7bd3a1165a5b97eafb1d906d2c67e4f12e498f7" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x609d79244466d06996f4a4f8996bf23099afce1ac81d748dc6dc43e4264eea8a" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x19c86e36d47fcb9690d539ebe992f35806ee62e0ca3b9b6774da12a48adaf3e6" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x627484058cdcb79519af814690defb4ccdc91d2fb01845d500a5bef294a9cb19" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xcdf25481c6c5969279c6c00060d9830c293378b99bf874455680a755e2746910" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x6330368ff3d22d0904aaab825afe2cfd9bffaff3b3ab1c6d2615c2cabf6c1288" + }, + { + "amount": 89625442, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x596075ac58a7d6a2e8641423cbf4da5b220049bb2c354c222977082027ed6d38" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xa775299884fdf7482a9aeb2ec557ac38ae54fd45e4327715c07185a38f2eeb50" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xc0dc1b7b2cfd8f4392e3f9b314283bd937678225d631a804b8253c759c46eced" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x294e2875edda3335936816346ffaddc0356b0610abeccd40f4371f0c8b5ccf8b" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xccdad28ecf01052583487633053146cee3545b9aa97a86c506f8c9f22b4585e3" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x235618f73c15cff5e490bf3291b70b8e54b5d8570da3470643eafe5ab6f12f52" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x5ff177f430854b605f7b33e0370a646fd6984ec7719494d7378e5242fa8b3cc8" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xfc1c3f507c4471484ad0f0f02532f9158bed1eefb6b2ed5e9841e936b950425c" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x7a60d866630426257ffd0183ab379370b8af827b8a0ed3d8a4cd626a53dc9877" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x649db88b5346eb24ed5e660f32c001e3ded6b93338a06ba1aaa6b7d6ed1cfafa" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x7ea3d266f53137f28f80af47cd28b80e9c96714e011daaa249ff51d7bdb506a6" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x198fc3c055b4d69662425dcac158db6d6f8af62c1eadb00fbc3308abeda40392" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xd8507c764f26cb308f35c855a5761aac28d57fde4688634dc798cf41ee22c460" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xd2ea4a6caa7b049a5dea31bc55f033b00dad18710d975048949dd400bebe047c" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xc6a594659a6af63ee02cc22b7d149d651d4ecc401340865245713e0f851e2f52" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x16e97f7bd7af15e8f4bdf2f8e5a1290cb49e4f0df52fef600a95f994fed1960c" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xf658b7c55a5bbfb89647afe04733c3b654c426ed13e1329c470625dcc32e1d22" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xb2d91befc621af450b938778d628ee74125cbc836a9b21fddf60890e261fe9e7" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x3fcc9f0ac143f21048391ba930391641fc7e7ecf49a96b5f067821261d7fc875" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x6901c08936e5d3899397427f3e2da6bcb0332e1e034ae5ec08ce9dea319f90bf" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x24e9e3479ff037053e96be0891be3957f455a3239a143b8ffb46ce9674d19b6d" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x94b51e222128e715e881115f32bbc56664fc6475292569ca76980628c33b16d3" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xccca72787228b80363fe782d6ca0e7b9c5dc58dc3dc6030e2365c26aaa1170f0" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x4ae2ee3b36cb862095292f12ffdf91eee3356f6bd5aa6a53e59f3f3dc4b89d40" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xd022e71932c1b25b8f1bfda280db23db1c707d0e2b7be05755276bca7a84d535" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x122e98fb13f6874c46ff56f317ea45776c2487741a6efa17549163c1697a30b0" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xd5ad43d892b9fc1c3a623b3c4f4d78819e1ed52ece730f535ae536232750184f" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x553a5a091c73f93df732df10e1fcf42742b49b542264debafe9f81bf94f3088f" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x983cf3296cfeb7946577bb0a75f5c9f8c825311e8f1db1551344ff72b6d212e3" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x12faa57919dc324df3439ba7c60b215c3f0a748a8ac12da96fddb4be14e94cc7" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xd0ebc027c12f6a66c654673821f0f9b7047ba85d9661084a91e67fc5edc66458" + }, + { + "amount": 1000000, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0x753850e5e14c721ed345662255dace0c6aa4e6a3f55142d51431ef9f3792e0f5" + }, + { + "amount": 53692671158, + "parent_coin_info": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "puzzle_hash": "0xcf7077701a438ecc44bc4d46ac78698b46a08eee783dab279d3f75f835796b07" + } + ], + "cost": 248557058, + "fee": 10000, + "npc_result": { + "clvm_cost": 1681058, + "error": null, + "npc_list": [ + { + "coin_name": "0x82aa62f2ccfc05996eb7440796038048c6e3772544a75044a898d70ecac7ff9b", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0xb9aade8588c8aceebbd792d43e192503dbbb59e2deb154cf19a529f1d658e20a781a89c92e3c32a7a53f5dce4eb424ad", + "0x5ed02136bf39ce865d34cfc4cf261d3a386250954d14310cb5e1890048461c0d" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x625c136559151a618bef0f2cda3c27c3daeed9bb614711ec50d387e6638f4f95", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xae009fce4fd79faf9f124787124620ac1e15f5429c38616e69ada33d900918d0", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x26768ae8f0dae51dab44ce80335f57bb193202bfc8bc3237a22f8a96586b3742", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x4d1ab3b2feaf2d2de401e3169c806d3db29e30ca13e49f125ca0766d1d3d5702", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x9d8c67cc069f389eb3fcaaaed4a6fe15dead3f5246c07dbe2b8dda1012866395", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xca5883a2de2bdb9a5694481d11d531417915a1abacf24cd162312cf7c6160333", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x40095aec3600ab14dc2d64db41eceb645f413f95d53cdbc6115efa8b8755b9fa", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xfac8f13889faceacb3594fa8d86ed3dc39ed603f1236f38f3eb503cd65cfce66", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xef9153006fe91736c855d9390d06bfbf896689b8ec9c0f217d95b465007ddc6a", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xd191d47ea8cce976e609816606052e331ed76d12dd207e9b86b40ee3c317c8c2", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x1a75ddbe9e47c0efed4b1683d3c0828ce89e97cd306fa0afdf7e250ef559f033", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x7541917743dee2a2e6481b7302d66b77173588da962740b53a5a3e485b2cabd2", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xf3301a343aa748e4cf1903df297fd88d5ec0428d72d248fc0e6e32f2f0fbbf4d", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x316e69e0c518ab47a319e1ae77add29ace19f1ca61c56a7f53cf48d9a4cd6130", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x16ce107c47d81b34e4f516ed5188b9435f5e70a128cc4a2f048e2bd54b0ef3f8", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x8a0aa4ae579352a5e57ac9aca552781655d2d2340ec49b99ddc9c9fba91b3ca5", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xebd6bdba6f9a359dbbd9448218737eb425995340aba10ad8ececb743e0ef9724", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xb28dedf16d81b46aff36777f124bab268363b7cbb43564844855bee5e3ef1375", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x2ce2d326b6af88f2df1ecfe40c4c57f3a1573961309c085019015ad2cabe0e4f", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xb86a8459b4bb502411444684b67b1949c59b69b9f4fece000b8689b875c9fc8f", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xe879783d8e818804a6953f62ef0875ab53cf48b8a9c506a6d82c8c2fb12b9a16", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xdead68caed43d10ee5c81b949bca8b5ae6caba002b62ed2dccb587b69098314d", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x04eb0e2cb6609d0052cc674be6ff4db676fc9ed71c3fa42fe71a4ea87038ed3e", + "0x00867677" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x63540bb301f238d590f2b9de4982e1ed17625e70d5675c8134f997390b8341b8", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xa2ab6882e54d82d166a6a9756ed861fa05c4bbc3928fd4dc6625c80bc73e1615", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x668ceabe66a996cc3b1a9810a2940feb34b371544a0c3e81b9cf76cde68b56ce", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x9fc3c5d72422218e0c4d5a5f7f2500da7bf6e76bfe08f8d5037246536a4aa2f9", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xb019ff629fa0fb9c33181a4cf276a6e349c009ef6fede51e00cdb9f46452389b", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x5d7cd5ca459d4dc635845c125ada44e3f36126abe98e5a0ac54c884b36b143d6", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x7c3b99fb11b160a312ddaa4d76ac15f1851363013f85625529238ae69040e7d9", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x6d52f2797b570c7178d6a2c52d7f28379ac34217aefdb888a61c034df4959990", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xd36b710b17743c61998f14a0ac57ac9b2bf664772329298912c9a530bf236955", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x1f703c501db4dcb4c28e8782f5af5ba7e315047b5f8c766a222525708d9137b2", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xa1fc54fb99d1bea0fe6142a3d14450e4d9111975e939a8dc7726717962bd5e80", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x661211cf6ee9c6a5241afc726928cfc7809c8ca6eb3401685354e96133d19efa", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x3d111cd5cf78f84176bfb427a1010f5f2b5fdd3f3d255ed6216bc52667a28ca1", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x3c7409e7ba3e0e9d99821f29fddadce364eba8b4e0a4c105bcf50c0651c66472", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xaab1dda86c65cd9f49e1e7cfa1a981da71eb39aaf431c0a517a4a0ffae36207e", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xa0890da9b904bedf7f3920f7a06c8b5e23281de7469841ec61b23cd1959740ff", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x041b71e085cb1c981f07c72d54b1733f3077c7a79b4e395a32fffd34f4dbad5f", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xa9fd4e96a5c370b292e0a094555a49fc1ffd9c2ae5f0fd3532f0b8bb59f14fb4", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x471de390fca8b03321e3a9d257a21556c0d5539b19fbee15fa5620b6b1d13148", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x1b9d80e73fb4e700d236197c19dfdfc08c38c2e35378bc91e9ca10d5ccb79e2c", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xe752a54c415b0e7f0881afebd3384fcf9f2178e88c0f71dc457c8f3afcd80013", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xa2428ee75a5f4b70b8ad4e13d1957c1bfbc6f346c8f46562d698c4ddc4e6dc81", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x9963c596b89907803933656d88ccc3eb061d36444a5439bc62884ac265c37b46", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x7fa97c07c8ccd6e96e59c62522332ab47bed45431dba50ded1acd7017733fa05", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x93f6fde6e238b7de4b97ca7e9d9597ae62035e4d63be5e929875e118b09e385d", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xa7e463b7f851cb0a2fdbfaea2a3bca2e30606579841ce7734d16702e896e3439", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xc2644a968106ac1398936948cee3581c648bcec3f59be82f2fdc5b4cd5f6746c", + "0x04863403" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xf735b314842a855d3ff7fa72c162b9fe3992aef96e7adc6d3c84086b1faeab3a", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x82261f6308d86d01dd086432a8adf5f53752fb22af80827f527ea2a68b2adf14", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x4bb17528eb424cd83f5a4d467f56cc7db533d6e0b731a2ee13437d80719c9e05", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x8dc7e347640f2256ef23e90efa41d9466f24d2ee64276f57acc9f6a5dca30f6f", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x35f4db0c2d0b285c71cd39e4226183dd554985fd30b18e3ed2b5c1515eb2c9d1", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xb60e3e4867addd00b81e7602576252496ffbcefb6b9156ae89cae73cbbb6c718", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xca706632f1009e7333ade65266ce9c7fe5401cde3172c2f0b8e005bd1469fc44", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xecee67295fe24914cc9050330672b8b8d656889416133c91d24c57d1814ea78a", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x31bab1d699410cd2cbc17f7946f294ed49b1fbc57b7f18d42fc6e394ea1e13fb", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xeef94c037583357a0e4be16230ea2f79326b6f6b75c525061714dee81dc4ce13", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xa378adaeb6a3b888a5c8732dd866e8647accb70f452b9fdbdd9ed6b638f44090", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x0826d85e608843d64ef61d7f284c3d5e4191d1d211406e997f6d22f2f8ae0d26", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x4d75d05cd351a6db07b70397522d08ce3203518b3ace706abf54003c3aaddb5f", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x17e300582ae7615d9cbac9e8b77edf84488abb5820416074d40c4ce0dbb868d2", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xe9873dbe14c04515c7dae6025881bf3bdc3c2101b31c7a70ae542d4c88815b62", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x34d91616aecc88f9b35d7c5fe7bd3a1165a5b97eafb1d906d2c67e4f12e498f7", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x609d79244466d06996f4a4f8996bf23099afce1ac81d748dc6dc43e4264eea8a", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x19c86e36d47fcb9690d539ebe992f35806ee62e0ca3b9b6774da12a48adaf3e6", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x627484058cdcb79519af814690defb4ccdc91d2fb01845d500a5bef294a9cb19", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xcdf25481c6c5969279c6c00060d9830c293378b99bf874455680a755e2746910", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x6330368ff3d22d0904aaab825afe2cfd9bffaff3b3ab1c6d2615c2cabf6c1288", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x596075ac58a7d6a2e8641423cbf4da5b220049bb2c354c222977082027ed6d38", + "0x05579362" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xa775299884fdf7482a9aeb2ec557ac38ae54fd45e4327715c07185a38f2eeb50", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xc0dc1b7b2cfd8f4392e3f9b314283bd937678225d631a804b8253c759c46eced", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x294e2875edda3335936816346ffaddc0356b0610abeccd40f4371f0c8b5ccf8b", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xccdad28ecf01052583487633053146cee3545b9aa97a86c506f8c9f22b4585e3", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x235618f73c15cff5e490bf3291b70b8e54b5d8570da3470643eafe5ab6f12f52", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x5ff177f430854b605f7b33e0370a646fd6984ec7719494d7378e5242fa8b3cc8", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xfc1c3f507c4471484ad0f0f02532f9158bed1eefb6b2ed5e9841e936b950425c", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x7a60d866630426257ffd0183ab379370b8af827b8a0ed3d8a4cd626a53dc9877", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x649db88b5346eb24ed5e660f32c001e3ded6b93338a06ba1aaa6b7d6ed1cfafa", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x7ea3d266f53137f28f80af47cd28b80e9c96714e011daaa249ff51d7bdb506a6", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x198fc3c055b4d69662425dcac158db6d6f8af62c1eadb00fbc3308abeda40392", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xd8507c764f26cb308f35c855a5761aac28d57fde4688634dc798cf41ee22c460", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xd2ea4a6caa7b049a5dea31bc55f033b00dad18710d975048949dd400bebe047c", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xc6a594659a6af63ee02cc22b7d149d651d4ecc401340865245713e0f851e2f52", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x16e97f7bd7af15e8f4bdf2f8e5a1290cb49e4f0df52fef600a95f994fed1960c", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xf658b7c55a5bbfb89647afe04733c3b654c426ed13e1329c470625dcc32e1d22", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xb2d91befc621af450b938778d628ee74125cbc836a9b21fddf60890e261fe9e7", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x3fcc9f0ac143f21048391ba930391641fc7e7ecf49a96b5f067821261d7fc875", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x6901c08936e5d3899397427f3e2da6bcb0332e1e034ae5ec08ce9dea319f90bf", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x24e9e3479ff037053e96be0891be3957f455a3239a143b8ffb46ce9674d19b6d", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x94b51e222128e715e881115f32bbc56664fc6475292569ca76980628c33b16d3", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xccca72787228b80363fe782d6ca0e7b9c5dc58dc3dc6030e2365c26aaa1170f0", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x4ae2ee3b36cb862095292f12ffdf91eee3356f6bd5aa6a53e59f3f3dc4b89d40", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xd022e71932c1b25b8f1bfda280db23db1c707d0e2b7be05755276bca7a84d535", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x122e98fb13f6874c46ff56f317ea45776c2487741a6efa17549163c1697a30b0", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xd5ad43d892b9fc1c3a623b3c4f4d78819e1ed52ece730f535ae536232750184f", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x553a5a091c73f93df732df10e1fcf42742b49b542264debafe9f81bf94f3088f", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x983cf3296cfeb7946577bb0a75f5c9f8c825311e8f1db1551344ff72b6d212e3", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x12faa57919dc324df3439ba7c60b215c3f0a748a8ac12da96fddb4be14e94cc7", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xd0ebc027c12f6a66c654673821f0f9b7047ba85d9661084a91e67fc5edc66458", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x753850e5e14c721ed345662255dace0c6aa4e6a3f55142d51431ef9f3792e0f5", + "0x0f4240" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xcf7077701a438ecc44bc4d46ac78698b46a08eee783dab279d3f75f835796b07", + "0x0c805524b6" + ] + } + ] + ], + [ + "0x34", + [ + { + "opcode": "RESERVE_FEE", + "vars": [ + "0x2710" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0xb88cab3086dfe7abdb46cb90ceea7b33fd4641fa350efe1a4e6e4995f7805b6b" + ] + } + ] + ] + ], + "puzzle_hash": "0xd5388c182eeaae01d4fcdc849dce48775e4f6bff1dbaa2412a07872e087c2b09" + } + ] + }, + "program": "0xff01ffffffa085041700fea12bd1b827e2a50365da042c7e1d34204c4fe2a3121219800e91bbffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b9aade8588c8aceebbd792d43e192503dbbb59e2deb154cf19a529f1d658e20a781a89c92e3c32a7a53f5dce4eb424adff018080ff850c90af6aa2ffff80ffff01ffff33ffa0625c136559151a618bef0f2cda3c27c3daeed9bb614711ec50d387e6638f4f95ff830f424080ffff33ffa0ae009fce4fd79faf9f124787124620ac1e15f5429c38616e69ada33d900918d0ff830f424080ffff33ffa026768ae8f0dae51dab44ce80335f57bb193202bfc8bc3237a22f8a96586b3742ff830f424080ffff33ffa04d1ab3b2feaf2d2de401e3169c806d3db29e30ca13e49f125ca0766d1d3d5702ff830f424080ffff33ffa09d8c67cc069f389eb3fcaaaed4a6fe15dead3f5246c07dbe2b8dda1012866395ff830f424080ffff33ffa0ca5883a2de2bdb9a5694481d11d531417915a1abacf24cd162312cf7c6160333ff830f424080ffff33ffa040095aec3600ab14dc2d64db41eceb645f413f95d53cdbc6115efa8b8755b9faff830f424080ffff33ffa0fac8f13889faceacb3594fa8d86ed3dc39ed603f1236f38f3eb503cd65cfce66ff830f424080ffff33ffa0ef9153006fe91736c855d9390d06bfbf896689b8ec9c0f217d95b465007ddc6aff830f424080ffff33ffa0d191d47ea8cce976e609816606052e331ed76d12dd207e9b86b40ee3c317c8c2ff830f424080ffff33ffa01a75ddbe9e47c0efed4b1683d3c0828ce89e97cd306fa0afdf7e250ef559f033ff830f424080ffff33ffa07541917743dee2a2e6481b7302d66b77173588da962740b53a5a3e485b2cabd2ff830f424080ffff33ffa0f3301a343aa748e4cf1903df297fd88d5ec0428d72d248fc0e6e32f2f0fbbf4dff830f424080ffff33ffa0316e69e0c518ab47a319e1ae77add29ace19f1ca61c56a7f53cf48d9a4cd6130ff830f424080ffff33ffa016ce107c47d81b34e4f516ed5188b9435f5e70a128cc4a2f048e2bd54b0ef3f8ff830f424080ffff33ffa08a0aa4ae579352a5e57ac9aca552781655d2d2340ec49b99ddc9c9fba91b3ca5ff830f424080ffff33ffa0ebd6bdba6f9a359dbbd9448218737eb425995340aba10ad8ececb743e0ef9724ff830f424080ffff33ffa0b28dedf16d81b46aff36777f124bab268363b7cbb43564844855bee5e3ef1375ff830f424080ffff33ffa02ce2d326b6af88f2df1ecfe40c4c57f3a1573961309c085019015ad2cabe0e4fff830f424080ffff33ffa0b86a8459b4bb502411444684b67b1949c59b69b9f4fece000b8689b875c9fc8fff830f424080ffff33ffa0e879783d8e818804a6953f62ef0875ab53cf48b8a9c506a6d82c8c2fb12b9a16ff830f424080ffff33ffa0dead68caed43d10ee5c81b949bca8b5ae6caba002b62ed2dccb587b69098314dff830f424080ffff33ffa004eb0e2cb6609d0052cc674be6ff4db676fc9ed71c3fa42fe71a4ea87038ed3eff840086767780ffff33ffa063540bb301f238d590f2b9de4982e1ed17625e70d5675c8134f997390b8341b8ff830f424080ffff33ffa0a2ab6882e54d82d166a6a9756ed861fa05c4bbc3928fd4dc6625c80bc73e1615ff830f424080ffff33ffa0668ceabe66a996cc3b1a9810a2940feb34b371544a0c3e81b9cf76cde68b56ceff830f424080ffff33ffa09fc3c5d72422218e0c4d5a5f7f2500da7bf6e76bfe08f8d5037246536a4aa2f9ff830f424080ffff33ffa0b019ff629fa0fb9c33181a4cf276a6e349c009ef6fede51e00cdb9f46452389bff830f424080ffff33ffa05d7cd5ca459d4dc635845c125ada44e3f36126abe98e5a0ac54c884b36b143d6ff830f424080ffff33ffa07c3b99fb11b160a312ddaa4d76ac15f1851363013f85625529238ae69040e7d9ff830f424080ffff33ffa06d52f2797b570c7178d6a2c52d7f28379ac34217aefdb888a61c034df4959990ff830f424080ffff33ffa0d36b710b17743c61998f14a0ac57ac9b2bf664772329298912c9a530bf236955ff830f424080ffff33ffa01f703c501db4dcb4c28e8782f5af5ba7e315047b5f8c766a222525708d9137b2ff830f424080ffff33ffa0a1fc54fb99d1bea0fe6142a3d14450e4d9111975e939a8dc7726717962bd5e80ff830f424080ffff33ffa0661211cf6ee9c6a5241afc726928cfc7809c8ca6eb3401685354e96133d19efaff830f424080ffff33ffa03d111cd5cf78f84176bfb427a1010f5f2b5fdd3f3d255ed6216bc52667a28ca1ff830f424080ffff33ffa03c7409e7ba3e0e9d99821f29fddadce364eba8b4e0a4c105bcf50c0651c66472ff830f424080ffff33ffa0aab1dda86c65cd9f49e1e7cfa1a981da71eb39aaf431c0a517a4a0ffae36207eff830f424080ffff33ffa0a0890da9b904bedf7f3920f7a06c8b5e23281de7469841ec61b23cd1959740ffff830f424080ffff33ffa0041b71e085cb1c981f07c72d54b1733f3077c7a79b4e395a32fffd34f4dbad5fff830f424080ffff33ffa0a9fd4e96a5c370b292e0a094555a49fc1ffd9c2ae5f0fd3532f0b8bb59f14fb4ff830f424080ffff33ffa0471de390fca8b03321e3a9d257a21556c0d5539b19fbee15fa5620b6b1d13148ff830f424080ffff33ffa01b9d80e73fb4e700d236197c19dfdfc08c38c2e35378bc91e9ca10d5ccb79e2cff830f424080ffff33ffa0e752a54c415b0e7f0881afebd3384fcf9f2178e88c0f71dc457c8f3afcd80013ff830f424080ffff33ffa0a2428ee75a5f4b70b8ad4e13d1957c1bfbc6f346c8f46562d698c4ddc4e6dc81ff830f424080ffff33ffa09963c596b89907803933656d88ccc3eb061d36444a5439bc62884ac265c37b46ff830f424080ffff33ffa07fa97c07c8ccd6e96e59c62522332ab47bed45431dba50ded1acd7017733fa05ff830f424080ffff33ffa093f6fde6e238b7de4b97ca7e9d9597ae62035e4d63be5e929875e118b09e385dff830f424080ffff33ffa0a7e463b7f851cb0a2fdbfaea2a3bca2e30606579841ce7734d16702e896e3439ff830f424080ffff33ffa0c2644a968106ac1398936948cee3581c648bcec3f59be82f2fdc5b4cd5f6746cff840486340380ffff33ffa0f735b314842a855d3ff7fa72c162b9fe3992aef96e7adc6d3c84086b1faeab3aff830f424080ffff33ffa082261f6308d86d01dd086432a8adf5f53752fb22af80827f527ea2a68b2adf14ff830f424080ffff33ffa04bb17528eb424cd83f5a4d467f56cc7db533d6e0b731a2ee13437d80719c9e05ff830f424080ffff33ffa08dc7e347640f2256ef23e90efa41d9466f24d2ee64276f57acc9f6a5dca30f6fff830f424080ffff33ffa035f4db0c2d0b285c71cd39e4226183dd554985fd30b18e3ed2b5c1515eb2c9d1ff830f424080ffff33ffa0b60e3e4867addd00b81e7602576252496ffbcefb6b9156ae89cae73cbbb6c718ff830f424080ffff33ffa0ca706632f1009e7333ade65266ce9c7fe5401cde3172c2f0b8e005bd1469fc44ff830f424080ffff33ffa0ecee67295fe24914cc9050330672b8b8d656889416133c91d24c57d1814ea78aff830f424080ffff33ffa031bab1d699410cd2cbc17f7946f294ed49b1fbc57b7f18d42fc6e394ea1e13fbff830f424080ffff33ffa0eef94c037583357a0e4be16230ea2f79326b6f6b75c525061714dee81dc4ce13ff830f424080ffff33ffa0a378adaeb6a3b888a5c8732dd866e8647accb70f452b9fdbdd9ed6b638f44090ff830f424080ffff33ffa00826d85e608843d64ef61d7f284c3d5e4191d1d211406e997f6d22f2f8ae0d26ff830f424080ffff33ffa04d75d05cd351a6db07b70397522d08ce3203518b3ace706abf54003c3aaddb5fff830f424080ffff33ffa017e300582ae7615d9cbac9e8b77edf84488abb5820416074d40c4ce0dbb868d2ff830f424080ffff33ffa0e9873dbe14c04515c7dae6025881bf3bdc3c2101b31c7a70ae542d4c88815b62ff830f424080ffff33ffa034d91616aecc88f9b35d7c5fe7bd3a1165a5b97eafb1d906d2c67e4f12e498f7ff830f424080ffff33ffa0609d79244466d06996f4a4f8996bf23099afce1ac81d748dc6dc43e4264eea8aff830f424080ffff33ffa019c86e36d47fcb9690d539ebe992f35806ee62e0ca3b9b6774da12a48adaf3e6ff830f424080ffff33ffa0627484058cdcb79519af814690defb4ccdc91d2fb01845d500a5bef294a9cb19ff830f424080ffff33ffa0cdf25481c6c5969279c6c00060d9830c293378b99bf874455680a755e2746910ff830f424080ffff33ffa06330368ff3d22d0904aaab825afe2cfd9bffaff3b3ab1c6d2615c2cabf6c1288ff830f424080ffff33ffa0596075ac58a7d6a2e8641423cbf4da5b220049bb2c354c222977082027ed6d38ff840557936280ffff33ffa0a775299884fdf7482a9aeb2ec557ac38ae54fd45e4327715c07185a38f2eeb50ff830f424080ffff33ffa0c0dc1b7b2cfd8f4392e3f9b314283bd937678225d631a804b8253c759c46ecedff830f424080ffff33ffa0294e2875edda3335936816346ffaddc0356b0610abeccd40f4371f0c8b5ccf8bff830f424080ffff33ffa0ccdad28ecf01052583487633053146cee3545b9aa97a86c506f8c9f22b4585e3ff830f424080ffff33ffa0235618f73c15cff5e490bf3291b70b8e54b5d8570da3470643eafe5ab6f12f52ff830f424080ffff33ffa05ff177f430854b605f7b33e0370a646fd6984ec7719494d7378e5242fa8b3cc8ff830f424080ffff33ffa0fc1c3f507c4471484ad0f0f02532f9158bed1eefb6b2ed5e9841e936b950425cff830f424080ffff33ffa07a60d866630426257ffd0183ab379370b8af827b8a0ed3d8a4cd626a53dc9877ff830f424080ffff33ffa0649db88b5346eb24ed5e660f32c001e3ded6b93338a06ba1aaa6b7d6ed1cfafaff830f424080ffff33ffa07ea3d266f53137f28f80af47cd28b80e9c96714e011daaa249ff51d7bdb506a6ff830f424080ffff33ffa0198fc3c055b4d69662425dcac158db6d6f8af62c1eadb00fbc3308abeda40392ff830f424080ffff33ffa0d8507c764f26cb308f35c855a5761aac28d57fde4688634dc798cf41ee22c460ff830f424080ffff33ffa0d2ea4a6caa7b049a5dea31bc55f033b00dad18710d975048949dd400bebe047cff830f424080ffff33ffa0c6a594659a6af63ee02cc22b7d149d651d4ecc401340865245713e0f851e2f52ff830f424080ffff33ffa016e97f7bd7af15e8f4bdf2f8e5a1290cb49e4f0df52fef600a95f994fed1960cff830f424080ffff33ffa0f658b7c55a5bbfb89647afe04733c3b654c426ed13e1329c470625dcc32e1d22ff830f424080ffff33ffa0b2d91befc621af450b938778d628ee74125cbc836a9b21fddf60890e261fe9e7ff830f424080ffff33ffa03fcc9f0ac143f21048391ba930391641fc7e7ecf49a96b5f067821261d7fc875ff830f424080ffff33ffa06901c08936e5d3899397427f3e2da6bcb0332e1e034ae5ec08ce9dea319f90bfff830f424080ffff33ffa024e9e3479ff037053e96be0891be3957f455a3239a143b8ffb46ce9674d19b6dff830f424080ffff33ffa094b51e222128e715e881115f32bbc56664fc6475292569ca76980628c33b16d3ff830f424080ffff33ffa0ccca72787228b80363fe782d6ca0e7b9c5dc58dc3dc6030e2365c26aaa1170f0ff830f424080ffff33ffa04ae2ee3b36cb862095292f12ffdf91eee3356f6bd5aa6a53e59f3f3dc4b89d40ff830f424080ffff33ffa0d022e71932c1b25b8f1bfda280db23db1c707d0e2b7be05755276bca7a84d535ff830f424080ffff33ffa0122e98fb13f6874c46ff56f317ea45776c2487741a6efa17549163c1697a30b0ff830f424080ffff33ffa0d5ad43d892b9fc1c3a623b3c4f4d78819e1ed52ece730f535ae536232750184fff830f424080ffff33ffa0553a5a091c73f93df732df10e1fcf42742b49b542264debafe9f81bf94f3088fff830f424080ffff33ffa0983cf3296cfeb7946577bb0a75f5c9f8c825311e8f1db1551344ff72b6d212e3ff830f424080ffff33ffa012faa57919dc324df3439ba7c60b215c3f0a748a8ac12da96fddb4be14e94cc7ff830f424080ffff33ffa0d0ebc027c12f6a66c654673821f0f9b7047ba85d9661084a91e67fc5edc66458ff830f424080ffff33ffa0753850e5e14c721ed345662255dace0c6aa4e6a3f55142d51431ef9f3792e0f5ff830f424080ffff33ffa0cf7077701a438ecc44bc4d46ac78698b46a08eee783dab279d3f75f835796b07ff850c805524b680ffff34ff82271080ffff3cffa0b88cab3086dfe7abdb46cb90ceea7b33fd4641fa350efe1a4e6e4995f7805b6b8080ff8080808080", + "removals": [ + { + "amount": 53967022754, + "parent_coin_info": "0x85041700fea12bd1b827e2a50365da042c7e1d34204c4fe2a3121219800e91bb", + "puzzle_hash": "0xd5388c182eeaae01d4fcdc849dce48775e4f6bff1dbaa2412a07872e087c2b09" + } + ], + "spend_bundle": { + "aggregated_signature": "0x854ce1901878ef84128425c67165917768781dc660580d05d49600d3d8fdb2ea462a33aa26e8d3085907c18e74f21bdf0b2eb945917dbe56d3b68f82fa1179a99f0578e549a1e122cda01537e3511a130f4daf4d2cfbbd11ba35f7b03dd63fc9", + "coin_spends": [ + { + "coin": { + "amount": 53967022754, + "parent_coin_info": "0x85041700fea12bd1b827e2a50365da042c7e1d34204c4fe2a3121219800e91bb", + "puzzle_hash": "0xd5388c182eeaae01d4fcdc849dce48775e4f6bff1dbaa2412a07872e087c2b09" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b9aade8588c8aceebbd792d43e192503dbbb59e2deb154cf19a529f1d658e20a781a89c92e3c32a7a53f5dce4eb424adff018080", + "solution": "0xff80ffff01ffff33ffa0625c136559151a618bef0f2cda3c27c3daeed9bb614711ec50d387e6638f4f95ff830f424080ffff33ffa0ae009fce4fd79faf9f124787124620ac1e15f5429c38616e69ada33d900918d0ff830f424080ffff33ffa026768ae8f0dae51dab44ce80335f57bb193202bfc8bc3237a22f8a96586b3742ff830f424080ffff33ffa04d1ab3b2feaf2d2de401e3169c806d3db29e30ca13e49f125ca0766d1d3d5702ff830f424080ffff33ffa09d8c67cc069f389eb3fcaaaed4a6fe15dead3f5246c07dbe2b8dda1012866395ff830f424080ffff33ffa0ca5883a2de2bdb9a5694481d11d531417915a1abacf24cd162312cf7c6160333ff830f424080ffff33ffa040095aec3600ab14dc2d64db41eceb645f413f95d53cdbc6115efa8b8755b9faff830f424080ffff33ffa0fac8f13889faceacb3594fa8d86ed3dc39ed603f1236f38f3eb503cd65cfce66ff830f424080ffff33ffa0ef9153006fe91736c855d9390d06bfbf896689b8ec9c0f217d95b465007ddc6aff830f424080ffff33ffa0d191d47ea8cce976e609816606052e331ed76d12dd207e9b86b40ee3c317c8c2ff830f424080ffff33ffa01a75ddbe9e47c0efed4b1683d3c0828ce89e97cd306fa0afdf7e250ef559f033ff830f424080ffff33ffa07541917743dee2a2e6481b7302d66b77173588da962740b53a5a3e485b2cabd2ff830f424080ffff33ffa0f3301a343aa748e4cf1903df297fd88d5ec0428d72d248fc0e6e32f2f0fbbf4dff830f424080ffff33ffa0316e69e0c518ab47a319e1ae77add29ace19f1ca61c56a7f53cf48d9a4cd6130ff830f424080ffff33ffa016ce107c47d81b34e4f516ed5188b9435f5e70a128cc4a2f048e2bd54b0ef3f8ff830f424080ffff33ffa08a0aa4ae579352a5e57ac9aca552781655d2d2340ec49b99ddc9c9fba91b3ca5ff830f424080ffff33ffa0ebd6bdba6f9a359dbbd9448218737eb425995340aba10ad8ececb743e0ef9724ff830f424080ffff33ffa0b28dedf16d81b46aff36777f124bab268363b7cbb43564844855bee5e3ef1375ff830f424080ffff33ffa02ce2d326b6af88f2df1ecfe40c4c57f3a1573961309c085019015ad2cabe0e4fff830f424080ffff33ffa0b86a8459b4bb502411444684b67b1949c59b69b9f4fece000b8689b875c9fc8fff830f424080ffff33ffa0e879783d8e818804a6953f62ef0875ab53cf48b8a9c506a6d82c8c2fb12b9a16ff830f424080ffff33ffa0dead68caed43d10ee5c81b949bca8b5ae6caba002b62ed2dccb587b69098314dff830f424080ffff33ffa004eb0e2cb6609d0052cc674be6ff4db676fc9ed71c3fa42fe71a4ea87038ed3eff840086767780ffff33ffa063540bb301f238d590f2b9de4982e1ed17625e70d5675c8134f997390b8341b8ff830f424080ffff33ffa0a2ab6882e54d82d166a6a9756ed861fa05c4bbc3928fd4dc6625c80bc73e1615ff830f424080ffff33ffa0668ceabe66a996cc3b1a9810a2940feb34b371544a0c3e81b9cf76cde68b56ceff830f424080ffff33ffa09fc3c5d72422218e0c4d5a5f7f2500da7bf6e76bfe08f8d5037246536a4aa2f9ff830f424080ffff33ffa0b019ff629fa0fb9c33181a4cf276a6e349c009ef6fede51e00cdb9f46452389bff830f424080ffff33ffa05d7cd5ca459d4dc635845c125ada44e3f36126abe98e5a0ac54c884b36b143d6ff830f424080ffff33ffa07c3b99fb11b160a312ddaa4d76ac15f1851363013f85625529238ae69040e7d9ff830f424080ffff33ffa06d52f2797b570c7178d6a2c52d7f28379ac34217aefdb888a61c034df4959990ff830f424080ffff33ffa0d36b710b17743c61998f14a0ac57ac9b2bf664772329298912c9a530bf236955ff830f424080ffff33ffa01f703c501db4dcb4c28e8782f5af5ba7e315047b5f8c766a222525708d9137b2ff830f424080ffff33ffa0a1fc54fb99d1bea0fe6142a3d14450e4d9111975e939a8dc7726717962bd5e80ff830f424080ffff33ffa0661211cf6ee9c6a5241afc726928cfc7809c8ca6eb3401685354e96133d19efaff830f424080ffff33ffa03d111cd5cf78f84176bfb427a1010f5f2b5fdd3f3d255ed6216bc52667a28ca1ff830f424080ffff33ffa03c7409e7ba3e0e9d99821f29fddadce364eba8b4e0a4c105bcf50c0651c66472ff830f424080ffff33ffa0aab1dda86c65cd9f49e1e7cfa1a981da71eb39aaf431c0a517a4a0ffae36207eff830f424080ffff33ffa0a0890da9b904bedf7f3920f7a06c8b5e23281de7469841ec61b23cd1959740ffff830f424080ffff33ffa0041b71e085cb1c981f07c72d54b1733f3077c7a79b4e395a32fffd34f4dbad5fff830f424080ffff33ffa0a9fd4e96a5c370b292e0a094555a49fc1ffd9c2ae5f0fd3532f0b8bb59f14fb4ff830f424080ffff33ffa0471de390fca8b03321e3a9d257a21556c0d5539b19fbee15fa5620b6b1d13148ff830f424080ffff33ffa01b9d80e73fb4e700d236197c19dfdfc08c38c2e35378bc91e9ca10d5ccb79e2cff830f424080ffff33ffa0e752a54c415b0e7f0881afebd3384fcf9f2178e88c0f71dc457c8f3afcd80013ff830f424080ffff33ffa0a2428ee75a5f4b70b8ad4e13d1957c1bfbc6f346c8f46562d698c4ddc4e6dc81ff830f424080ffff33ffa09963c596b89907803933656d88ccc3eb061d36444a5439bc62884ac265c37b46ff830f424080ffff33ffa07fa97c07c8ccd6e96e59c62522332ab47bed45431dba50ded1acd7017733fa05ff830f424080ffff33ffa093f6fde6e238b7de4b97ca7e9d9597ae62035e4d63be5e929875e118b09e385dff830f424080ffff33ffa0a7e463b7f851cb0a2fdbfaea2a3bca2e30606579841ce7734d16702e896e3439ff830f424080ffff33ffa0c2644a968106ac1398936948cee3581c648bcec3f59be82f2fdc5b4cd5f6746cff840486340380ffff33ffa0f735b314842a855d3ff7fa72c162b9fe3992aef96e7adc6d3c84086b1faeab3aff830f424080ffff33ffa082261f6308d86d01dd086432a8adf5f53752fb22af80827f527ea2a68b2adf14ff830f424080ffff33ffa04bb17528eb424cd83f5a4d467f56cc7db533d6e0b731a2ee13437d80719c9e05ff830f424080ffff33ffa08dc7e347640f2256ef23e90efa41d9466f24d2ee64276f57acc9f6a5dca30f6fff830f424080ffff33ffa035f4db0c2d0b285c71cd39e4226183dd554985fd30b18e3ed2b5c1515eb2c9d1ff830f424080ffff33ffa0b60e3e4867addd00b81e7602576252496ffbcefb6b9156ae89cae73cbbb6c718ff830f424080ffff33ffa0ca706632f1009e7333ade65266ce9c7fe5401cde3172c2f0b8e005bd1469fc44ff830f424080ffff33ffa0ecee67295fe24914cc9050330672b8b8d656889416133c91d24c57d1814ea78aff830f424080ffff33ffa031bab1d699410cd2cbc17f7946f294ed49b1fbc57b7f18d42fc6e394ea1e13fbff830f424080ffff33ffa0eef94c037583357a0e4be16230ea2f79326b6f6b75c525061714dee81dc4ce13ff830f424080ffff33ffa0a378adaeb6a3b888a5c8732dd866e8647accb70f452b9fdbdd9ed6b638f44090ff830f424080ffff33ffa00826d85e608843d64ef61d7f284c3d5e4191d1d211406e997f6d22f2f8ae0d26ff830f424080ffff33ffa04d75d05cd351a6db07b70397522d08ce3203518b3ace706abf54003c3aaddb5fff830f424080ffff33ffa017e300582ae7615d9cbac9e8b77edf84488abb5820416074d40c4ce0dbb868d2ff830f424080ffff33ffa0e9873dbe14c04515c7dae6025881bf3bdc3c2101b31c7a70ae542d4c88815b62ff830f424080ffff33ffa034d91616aecc88f9b35d7c5fe7bd3a1165a5b97eafb1d906d2c67e4f12e498f7ff830f424080ffff33ffa0609d79244466d06996f4a4f8996bf23099afce1ac81d748dc6dc43e4264eea8aff830f424080ffff33ffa019c86e36d47fcb9690d539ebe992f35806ee62e0ca3b9b6774da12a48adaf3e6ff830f424080ffff33ffa0627484058cdcb79519af814690defb4ccdc91d2fb01845d500a5bef294a9cb19ff830f424080ffff33ffa0cdf25481c6c5969279c6c00060d9830c293378b99bf874455680a755e2746910ff830f424080ffff33ffa06330368ff3d22d0904aaab825afe2cfd9bffaff3b3ab1c6d2615c2cabf6c1288ff830f424080ffff33ffa0596075ac58a7d6a2e8641423cbf4da5b220049bb2c354c222977082027ed6d38ff840557936280ffff33ffa0a775299884fdf7482a9aeb2ec557ac38ae54fd45e4327715c07185a38f2eeb50ff830f424080ffff33ffa0c0dc1b7b2cfd8f4392e3f9b314283bd937678225d631a804b8253c759c46ecedff830f424080ffff33ffa0294e2875edda3335936816346ffaddc0356b0610abeccd40f4371f0c8b5ccf8bff830f424080ffff33ffa0ccdad28ecf01052583487633053146cee3545b9aa97a86c506f8c9f22b4585e3ff830f424080ffff33ffa0235618f73c15cff5e490bf3291b70b8e54b5d8570da3470643eafe5ab6f12f52ff830f424080ffff33ffa05ff177f430854b605f7b33e0370a646fd6984ec7719494d7378e5242fa8b3cc8ff830f424080ffff33ffa0fc1c3f507c4471484ad0f0f02532f9158bed1eefb6b2ed5e9841e936b950425cff830f424080ffff33ffa07a60d866630426257ffd0183ab379370b8af827b8a0ed3d8a4cd626a53dc9877ff830f424080ffff33ffa0649db88b5346eb24ed5e660f32c001e3ded6b93338a06ba1aaa6b7d6ed1cfafaff830f424080ffff33ffa07ea3d266f53137f28f80af47cd28b80e9c96714e011daaa249ff51d7bdb506a6ff830f424080ffff33ffa0198fc3c055b4d69662425dcac158db6d6f8af62c1eadb00fbc3308abeda40392ff830f424080ffff33ffa0d8507c764f26cb308f35c855a5761aac28d57fde4688634dc798cf41ee22c460ff830f424080ffff33ffa0d2ea4a6caa7b049a5dea31bc55f033b00dad18710d975048949dd400bebe047cff830f424080ffff33ffa0c6a594659a6af63ee02cc22b7d149d651d4ecc401340865245713e0f851e2f52ff830f424080ffff33ffa016e97f7bd7af15e8f4bdf2f8e5a1290cb49e4f0df52fef600a95f994fed1960cff830f424080ffff33ffa0f658b7c55a5bbfb89647afe04733c3b654c426ed13e1329c470625dcc32e1d22ff830f424080ffff33ffa0b2d91befc621af450b938778d628ee74125cbc836a9b21fddf60890e261fe9e7ff830f424080ffff33ffa03fcc9f0ac143f21048391ba930391641fc7e7ecf49a96b5f067821261d7fc875ff830f424080ffff33ffa06901c08936e5d3899397427f3e2da6bcb0332e1e034ae5ec08ce9dea319f90bfff830f424080ffff33ffa024e9e3479ff037053e96be0891be3957f455a3239a143b8ffb46ce9674d19b6dff830f424080ffff33ffa094b51e222128e715e881115f32bbc56664fc6475292569ca76980628c33b16d3ff830f424080ffff33ffa0ccca72787228b80363fe782d6ca0e7b9c5dc58dc3dc6030e2365c26aaa1170f0ff830f424080ffff33ffa04ae2ee3b36cb862095292f12ffdf91eee3356f6bd5aa6a53e59f3f3dc4b89d40ff830f424080ffff33ffa0d022e71932c1b25b8f1bfda280db23db1c707d0e2b7be05755276bca7a84d535ff830f424080ffff33ffa0122e98fb13f6874c46ff56f317ea45776c2487741a6efa17549163c1697a30b0ff830f424080ffff33ffa0d5ad43d892b9fc1c3a623b3c4f4d78819e1ed52ece730f535ae536232750184fff830f424080ffff33ffa0553a5a091c73f93df732df10e1fcf42742b49b542264debafe9f81bf94f3088fff830f424080ffff33ffa0983cf3296cfeb7946577bb0a75f5c9f8c825311e8f1db1551344ff72b6d212e3ff830f424080ffff33ffa012faa57919dc324df3439ba7c60b215c3f0a748a8ac12da96fddb4be14e94cc7ff830f424080ffff33ffa0d0ebc027c12f6a66c654673821f0f9b7047ba85d9661084a91e67fc5edc66458ff830f424080ffff33ffa0753850e5e14c721ed345662255dace0c6aa4e6a3f55142d51431ef9f3792e0f5ff830f424080ffff33ffa0cf7077701a438ecc44bc4d46ac78698b46a08eee783dab279d3f75f835796b07ff850c805524b680ffff34ff82271080ffff3cffa0b88cab3086dfe7abdb46cb90ceea7b33fd4641fa350efe1a4e6e4995f7805b6b8080ff8080" + } + ] + }, + "spend_bundle_name": "0x6f5af47a80089719c282e04a7c9e996a3c26b0c60b0eb22bf63e210ea30f369d" + }, + "8560677a8abc992e894b51dda0523d95d94b9d170fe5ac76a5a55d62911b774f": { + "additions": [ + { + "amount": 1, + "parent_coin_info": "0x915d518f5e4d76a377276cc3bc5b5af5c3e4a2ca7c32de97fee0cc2d41416f44", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + }, + { + "amount": 999996, + "parent_coin_info": "0x915d518f5e4d76a377276cc3bc5b5af5c3e4a2ca7c32de97fee0cc2d41416f44", + "puzzle_hash": "0x9b672c41081e83a74b65b8383025dde1b5979c9fdf79d1bc4aefc4fb02225014" + }, + { + "amount": 1, + "parent_coin_info": "0x11bbab1df0596388deeb2f736c82498d81aff663b408bf3477cf7483c5bfe898", + "puzzle_hash": "0xc9e8b63237d6e465273f56b0af2d0d2f8b2161033b9c0a881e09ef5d822f78e6" + } + ], + "cost": 18391455, + "fee": 0, + "npc_result": { + "clvm_cost": 727455, + "error": null, + "npc_list": [ + { + "coin_name": "0x915d518f5e4d76a377276cc3bc5b5af5c3e4a2ca7c32de97fee0cc2d41416f44", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0xa226c6a350e413e42ee1e17bf8739240aa3a88e64174e1e12be2224467b1420d82af7ff7f8b66bcfade62a7c8930d4bc", + "0x3478100e3d81f03973c089ec38f8d0ce3bdad25793a465ca81a68eb175519e93" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9", + "0x01" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x9b672c41081e83a74b65b8383025dde1b5979c9fdf79d1bc4aefc4fb02225014", + "0x0f423c" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x4f4c723f00d54a03611c0c5277e4c7552a9288d654ea5afeadf2f2df487a70f7" + ] + } + ] + ], + [ + "0x3d", + [ + { + "opcode": "ASSERT_COIN_ANNOUNCEMENT", + "vars": [ + "0x8fd2f6aac188a95438caaa5e2c62fc3e7a6ef42e87099f01fe6f4cc2037dcdd4" + ] + } + ] + ] + ], + "puzzle_hash": "0x35db936eec58d6eec39911a496198082ef97e03e05cb6f4332670181a29f6c74" + }, + { + "coin_name": "0x11bbab1df0596388deeb2f736c82498d81aff663b408bf3477cf7483c5bfe898", + "conditions": [ + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0xc9e8b63237d6e465273f56b0af2d0d2f8b2161033b9c0a881e09ef5d822f78e6", + "0x01" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x793ed9d1befcce8fb5c05da87955543e9782bd7d447f502e095de884d05f7d0a" + ] + } + ] + ] + ], + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + } + ] + }, + "program": "0xff01ffffffa0d4251a50adf892ac75f2ad83f69a627ed5c87848f4a14aba2ccdcc3d7e93d520ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a226c6a350e413e42ee1e17bf8739240aa3a88e64174e1e12be2224467b1420d82af7ff7f8b66bcfade62a7c8930d4bcff018080ff830f423dffff80ffff01ffff33ffa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ff0180ffff33ffa09b672c41081e83a74b65b8383025dde1b5979c9fdf79d1bc4aefc4fb02225014ff830f423c80ffff3cffa04f4c723f00d54a03611c0c5277e4c7552a9288d654ea5afeadf2f2df487a70f780ffff3dffa08fd2f6aac188a95438caaa5e2c62fc3e7a6ef42e87099f01fe6f4cc2037dcdd48080ff808080ffffa0915d518f5e4d76a377276cc3bc5b5af5c3e4a2ca7c32de97fee0cc2d41416f44ffff02ffff01ff04ffff04ff04ffff04ff05ffff04ff0bff80808080ffff04ffff04ff0affff04ffff02ff0effff04ff02ffff04ffff04ff05ffff04ff0bffff04ff17ff80808080ff80808080ff808080ff808080ffff04ffff01ff33ff3cff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ff09ff80808080ffff02ff0effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ff01ffffa0c9e8b63237d6e465273f56b0af2d0d2f8b2161033b9c0a881e09ef5d822f78e6ff01ffffff70c07101032f2c9ba1b2315d413a92b5f034fa03282ccba1767fd9ae7b14d942b969ed5d578fcc4da892c9949073d07fff77fd5874ecd7513ce6907d7fee8fc6adacd0602ff027e32299ecb82ff658e5a8a3279613010000001668747470733a2f2f6575312e706f6f6c2e737061636500000040ffff7483093a80ffff68a0e4b884bfceac9672062f396f1e60881da4b4a814f535fac52dabfb0de0765cf78080808080", + "removals": [ + { + "amount": 999997, + "parent_coin_info": "0xd4251a50adf892ac75f2ad83f69a627ed5c87848f4a14aba2ccdcc3d7e93d520", + "puzzle_hash": "0x35db936eec58d6eec39911a496198082ef97e03e05cb6f4332670181a29f6c74" + }, + { + "amount": 1, + "parent_coin_info": "0x915d518f5e4d76a377276cc3bc5b5af5c3e4a2ca7c32de97fee0cc2d41416f44", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + } + ], + "spend_bundle": { + "aggregated_signature": "0xa5067181e9af3e238f3eabf46c734870c9aea4e0c5ffe43c05cbe86140ba809364e851528adf2edd82cea86941476d29070eca21213ef2d72d27e09fee364057d460c3b9ac9c6fb3a0a524647c294a6a58aa4af8c53e7674cbf693928aea5ffa", + "coin_spends": [ + { + "coin": { + "amount": 999997, + "parent_coin_info": "0xd4251a50adf892ac75f2ad83f69a627ed5c87848f4a14aba2ccdcc3d7e93d520", + "puzzle_hash": "0x35db936eec58d6eec39911a496198082ef97e03e05cb6f4332670181a29f6c74" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a226c6a350e413e42ee1e17bf8739240aa3a88e64174e1e12be2224467b1420d82af7ff7f8b66bcfade62a7c8930d4bcff018080", + "solution": "0xff80ffff01ffff33ffa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ff0180ffff33ffa09b672c41081e83a74b65b8383025dde1b5979c9fdf79d1bc4aefc4fb02225014ff830f423c80ffff3cffa04f4c723f00d54a03611c0c5277e4c7552a9288d654ea5afeadf2f2df487a70f780ffff3dffa08fd2f6aac188a95438caaa5e2c62fc3e7a6ef42e87099f01fe6f4cc2037dcdd48080ff8080" + }, + { + "coin": { + "amount": 1, + "parent_coin_info": "0x915d518f5e4d76a377276cc3bc5b5af5c3e4a2ca7c32de97fee0cc2d41416f44", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + }, + "puzzle_reveal": "0xff02ffff01ff04ffff04ff04ffff04ff05ffff04ff0bff80808080ffff04ffff04ff0affff04ffff02ff0effff04ff02ffff04ffff04ff05ffff04ff0bffff04ff17ff80808080ff80808080ff808080ff808080ffff04ffff01ff33ff3cff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ff09ff80808080ffff02ff0effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080", + "solution": "0xffa0c9e8b63237d6e465273f56b0af2d0d2f8b2161033b9c0a881e09ef5d822f78e6ff01ffffff70c07101032f2c9ba1b2315d413a92b5f034fa03282ccba1767fd9ae7b14d942b969ed5d578fcc4da892c9949073d07fff77fd5874ecd7513ce6907d7fee8fc6adacd0602ff027e32299ecb82ff658e5a8a3279613010000001668747470733a2f2f6575312e706f6f6c2e737061636500000040ffff7483093a80ffff68a0e4b884bfceac9672062f396f1e60881da4b4a814f535fac52dabfb0de0765cf78080" + } + ] + }, + "spend_bundle_name": "0x8560677a8abc992e894b51dda0523d95d94b9d170fe5ac76a5a55d62911b774f" + }, + "8d31334cf4b05ff4d48910ec76b2baa66b661a72e5df28fa0f596c4ad14ce74a": { + "additions": [ + { + "amount": 1455900000000, + "parent_coin_info": "0x99efb3f994c19cb2fcc2e88aa479f7ca7d94ae8ea256f7c2d3ddfea837f07543", + "puzzle_hash": "0x2c1224828b47b797faa4fe7fa6e369289b0bda0a82ed990254f8fd3c8326c940" + }, + { + "amount": 571203475630, + "parent_coin_info": "0x99efb3f994c19cb2fcc2e88aa479f7ca7d94ae8ea256f7c2d3ddfea837f07543", + "puzzle_hash": "0xe8a8909b1fc492365470c8f387905dbbdb76352ebe6ec55beda85209dc643451" + } + ], + "cost": 17187295, + "fee": 0, + "npc_result": { + "clvm_cost": 807295, + "error": null, + "npc_list": [ + { + "coin_name": "0x99efb3f994c19cb2fcc2e88aa479f7ca7d94ae8ea256f7c2d3ddfea837f07543", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0xaa2fc5490dd23e1c32adf72ef1baed9d90e7697c1a59fc257457c1cb10df85852019db74fae9f3a9dd6e03a1d8ad63b5", + "0xbcb6d18f8cb94f4443e45326c81359ad1edb958ed1db2da7291869b404a8d9e9" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x2c1224828b47b797faa4fe7fa6e369289b0bda0a82ed990254f8fd3c8326c940", + "0x0152fa66ff00" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xe8a8909b1fc492365470c8f387905dbbdb76352ebe6ec55beda85209dc643451", + "0x0084fe6158ae" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x641ea6459a3cd96e33ec016f2139d72cca5078e28fd7e274055ca603a14d9f4c" + ] + } + ] + ] + ], + "puzzle_hash": "0x5b8db1b733a12cae4b47234e172b128489222c303f6f65683b7f8db08e65425d" + }, + { + "coin_name": "0xca7e1590f5a9dbbef95ebd2df2897de75bf7dd68d8e37d9ba135d8bcabe0ea90", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0xa6703cc508ea0fc52a4c38df1b5784c4200bd28a23cddeb51d78e770025ffed2de645d35bcc233b4a596ea157abb94af", + "0x95a8860d6dfddebc8d5c2b3e735812979648cc334d3a9e832b438993c6afb1ec" + ] + } + ] + ], + [ + "0x3d", + [ + { + "opcode": "ASSERT_COIN_ANNOUNCEMENT", + "vars": [ + "0xba56235cae450589cc2f71d4a396d066c955085e2e1215d2855b27c1e67efe49" + ] + } + ] + ] + ], + "puzzle_hash": "0x1cd5a5c172599754a84556c345f076e59d5ab902da2b8d587d6d570308754a75" + } + ] + }, + "program": "0xff01ffffffa03ec26c84408f836daa9b05fcf7a9559a436bf7570d255cea77e33265905986b2ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0aa2fc5490dd23e1c32adf72ef1baed9d90e7697c1a59fc257457c1cb10df85852019db74fae9f3a9dd6e03a1d8ad63b5ff018080ff8600ea27140922ffff80ffff01ffff33ffa02c1224828b47b797faa4fe7fa6e369289b0bda0a82ed990254f8fd3c8326c940ff860152fa66ff0080ffff33ffa0e8a8909b1fc492365470c8f387905dbbdb76352ebe6ec55beda85209dc643451ff860084fe6158ae80ffff3cffa0641ea6459a3cd96e33ec016f2139d72cca5078e28fd7e274055ca603a14d9f4c8080ff808080ffffa0911628256b49e908093e3e1d39124ec12ea03dc9b8e0c4af0f27a6a82b2e7c60ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a6703cc508ea0fc52a4c38df1b5784c4200bd28a23cddeb51d78e770025ffed2de645d35bcc233b4a596ea157abb94afff018080ff8600edd1b44e8cffff80ffff01ffff3dffa0ba56235cae450589cc2f71d4a396d066c955085e2e1215d2855b27c1e67efe498080ff8080808080", + "removals": [ + { + "amount": 1005677971746, + "parent_coin_info": "0x3ec26c84408f836daa9b05fcf7a9559a436bf7570d255cea77e33265905986b2", + "puzzle_hash": "0x5b8db1b733a12cae4b47234e172b128489222c303f6f65683b7f8db08e65425d" + }, + { + "amount": 1021425503884, + "parent_coin_info": "0x911628256b49e908093e3e1d39124ec12ea03dc9b8e0c4af0f27a6a82b2e7c60", + "puzzle_hash": "0x1cd5a5c172599754a84556c345f076e59d5ab902da2b8d587d6d570308754a75" + } + ], + "spend_bundle": { + "aggregated_signature": "0x83b6e54882a0b184b3e72da35402d32dcb4c99ebfcc6859beb1c63c2a0b0efe2cfe583d5e33207873b0a3dc780084fb40150cb4b461dbec78f7d3b6c04c3bbf5f1a87663359d16415ebc0d98d51cd16d0d565251d21ed522a2819260d6345f6d", + "coin_spends": [ + { + "coin": { + "amount": 1005677971746, + "parent_coin_info": "0x3ec26c84408f836daa9b05fcf7a9559a436bf7570d255cea77e33265905986b2", + "puzzle_hash": "0x5b8db1b733a12cae4b47234e172b128489222c303f6f65683b7f8db08e65425d" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0aa2fc5490dd23e1c32adf72ef1baed9d90e7697c1a59fc257457c1cb10df85852019db74fae9f3a9dd6e03a1d8ad63b5ff018080", + "solution": "0xff80ffff01ffff33ffa02c1224828b47b797faa4fe7fa6e369289b0bda0a82ed990254f8fd3c8326c940ff860152fa66ff0080ffff33ffa0e8a8909b1fc492365470c8f387905dbbdb76352ebe6ec55beda85209dc643451ff860084fe6158ae80ffff3cffa0641ea6459a3cd96e33ec016f2139d72cca5078e28fd7e274055ca603a14d9f4c8080ff8080" + }, + { + "coin": { + "amount": 1021425503884, + "parent_coin_info": "0x911628256b49e908093e3e1d39124ec12ea03dc9b8e0c4af0f27a6a82b2e7c60", + "puzzle_hash": "0x1cd5a5c172599754a84556c345f076e59d5ab902da2b8d587d6d570308754a75" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a6703cc508ea0fc52a4c38df1b5784c4200bd28a23cddeb51d78e770025ffed2de645d35bcc233b4a596ea157abb94afff018080", + "solution": "0xff80ffff01ffff3dffa0ba56235cae450589cc2f71d4a396d066c955085e2e1215d2855b27c1e67efe498080ff8080" + } + ] + }, + "spend_bundle_name": "0x8d31334cf4b05ff4d48910ec76b2baa66b661a72e5df28fa0f596c4ad14ce74a" + }, + "ac200010ef83f11f02f211243badc5383f0cda313cc80faa705ed00ce003ae2e": { + "additions": [ + { + "amount": 1800000000000, + "parent_coin_info": "0x4fec508b789d40be9fb8c3a6f079b779d6fd1ac2e8cacb20c6eaa5d02913c408", + "puzzle_hash": "0x74b929439a677c5d23e9a1e3073fb6ec389184d8317e644439b7354ee02eccd5" + } + ], + "cost": 8624562, + "fee": 0, + "npc_result": { + "clvm_cost": 404562, + "error": null, + "npc_list": [ + { + "coin_name": "0x4fec508b789d40be9fb8c3a6f079b779d6fd1ac2e8cacb20c6eaa5d02913c408", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0xb1cc645ebd31fff823134bbfd3aadcf334ee36230a29d4977208d6699707a8fadc2eee7293e07bf0d07fdb8309ab022e", + "0xad4ea5f4b7e0b2cb3824bb160e1d8596fd1dd3e369fce284d16f532b2cc68eb9" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x74b929439a677c5d23e9a1e3073fb6ec389184d8317e644439b7354ee02eccd5", + "0x01a3185c5000" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x1283c5a295a2856bb4a72770ed33227c32b14c7a305a038f48cd504f59c50810" + ] + } + ] + ] + ], + "puzzle_hash": "0x36a1b66d7960cd23b140bd5631bd16d96e5094f299256de84beb9f57a63ceb24" + } + ] + }, + "program": "0xff01ffffffa03a7c98f4a66093f1d855a2e61e1fdecd6a0e099b0e62c106d0892d5d0fa10aa4ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b1cc645ebd31fff823134bbfd3aadcf334ee36230a29d4977208d6699707a8fadc2eee7293e07bf0d07fdb8309ab022eff018080ff8601a3185c5000ffff80ffff01ffff33ffa074b929439a677c5d23e9a1e3073fb6ec389184d8317e644439b7354ee02eccd5ff8601a3185c500080ffff3cffa01283c5a295a2856bb4a72770ed33227c32b14c7a305a038f48cd504f59c508108080ff8080808080", + "removals": [ + { + "amount": 1800000000000, + "parent_coin_info": "0x3a7c98f4a66093f1d855a2e61e1fdecd6a0e099b0e62c106d0892d5d0fa10aa4", + "puzzle_hash": "0x36a1b66d7960cd23b140bd5631bd16d96e5094f299256de84beb9f57a63ceb24" + } + ], + "spend_bundle": { + "aggregated_signature": "0xa7a17a33e33090afb89f28297d9df2429d3e00346503ea7988461df36beaedc03985df485bdf3f06a246a2435424cccc104a40924d6bbeaf1a84e358757dbca91aa43e3d19e80c69d74f462ccf10f34bb675d2f9977c0f8aa81867cdbaaf2564", + "coin_spends": [ + { + "coin": { + "amount": 1800000000000, + "parent_coin_info": "0x3a7c98f4a66093f1d855a2e61e1fdecd6a0e099b0e62c106d0892d5d0fa10aa4", + "puzzle_hash": "0x36a1b66d7960cd23b140bd5631bd16d96e5094f299256de84beb9f57a63ceb24" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b1cc645ebd31fff823134bbfd3aadcf334ee36230a29d4977208d6699707a8fadc2eee7293e07bf0d07fdb8309ab022eff018080", + "solution": "0xff80ffff01ffff33ffa074b929439a677c5d23e9a1e3073fb6ec389184d8317e644439b7354ee02eccd5ff8601a3185c500080ffff3cffa01283c5a295a2856bb4a72770ed33227c32b14c7a305a038f48cd504f59c508108080ff8080" + } + ] + }, + "spend_bundle_name": "0xac200010ef83f11f02f211243badc5383f0cda313cc80faa705ed00ce003ae2e" + }, + "b6dcb7048c12bc5a92f3a5ae61901b600c7fec62b84d59e690a463912032cce9": { + "additions": [ + { + "amount": 1, + "parent_coin_info": "0x115650dcdd7a3a48c423fb0c90ac44d1cb658dc31fa55fe73071d45d42e1c1b3", + "puzzle_hash": "0x47d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3" + }, + { + "amount": 1736, + "parent_coin_info": "0x115650dcdd7a3a48c423fb0c90ac44d1cb658dc31fa55fe73071d45d42e1c1b3", + "puzzle_hash": "0xca9ed8e40dec9149e2fd363b1ad1db137b0c32b6a83553a69624040d17d76942" + } + ], + "cost": 10820854, + "fee": 0, + "npc_result": { + "clvm_cost": 416854, + "error": null, + "npc_list": [ + { + "coin_name": "0x115650dcdd7a3a48c423fb0c90ac44d1cb658dc31fa55fe73071d45d42e1c1b3", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0xb80fff7c9d7d6bb06b7ae0ebbb89862ed8431755090c76678fd97219a7280e35f5db0e4421e8bc74db452b72fe65c3de", + "0xe5aa77841c0cb50e770b24fb2917de11b1a5cee02083dcdaa9173adb94ed18d4" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x47d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3", + "0x01" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xca9ed8e40dec9149e2fd363b1ad1db137b0c32b6a83553a69624040d17d76942", + "0x06c8" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x75b309d892d01c2c04883605b586b7d3a36f5366417754b61e386876961f89bf" + ] + } + ] + ] + ], + "puzzle_hash": "0x156d939b9787f8f8a88b58367722359c9636846ffd107596e7d71b1f6590bf94" + } + ] + }, + "program": "0xff01ffffffa0d81fcc0db93729770cc483e3c867d356210e61d2e2a872ce0711cd432a3b6ae9ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b80fff7c9d7d6bb06b7ae0ebbb89862ed8431755090c76678fd97219a7280e35f5db0e4421e8bc74db452b72fe65c3deff018080ff8206c9ffff80ffff01ffff33ffa047d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3ff0180ffff33ffa0ca9ed8e40dec9149e2fd363b1ad1db137b0c32b6a83553a69624040d17d76942ff8206c880ffff3cffa075b309d892d01c2c04883605b586b7d3a36f5366417754b61e386876961f89bf8080ff8080808080", + "removals": [ + { + "amount": 1737, + "parent_coin_info": "0xd81fcc0db93729770cc483e3c867d356210e61d2e2a872ce0711cd432a3b6ae9", + "puzzle_hash": "0x156d939b9787f8f8a88b58367722359c9636846ffd107596e7d71b1f6590bf94" + } + ], + "spend_bundle": { + "aggregated_signature": "0x958328e555e136c2092f1734fd979d98747172f3bbde99f234718a05104183584a4aef0d569ccf7d2be7d891ca032dff02cb6f0f459553b143fb568295a3f627e21593d84cede392fb0816e3e7e105948d02e29a9baa8bc1868c7d1edc08cce2", + "coin_spends": [ + { + "coin": { + "amount": 1737, + "parent_coin_info": "0xd81fcc0db93729770cc483e3c867d356210e61d2e2a872ce0711cd432a3b6ae9", + "puzzle_hash": "0x156d939b9787f8f8a88b58367722359c9636846ffd107596e7d71b1f6590bf94" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b80fff7c9d7d6bb06b7ae0ebbb89862ed8431755090c76678fd97219a7280e35f5db0e4421e8bc74db452b72fe65c3deff018080", + "solution": "0xff80ffff01ffff33ffa047d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3ff0180ffff33ffa0ca9ed8e40dec9149e2fd363b1ad1db137b0c32b6a83553a69624040d17d76942ff8206c880ffff3cffa075b309d892d01c2c04883605b586b7d3a36f5366417754b61e386876961f89bf8080ff8080" + } + ] + }, + "spend_bundle_name": "0xb6dcb7048c12bc5a92f3a5ae61901b600c7fec62b84d59e690a463912032cce9" + }, + "b8f06500a98b2c750363a3b2d52b340df5a450ac6eb2ed0047c58aebdd986e8a": { + "additions": [ + { + "amount": 1, + "parent_coin_info": "0x278a153f1be0e9c2be48e2761513d8765b36ce4f1926ec6deb3dbd378b5af3b4", + "puzzle_hash": "0x47d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3" + }, + { + "amount": 9195, + "parent_coin_info": "0x278a153f1be0e9c2be48e2761513d8765b36ce4f1926ec6deb3dbd378b5af3b4", + "puzzle_hash": "0xe9164ddc5ed10d1b304792bb1e37f3c33c649d0b2bd8c399c140b3d78a2eb087" + } + ], + "cost": 10820854, + "fee": 0, + "npc_result": { + "clvm_cost": 416854, + "error": null, + "npc_list": [ + { + "coin_name": "0x278a153f1be0e9c2be48e2761513d8765b36ce4f1926ec6deb3dbd378b5af3b4", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0x8c4fad159162fb309e2748eb6ff36dc6884461696c1fb9365325bc03737e33e95cd4ea30b691e6835bbffcc74f1c415f", + "0xbfb3521869cb771b9c3f6191c6d1bed84f70d49f1de7a9cfac994782f543c132" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x47d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3", + "0x01" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xe9164ddc5ed10d1b304792bb1e37f3c33c649d0b2bd8c399c140b3d78a2eb087", + "0x23eb" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0xf51135b98e568682e2e3f7cedf2ddf10006467944feaf95c76f8bb1d08f6c622" + ] + } + ] + ] + ], + "puzzle_hash": "0x494d58f22c3b1d145c6b7caf45222866042ddbe6a39a4b21a2d059178740304d" + } + ] + }, + "program": "0xff01ffffffa00424e5e7d85d3f2c0ebdc66530dd5542581a3c052e9b39413296c79fa2afec4cffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b08c4fad159162fb309e2748eb6ff36dc6884461696c1fb9365325bc03737e33e95cd4ea30b691e6835bbffcc74f1c415fff018080ff8223ecffff80ffff01ffff33ffa047d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3ff0180ffff33ffa0e9164ddc5ed10d1b304792bb1e37f3c33c649d0b2bd8c399c140b3d78a2eb087ff8223eb80ffff3cffa0f51135b98e568682e2e3f7cedf2ddf10006467944feaf95c76f8bb1d08f6c6228080ff8080808080", + "removals": [ + { + "amount": 9196, + "parent_coin_info": "0x0424e5e7d85d3f2c0ebdc66530dd5542581a3c052e9b39413296c79fa2afec4c", + "puzzle_hash": "0x494d58f22c3b1d145c6b7caf45222866042ddbe6a39a4b21a2d059178740304d" + } + ], + "spend_bundle": { + "aggregated_signature": "0x8977fb57e7bd92fdb0b1fe87363dcbc81f77a084f3676788ce69d1815e798b9b02ada03dfdac0a19d136254146a3091e1588d425298454494695a6741098a320eefb2e4be3f0bd5cb80bab26a3c9014e10ada44192e2e3f1963f76415403fa1f", + "coin_spends": [ + { + "coin": { + "amount": 9196, + "parent_coin_info": "0x0424e5e7d85d3f2c0ebdc66530dd5542581a3c052e9b39413296c79fa2afec4c", + "puzzle_hash": "0x494d58f22c3b1d145c6b7caf45222866042ddbe6a39a4b21a2d059178740304d" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b08c4fad159162fb309e2748eb6ff36dc6884461696c1fb9365325bc03737e33e95cd4ea30b691e6835bbffcc74f1c415fff018080", + "solution": "0xff80ffff01ffff33ffa047d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3ff0180ffff33ffa0e9164ddc5ed10d1b304792bb1e37f3c33c649d0b2bd8c399c140b3d78a2eb087ff8223eb80ffff3cffa0f51135b98e568682e2e3f7cedf2ddf10006467944feaf95c76f8bb1d08f6c6228080ff8080" + } + ] + }, + "spend_bundle_name": "0xb8f06500a98b2c750363a3b2d52b340df5a450ac6eb2ed0047c58aebdd986e8a" + }, + "be418a9ef278d0f0b9a84c18b0bef8262c34a16ac6330047c9c4f5a26235ce19": { + "additions": [ + { + "amount": 55495487153, + "parent_coin_info": "0x8a5cae8abab0faa259928f28dc2163bbf3141d5421d4c8b72dca64822c5ef91c", + "puzzle_hash": "0xeb5df45da6f101ec665763efbbb5ee796c23c2fc6fd784d1028d3200e99d8087" + }, + { + "amount": 66474206713, + "parent_coin_info": "0x8a5cae8abab0faa259928f28dc2163bbf3141d5421d4c8b72dca64822c5ef91c", + "puzzle_hash": "0x287e63e8483c89f0bde4f37b3b3131127bbd4b07df4db5f1a6daf07d2253f636" + } + ], + "cost": 10952868, + "fee": 0, + "npc_result": { + "clvm_cost": 416868, + "error": null, + "npc_list": [ + { + "coin_name": "0x8a5cae8abab0faa259928f28dc2163bbf3141d5421d4c8b72dca64822c5ef91c", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0xb2f5b0668b20ad43943ebe768f3ec89c606fdc771e85a16f24a6808038c08555d5f57c817dffaaf6f84394f9b8f2a75a", + "0x23cc9d1ba072d7455cebe2bb5c7198db09e1dab88e6b1ff1eb78be3adde03167" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0xeb5df45da6f101ec665763efbbb5ee796c23c2fc6fd784d1028d3200e99d8087", + "0x0cebc9eeb1" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x287e63e8483c89f0bde4f37b3b3131127bbd4b07df4db5f1a6daf07d2253f636", + "0x0f7a2be5f9" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0xe1587240fcf2d0b8bd0feccc7b704d9f51516131a7b417f60e563850faa3555f" + ] + } + ] + ] + ], + "puzzle_hash": "0xfeb86f14a9da1c636d93d0518eeba66fd23fd2a41a1d693531726fa907d91ee4" + } + ] + }, + "program": "0xff01ffffffa09f7c7b74b0ce977eb9f871f11307b1ba06a418c62a1eb77d07a913d4f4f229d0ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b2f5b0668b20ad43943ebe768f3ec89c606fdc771e85a16f24a6808038c08555d5f57c817dffaaf6f84394f9b8f2a75aff018080ff851c65f5d4aaffff80ffff01ffff33ffa0eb5df45da6f101ec665763efbbb5ee796c23c2fc6fd784d1028d3200e99d8087ff850cebc9eeb180ffff33ffa0287e63e8483c89f0bde4f37b3b3131127bbd4b07df4db5f1a6daf07d2253f636ff850f7a2be5f980ffff3cffa0e1587240fcf2d0b8bd0feccc7b704d9f51516131a7b417f60e563850faa3555f8080ff8080808080", + "removals": [ + { + "amount": 121969693866, + "parent_coin_info": "0x9f7c7b74b0ce977eb9f871f11307b1ba06a418c62a1eb77d07a913d4f4f229d0", + "puzzle_hash": "0xfeb86f14a9da1c636d93d0518eeba66fd23fd2a41a1d693531726fa907d91ee4" + } + ], + "spend_bundle": { + "aggregated_signature": "0xa57a160c1b98853ef064ccc47d24ac02ccdaac17c7d204d86f9257e570559ddf4b0df3002a2ccd20da1175436654d0490533270ee8eb10a2d276e734c1ec1b4f6fff93d27521efaa31ce5486e8306d1acb7cd38564671a0eccd3f0f18b03921c", + "coin_spends": [ + { + "coin": { + "amount": 121969693866, + "parent_coin_info": "0x9f7c7b74b0ce977eb9f871f11307b1ba06a418c62a1eb77d07a913d4f4f229d0", + "puzzle_hash": "0xfeb86f14a9da1c636d93d0518eeba66fd23fd2a41a1d693531726fa907d91ee4" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b2f5b0668b20ad43943ebe768f3ec89c606fdc771e85a16f24a6808038c08555d5f57c817dffaaf6f84394f9b8f2a75aff018080", + "solution": "0xff80ffff01ffff33ffa0eb5df45da6f101ec665763efbbb5ee796c23c2fc6fd784d1028d3200e99d8087ff850cebc9eeb180ffff33ffa0287e63e8483c89f0bde4f37b3b3131127bbd4b07df4db5f1a6daf07d2253f636ff850f7a2be5f980ffff3cffa0e1587240fcf2d0b8bd0feccc7b704d9f51516131a7b417f60e563850faa3555f8080ff8080" + } + ] + }, + "spend_bundle_name": "0xbe418a9ef278d0f0b9a84c18b0bef8262c34a16ac6330047c9c4f5a26235ce19" + }, + "c726fe3d8d7a75dc77a8409f9dd44b7edc6cda9f56db286b783a641c843bf96a": { + "additions": [ + { + "amount": 1, + "parent_coin_info": "0xa1d4da992e1a1d50366c03706d15abc65a1db8dbd39446d3649d095ab36af3c4", + "puzzle_hash": "0x47d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3" + }, + { + "amount": 1489, + "parent_coin_info": "0xa1d4da992e1a1d50366c03706d15abc65a1db8dbd39446d3649d095ab36af3c4", + "puzzle_hash": "0xfb9f2bd5fac5350fba3e4d73dbb884cf9c0f3f3283941a12ce8e623c4875cef7" + } + ], + "cost": 10820854, + "fee": 0, + "npc_result": { + "clvm_cost": 416854, + "error": null, + "npc_list": [ + { + "coin_name": "0xa1d4da992e1a1d50366c03706d15abc65a1db8dbd39446d3649d095ab36af3c4", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0x9876862e861577e170c846d41c557100907a78e5b965c46000f7b1da099ae64a4948f362833d901831ffb51e82f39a59", + "0xd7b57ab3e21475a87c6cc9afa7198740a38afd38cf8fa4c5f9e0b325dc74e32a" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x47d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3", + "0x01" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xfb9f2bd5fac5350fba3e4d73dbb884cf9c0f3f3283941a12ce8e623c4875cef7", + "0x05d1" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x272b610f78768b42a46aa87ffb887bb4a0ebca8f90c3d194a906b058f192f1f7" + ] + } + ] + ] + ], + "puzzle_hash": "0xfdf2fd820a53c107160ace1e4d1afcdc2cf6f52b4b9c76f34f194f492e5c523d" + } + ] + }, + "program": "0xff01ffffffa041df914338b643dc14cdc16f5a6007977d4b43c03f353fbc7885588d77ee7e34ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b09876862e861577e170c846d41c557100907a78e5b965c46000f7b1da099ae64a4948f362833d901831ffb51e82f39a59ff018080ff8205d2ffff80ffff01ffff33ffa047d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3ff0180ffff33ffa0fb9f2bd5fac5350fba3e4d73dbb884cf9c0f3f3283941a12ce8e623c4875cef7ff8205d180ffff3cffa0272b610f78768b42a46aa87ffb887bb4a0ebca8f90c3d194a906b058f192f1f78080ff8080808080", + "removals": [ + { + "amount": 1490, + "parent_coin_info": "0x41df914338b643dc14cdc16f5a6007977d4b43c03f353fbc7885588d77ee7e34", + "puzzle_hash": "0xfdf2fd820a53c107160ace1e4d1afcdc2cf6f52b4b9c76f34f194f492e5c523d" + } + ], + "spend_bundle": { + "aggregated_signature": "0xa76d88a08f5ba94874702159315191e5b27185f700d758bc1e784ab01f83343a559d819c5df6bcca31b2609fedeea15f129164d19cfe723bfeea967b6be723589d7c2605cb0ef6215ac1ef4ab0eff8a1c5a503e6384cc090c31b7a2afc68c8ee", + "coin_spends": [ + { + "coin": { + "amount": 1490, + "parent_coin_info": "0x41df914338b643dc14cdc16f5a6007977d4b43c03f353fbc7885588d77ee7e34", + "puzzle_hash": "0xfdf2fd820a53c107160ace1e4d1afcdc2cf6f52b4b9c76f34f194f492e5c523d" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b09876862e861577e170c846d41c557100907a78e5b965c46000f7b1da099ae64a4948f362833d901831ffb51e82f39a59ff018080", + "solution": "0xff80ffff01ffff33ffa047d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3ff0180ffff33ffa0fb9f2bd5fac5350fba3e4d73dbb884cf9c0f3f3283941a12ce8e623c4875cef7ff8205d180ffff3cffa0272b610f78768b42a46aa87ffb887bb4a0ebca8f90c3d194a906b058f192f1f78080ff8080" + } + ] + }, + "spend_bundle_name": "0xc726fe3d8d7a75dc77a8409f9dd44b7edc6cda9f56db286b783a641c843bf96a" + }, + "d0e4d399d0998fef9f5038894a4848e621de60ec3b945837d8e0fb8812ef7532": { + "additions": [ + { + "amount": 100, + "parent_coin_info": "0xda8b99ace20195156d461734f5225a43c305aa745a77dff74db0f33f8550c2e6", + "puzzle_hash": "0x7b87b196b2b5627de794af43575ddc09d2e63b80ec43bdf0c9cf6229d77d4bd0" + }, + { + "amount": 401700, + "parent_coin_info": "0xda8b99ace20195156d461734f5225a43c305aa745a77dff74db0f33f8550c2e6", + "puzzle_hash": "0x3671f04491107e482009b8bd821b7d1ecd8fb25116fd8c9cf090bc083046923d" + } + ], + "cost": 10844856, + "fee": 0, + "npc_result": { + "clvm_cost": 416856, + "error": null, + "npc_list": [ + { + "coin_name": "0xda8b99ace20195156d461734f5225a43c305aa745a77dff74db0f33f8550c2e6", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0x843208fe2b964c413be163920c6ff15bb6444964d2bb5b6f5788d289b46966662282aef2da077e620133c77861af5120", + "0x09b5ca4a15728a19fc78ea6b1b59ac6f17d89024ee04b5b3bb554adeefe368c3" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x7b87b196b2b5627de794af43575ddc09d2e63b80ec43bdf0c9cf6229d77d4bd0", + "0x64" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x3671f04491107e482009b8bd821b7d1ecd8fb25116fd8c9cf090bc083046923d", + "0x062124" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x8ab6477ec148c26491993d964533ab2f7895bcaf04c3afc7020aa3e635ee70d8" + ] + } + ] + ] + ], + "puzzle_hash": "0x92a5a30f1963ab87e4fa99c851ecccefc79734ad545c1340f3373824f25de4a9" + } + ] + }, + "program": "0xff01ffffffa0a0646d662d822dd701472dae5d0d9aba5ac98b4d7923192ff2db0099af4119e0ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0843208fe2b964c413be163920c6ff15bb6444964d2bb5b6f5788d289b46966662282aef2da077e620133c77861af5120ff018080ff83062188ffff80ffff01ffff33ffa07b87b196b2b5627de794af43575ddc09d2e63b80ec43bdf0c9cf6229d77d4bd0ff6480ffff33ffa03671f04491107e482009b8bd821b7d1ecd8fb25116fd8c9cf090bc083046923dff8306212480ffff3cffa08ab6477ec148c26491993d964533ab2f7895bcaf04c3afc7020aa3e635ee70d88080ff8080808080", + "removals": [ + { + "amount": 401800, + "parent_coin_info": "0xa0646d662d822dd701472dae5d0d9aba5ac98b4d7923192ff2db0099af4119e0", + "puzzle_hash": "0x92a5a30f1963ab87e4fa99c851ecccefc79734ad545c1340f3373824f25de4a9" + } + ], + "spend_bundle": { + "aggregated_signature": "0x93fd0217f8169a5378c652afba549909c41a332b525c628a677f48ff94aeca04e1911154a2432d57c613116b07064d530fc4477f9e02b80c72fb6336f982d86e9ed3625bafdcd9b9d09ec229ca2c39e5f52364b7657e4f6d58e48055cd375909", + "coin_spends": [ + { + "coin": { + "amount": 401800, + "parent_coin_info": "0xa0646d662d822dd701472dae5d0d9aba5ac98b4d7923192ff2db0099af4119e0", + "puzzle_hash": "0x92a5a30f1963ab87e4fa99c851ecccefc79734ad545c1340f3373824f25de4a9" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0843208fe2b964c413be163920c6ff15bb6444964d2bb5b6f5788d289b46966662282aef2da077e620133c77861af5120ff018080", + "solution": "0xff80ffff01ffff33ffa07b87b196b2b5627de794af43575ddc09d2e63b80ec43bdf0c9cf6229d77d4bd0ff6480ffff33ffa03671f04491107e482009b8bd821b7d1ecd8fb25116fd8c9cf090bc083046923dff8306212480ffff3cffa08ab6477ec148c26491993d964533ab2f7895bcaf04c3afc7020aa3e635ee70d88080ff8080" + } + ] + }, + "spend_bundle_name": "0xd0e4d399d0998fef9f5038894a4848e621de60ec3b945837d8e0fb8812ef7532" + }, + "d1d1c70f9270f66ece4f6cfc055c1304f282f0139b7c55abd7bf06657aed986a": { + "additions": [ + { + "amount": 67171320652, + "parent_coin_info": "0x761b2b014c3a984cc28a824d0912609cc0012f32f18405d395a936e28e307f62", + "puzzle_hash": "0x81ad1e46c1ac753596e2169e802945c7da10f23888f1a6d98f5472d640b23266" + }, + { + "amount": 54793309616, + "parent_coin_info": "0x761b2b014c3a984cc28a824d0912609cc0012f32f18405d395a936e28e307f62", + "puzzle_hash": "0x1607104192d2bb879f00a65db5fd163539a4c674c5df4330099365ac8d2807a3" + } + ], + "cost": 10952868, + "fee": 0, + "npc_result": { + "clvm_cost": 416868, + "error": null, + "npc_list": [ + { + "coin_name": "0x761b2b014c3a984cc28a824d0912609cc0012f32f18405d395a936e28e307f62", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0x9490c8f5a4bc063bb74f4aa89831738a138644f67e9a03bd49e82f7adfc03e707d5df4e44121b7d570e2fe9fd51710ce", + "0x61de6dd74a74efa43743cd4e26ce4ac75fdda1b832848c13e1d8b972f93ec7d6" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x81ad1e46c1ac753596e2169e802945c7da10f23888f1a6d98f5472d640b23266", + "0x0fa3b9034c" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x1607104192d2bb879f00a65db5fd163539a4c674c5df4330099365ac8d2807a3", + "0x0cc1ef8db0" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0xbd6f1b433c23efdeb4c70a77072be4cb889ee18990b255dd558643b4d6302447" + ] + } + ] + ] + ], + "puzzle_hash": "0x1a02f44d09d4e6cba0af0cc3e6f8e080c36638fc8971d607f1e1afad8a5355a7" + } + ] + }, + "program": "0xff01ffffffa0e4e3b0305f6bcd6ca0061e3fdc0eefc8bdb252b5105fc667b3d0f573d69cf94bffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b09490c8f5a4bc063bb74f4aa89831738a138644f67e9a03bd49e82f7adfc03e707d5df4e44121b7d570e2fe9fd51710ceff018080ff851c65a890fcffff80ffff01ffff33ffa081ad1e46c1ac753596e2169e802945c7da10f23888f1a6d98f5472d640b23266ff850fa3b9034c80ffff33ffa01607104192d2bb879f00a65db5fd163539a4c674c5df4330099365ac8d2807a3ff850cc1ef8db080ffff3cffa0bd6f1b433c23efdeb4c70a77072be4cb889ee18990b255dd558643b4d63024478080ff8080808080", + "removals": [ + { + "amount": 121964630268, + "parent_coin_info": "0xe4e3b0305f6bcd6ca0061e3fdc0eefc8bdb252b5105fc667b3d0f573d69cf94b", + "puzzle_hash": "0x1a02f44d09d4e6cba0af0cc3e6f8e080c36638fc8971d607f1e1afad8a5355a7" + } + ], + "spend_bundle": { + "aggregated_signature": "0xb22d7ea09ec282c7c7580b8d868655a598f1eb0a9a6308245b2d4f6964393ed0ec95c93f90dec72c7d7ff4de2117f610113916f5f9fa641d98fccac9c5beb020fdfbc673c5c5d9e44fba5f8f2ff2dc083a9edfb7a2c13a844e5fc10d5bedb1c0", + "coin_spends": [ + { + "coin": { + "amount": 121964630268, + "parent_coin_info": "0xe4e3b0305f6bcd6ca0061e3fdc0eefc8bdb252b5105fc667b3d0f573d69cf94b", + "puzzle_hash": "0x1a02f44d09d4e6cba0af0cc3e6f8e080c36638fc8971d607f1e1afad8a5355a7" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b09490c8f5a4bc063bb74f4aa89831738a138644f67e9a03bd49e82f7adfc03e707d5df4e44121b7d570e2fe9fd51710ceff018080", + "solution": "0xff80ffff01ffff33ffa081ad1e46c1ac753596e2169e802945c7da10f23888f1a6d98f5472d640b23266ff850fa3b9034c80ffff33ffa01607104192d2bb879f00a65db5fd163539a4c674c5df4330099365ac8d2807a3ff850cc1ef8db080ffff3cffa0bd6f1b433c23efdeb4c70a77072be4cb889ee18990b255dd558643b4d63024478080ff8080" + } + ] + }, + "spend_bundle_name": "0xd1d1c70f9270f66ece4f6cfc055c1304f282f0139b7c55abd7bf06657aed986a" + }, + "d44d1019cbeca9200ae1b425b5ae7832e141862d591e351cce0f16b5e715eada": { + "additions": [ + { + "amount": 1, + "parent_coin_info": "0x5a73e7388dd1abda142833f0d78d59f67aa7fb648b0161cdc61b56b3b00f3e3d", + "puzzle_hash": "0x47d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3" + }, + { + "amount": 99161, + "parent_coin_info": "0x5a73e7388dd1abda142833f0d78d59f67aa7fb648b0161cdc61b56b3b00f3e3d", + "puzzle_hash": "0xa674a066e0dde4b5b3e16038b6faa4c105cd398792bf38937073bbbb8d7c5346" + } + ], + "cost": 10844856, + "fee": 0, + "npc_result": { + "clvm_cost": 416856, + "error": null, + "npc_list": [ + { + "coin_name": "0x5a73e7388dd1abda142833f0d78d59f67aa7fb648b0161cdc61b56b3b00f3e3d", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0x8558e33cb0554833dcc0bafb2cd337b816864aade2ce22606c5b6fea4831ea9286827c20148538a794c8214c6a70f2e3", + "0x02e3b65dcbe086d15b7230d0b0f0d356a15ad5782d43d38a85b55742195d5a8e" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x47d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3", + "0x01" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xa674a066e0dde4b5b3e16038b6faa4c105cd398792bf38937073bbbb8d7c5346", + "0x018359" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x19bab841189d2975067dbc4756f4c4711b2825536f7aefc8186483ab4724ba2d" + ] + } + ] + ] + ], + "puzzle_hash": "0x392c8c0cab8a54641ecf9d74ac30cd851a3abc28a63e8c97baaec82263b990bd" + } + ] + }, + "program": "0xff01ffffffa02518a810161ec0e03808518b61fc031ddb048757709083260f04b55dd6d52494ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b08558e33cb0554833dcc0bafb2cd337b816864aade2ce22606c5b6fea4831ea9286827c20148538a794c8214c6a70f2e3ff018080ff8301835affff80ffff01ffff33ffa047d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3ff0180ffff33ffa0a674a066e0dde4b5b3e16038b6faa4c105cd398792bf38937073bbbb8d7c5346ff8301835980ffff3cffa019bab841189d2975067dbc4756f4c4711b2825536f7aefc8186483ab4724ba2d8080ff8080808080", + "removals": [ + { + "amount": 99162, + "parent_coin_info": "0x2518a810161ec0e03808518b61fc031ddb048757709083260f04b55dd6d52494", + "puzzle_hash": "0x392c8c0cab8a54641ecf9d74ac30cd851a3abc28a63e8c97baaec82263b990bd" + } + ], + "spend_bundle": { + "aggregated_signature": "0xa79fb8a4072aaf0b5df836dd680a29fcfc7cc14fb056c157d9dc8eb328f60207967916a33d61e2a2c0941eac616fab590f89d43e26f920380680f975682ae01978cabac277ae9d6522175e25038ac227d11ab09efcc79e1ebeedcdebf887022c", + "coin_spends": [ + { + "coin": { + "amount": 99162, + "parent_coin_info": "0x2518a810161ec0e03808518b61fc031ddb048757709083260f04b55dd6d52494", + "puzzle_hash": "0x392c8c0cab8a54641ecf9d74ac30cd851a3abc28a63e8c97baaec82263b990bd" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b08558e33cb0554833dcc0bafb2cd337b816864aade2ce22606c5b6fea4831ea9286827c20148538a794c8214c6a70f2e3ff018080", + "solution": "0xff80ffff01ffff33ffa047d0276ccf4d2ca4393a5502ea341db8683f4093df59097cd7735c7f78b47ee3ff0180ffff33ffa0a674a066e0dde4b5b3e16038b6faa4c105cd398792bf38937073bbbb8d7c5346ff8301835980ffff3cffa019bab841189d2975067dbc4756f4c4711b2825536f7aefc8186483ab4724ba2d8080ff8080" + } + ] + }, + "spend_bundle_name": "0xd44d1019cbeca9200ae1b425b5ae7832e141862d591e351cce0f16b5e715eada" + }, + "dad9ce9ef2d0c37f94bb8aa0eba5538ec2bca8c99ad1457145cfe3eb060c1467": { + "additions": [ + { + "amount": 300, + "parent_coin_info": "0x6bafb89ced310e8c20956e0a53c624aefe565c4e798da5be72084ec02d746385", + "puzzle_hash": "0x17762cee2effd77874170e89f739eb5365b7585bbbe0c1688162b15e58fe919c" + }, + { + "amount": 1174800, + "parent_coin_info": "0x6bafb89ced310e8c20956e0a53c624aefe565c4e798da5be72084ec02d746385", + "puzzle_hash": "0x93977e2418cb773f823ed1f6b382972db6c51c7d1e3097d2fb439bfc1fc80ac9" + } + ], + "cost": 10868858, + "fee": 0, + "npc_result": { + "clvm_cost": 416858, + "error": null, + "npc_list": [ + { + "coin_name": "0x6bafb89ced310e8c20956e0a53c624aefe565c4e798da5be72084ec02d746385", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0x924f93ef9e3e654d5c778480ade161805da3278574376306827619a600fd990e4da1a76c4b6086b8c2301138152113ca", + "0xf1652b7d53ad61c94591e2b0854f0c80d0fa2e7f78a79bfd24f121629f984dda" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x17762cee2effd77874170e89f739eb5365b7585bbbe0c1688162b15e58fe919c", + "0x012c" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0x93977e2418cb773f823ed1f6b382972db6c51c7d1e3097d2fb439bfc1fc80ac9", + "0x11ed10" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x7bbc13462fa3426c5c4de8f948fbef6778c6f34d186f79efa16da6518f1a12fb" + ] + } + ] + ] + ], + "puzzle_hash": "0xd2a48184a158c69e2c5e32c0534daa0cefbfd64f8e055af5160bbf8b42d32cd2" + } + ] + }, + "program": "0xff01ffffffa0fc83ab3cecb6473720a0064bbdfece55072e61787d9d28fa5908c7f4a796cb0affff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0924f93ef9e3e654d5c778480ade161805da3278574376306827619a600fd990e4da1a76c4b6086b8c2301138152113caff018080ff8311ee3cffff80ffff01ffff33ffa017762cee2effd77874170e89f739eb5365b7585bbbe0c1688162b15e58fe919cff82012c80ffff33ffa093977e2418cb773f823ed1f6b382972db6c51c7d1e3097d2fb439bfc1fc80ac9ff8311ed1080ffff3cffa07bbc13462fa3426c5c4de8f948fbef6778c6f34d186f79efa16da6518f1a12fb8080ff8080808080", + "removals": [ + { + "amount": 1175100, + "parent_coin_info": "0xfc83ab3cecb6473720a0064bbdfece55072e61787d9d28fa5908c7f4a796cb0a", + "puzzle_hash": "0xd2a48184a158c69e2c5e32c0534daa0cefbfd64f8e055af5160bbf8b42d32cd2" + } + ], + "spend_bundle": { + "aggregated_signature": "0xb9471fdb33dcea869c6d9d1578dd69692d8204a3ed97972c3b0c4b8022c7b4e4939790db69a62446ee8c4f8d1ea56ba906ec12686ffc03950a0981042e6ce1a99fa8072c627e1c86c6a6f1810fcca676fc6ec7dcb20cbc7bf74390c0a9815488", + "coin_spends": [ + { + "coin": { + "amount": 1175100, + "parent_coin_info": "0xfc83ab3cecb6473720a0064bbdfece55072e61787d9d28fa5908c7f4a796cb0a", + "puzzle_hash": "0xd2a48184a158c69e2c5e32c0534daa0cefbfd64f8e055af5160bbf8b42d32cd2" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0924f93ef9e3e654d5c778480ade161805da3278574376306827619a600fd990e4da1a76c4b6086b8c2301138152113caff018080", + "solution": "0xff80ffff01ffff33ffa017762cee2effd77874170e89f739eb5365b7585bbbe0c1688162b15e58fe919cff82012c80ffff33ffa093977e2418cb773f823ed1f6b382972db6c51c7d1e3097d2fb439bfc1fc80ac9ff8311ed1080ffff3cffa07bbc13462fa3426c5c4de8f948fbef6778c6f34d186f79efa16da6518f1a12fb8080ff8080" + } + ] + }, + "spend_bundle_name": "0xdad9ce9ef2d0c37f94bb8aa0eba5538ec2bca8c99ad1457145cfe3eb060c1467" + }, + "f2736461882821526d95158a75d4fa10591c7a0c3a6fd29f12282ce042bbaa1d": { + "additions": [], + "cost": 61829, + "fee": 0, + "npc_result": { + "clvm_cost": 1829, + "error": null, + "npc_list": [] + }, + "program": "0xff01ff8080", + "removals": [], + "spend_bundle": { + "aggregated_signature": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coin_spends": [] + }, + "spend_bundle_name": "0xf2736461882821526d95158a75d4fa10591c7a0c3a6fd29f12282ce042bbaa1d" + } + } \ No newline at end of file diff --git a/src/chia-dotnet.tests/ColouredCoinWalletTests.cs b/src/chia-dotnet.tests/ColouredCoinWalletTests.cs index fa8cb7ae..07250315 100644 --- a/src/chia-dotnet.tests/ColouredCoinWalletTests.cs +++ b/src/chia-dotnet.tests/ColouredCoinWalletTests.cs @@ -6,6 +6,7 @@ namespace chia.dotnet.tests { [TestClass] [TestCategory("Integration")] + [Ignore("Needs a coloured coin wallet")] public class ColouredCoinWalletTests { private static ColouredCoinWallet _theWallet; diff --git a/src/chia-dotnet.tests/DIDWalletTests.cs b/src/chia-dotnet.tests/DIDWalletTests.cs index 6124c3ae..95e2a38e 100644 --- a/src/chia-dotnet.tests/DIDWalletTests.cs +++ b/src/chia-dotnet.tests/DIDWalletTests.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Threading; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -6,7 +7,7 @@ namespace chia.dotnet.tests { [TestClass] [TestCategory("Integration")] - [Ignore] + [Ignore("Needs DID Wallet")] public class DIDWalletTests { private static DIDWallet _theWallet; @@ -17,7 +18,7 @@ public static async Task Initialize(TestContext context) var rpcClient = Factory.CreateRpcClientFromHardcodedLocation(); await rpcClient.Connect(); - var daemon = new DaemonProxy(rpcClient, "unit_tests"); + var daemon = new DaemonProxy(rpcClient, "unit_tests"); await daemon.RegisterService(); var walletProxy = new WalletProxy(rpcClient, "unit_tests"); @@ -36,7 +37,9 @@ public static void ClassCleanup() [TestMethod()] public async Task GetPubKey() { - var pubkey = await _theWallet.GetPubKey(); + using var cts = new CancellationTokenSource(15000); + + var pubkey = await _theWallet.GetPubKey(cts.Token); Assert.IsNotNull(pubkey); } diff --git a/src/chia-dotnet.tests/DaemonTests.cs b/src/chia-dotnet.tests/DaemonTests.cs index f6299e0c..d92927f9 100644 --- a/src/chia-dotnet.tests/DaemonTests.cs +++ b/src/chia-dotnet.tests/DaemonTests.cs @@ -11,7 +11,6 @@ namespace chia.dotnet.tests /// [TestClass] [TestCategory("Integration")] - //[Ignore] // uncomment to suppress completely public class DaemonTests { private static DaemonProxy _theDaemon; @@ -53,10 +52,11 @@ public async Task GetHarvesterIsRunning() } [TestMethod] - [Ignore] + [Ignore("CAUTION")] public async Task ExitDaemon() { using var cts = new CancellationTokenSource(15000); + await _theDaemon.Exit(cts.Token); // if no exception the daemon was stopped successfully diff --git a/src/chia-dotnet.tests/DirectTests.cs b/src/chia-dotnet.tests/DirectTests.cs index 27e016ea..de22a165 100644 --- a/src/chia-dotnet.tests/DirectTests.cs +++ b/src/chia-dotnet.tests/DirectTests.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -10,21 +11,18 @@ public class DirectTests { [TestMethod] [TestCategory("Integration")] - public async Task ConnectDirectlyToFullNode() + public async Task GetConnectionsDirect() { try { - var endpoint = new EndpointInfo() - { - Uri = new Uri("https://172.26.210.216:8555"), - CertPath = @"\\wsl$/Ubuntu-20.04/home/don/.chia/mainnet/config/ssl/full_node/private_full_node.crt", - KeyPath = @"\\wsl$/Ubuntu-20.04/home/don/.chia/mainnet/config/ssl/full_node/private_full_node.key", - }; + using var cts = new CancellationTokenSource(15000); - using var rpcClient = new HttpRpcClient(endpoint); + using var rpcClient = Factory.CreateDirectRpcClientFromHardcodedLocation(8555); var fullNode = new FullNodeProxy(rpcClient, "unit_tests"); - var state = await fullNode.GetBlockchainState(); + var connections = await fullNode.GetConnections(cts.Token); + + Assert.IsNotNull(connections); } catch (Exception e) { @@ -32,9 +30,30 @@ public async Task ConnectDirectlyToFullNode() } } + [TestMethod] + [TestCategory("Integration")] + public async Task GetBlockchainStateDirect() + { + try + { + using var cts = new CancellationTokenSource(15000); + + using var rpcClient = Factory.CreateDirectRpcClientFromHardcodedLocation(8555); + var fullNode = new FullNodeProxy(rpcClient, "unit_tests"); + + var state = await fullNode.GetBlockchainState(cts.Token); + + Assert.IsNotNull(state); + } + catch (Exception e) + { + Assert.Fail(e.Message); + } + } [TestMethod] [TestCategory("Integration")] + [Ignore] public async Task ConnectDirectlyUsingConfigEndpoint() { try @@ -42,10 +61,12 @@ public async Task ConnectDirectlyUsingConfigEndpoint() var config = Config.Open(); var endpoint = config.GetEndpoint("full_node"); + using var cts = new CancellationTokenSource(15000); + using var rpcClient = new HttpRpcClient(endpoint); var fullNode = new FullNodeProxy(rpcClient, "unit_tests"); - var state = await fullNode.GetBlockchainState(); + var state = await fullNode.GetBlockchainState(cts.Token); } catch (Exception e) { diff --git a/src/chia-dotnet.tests/Factory.cs b/src/chia-dotnet.tests/Factory.cs index c25e4e5a..bb9c414a 100644 --- a/src/chia-dotnet.tests/Factory.cs +++ b/src/chia-dotnet.tests/Factory.cs @@ -1,23 +1,48 @@ -namespace chia.dotnet.tests +using System; + +namespace chia.dotnet.tests { /// /// Use this class to setup the connection to the daemon under test /// internal static class Factory { + // this is the ip address of the chia node + private const string NodeHostAddress = "172.25.181.156"; + + public static HttpRpcClient CreateDirectRpcClientFromHardcodedLocation(int port) + { + var endpoint = new EndpointInfo() + { + Uri = new Uri($"https://{NodeHostAddress}:{port}"), + CertPath = @"\\wsl$/Ubuntu-20.04/home/don/.chia/mainnet/config/ssl/full_node/private_full_node.crt", + KeyPath = @"\\wsl$/Ubuntu-20.04/home/don/.chia/mainnet/config/ssl/full_node/private_full_node.key", + }; + + return new HttpRpcClient(endpoint); + } /// - /// Create a daemon instance from a hardcoded address + /// Create a rpc client instance from a hardcoded address /// /// public static WebSocketRpcClient CreateRpcClientFromHardcodedLocation() { - // this is an example using a WSL instance running locally + /* + # warning YOU MIGHT BE USING A PRODUCTION NODE + var endpoint = Config.Open().GetEndpoint("ui"); + */ + + ///* var endpoint = new EndpointInfo() { - Uri = new System.Uri("wss://172.26.210.216:55400"), + Uri = new Uri($"wss://{NodeHostAddress}:55400"), CertPath = @"\\wsl$/Ubuntu-20.04/home/don/.chia/mainnet/config/ssl/daemon/private_daemon.crt", KeyPath = @"\\wsl$/Ubuntu-20.04/home/don/.chia/mainnet/config/ssl/daemon/private_daemon.key", + //Uri = new Uri("wss://localhost:55400"), + //CertPath = @"/home/don/.chia/mainnet/config/ssl/daemon/private_daemon.crt", + //KeyPath = @"/home/don/.chia/mainnet/config/ssl/daemon/private_daemon.key", }; + //*/ return new WebSocketRpcClient(endpoint); } diff --git a/src/chia-dotnet.tests/FarmerProxyTests.cs b/src/chia-dotnet.tests/FarmerProxyTests.cs index a54d56d4..6fffd30c 100644 --- a/src/chia-dotnet.tests/FarmerProxyTests.cs +++ b/src/chia-dotnet.tests/FarmerProxyTests.cs @@ -1,4 +1,5 @@ -using System.Threading; +using System.Linq; +using System.Threading; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -10,7 +11,6 @@ namespace chia.dotnet.tests /// [TestClass] [TestCategory("Integration")] - //[Ignore] // uncomment to suppress completely public class FarmerProxyTests { private static FarmerProxy _theFarmer; @@ -19,6 +19,7 @@ public class FarmerProxyTests public static async Task Initialize(TestContext context) { using var cts = new CancellationTokenSource(15000); + var rpcClient = Factory.CreateRpcClientFromHardcodedLocation(); await rpcClient.Connect(cts.Token); @@ -48,6 +49,7 @@ public async Task GetRewardTargets() [TestMethod] [TestCategory("CAUTION")] + [Ignore("CAUTION")] public async Task SetRewardTargets() { using var cts = new CancellationTokenSource(15000); @@ -64,16 +66,59 @@ public async Task GetSignagePoints() var signagePoints = await _theFarmer.GetSignagePoints(cts.Token); + foreach (var sp in signagePoints) + { + if (sp.Proofs.Count() > 0) + { + System.Diagnostics.Debug.WriteLine("here"); + } + } + Assert.IsNotNull(signagePoints); } [TestMethod] - [ExpectedException(typeof(ResponseException))] public async Task GetSignagePoint() { using var cts = new CancellationTokenSource(15000); - _ = await _theFarmer.GetSignagePoint("fake", cts.Token); + var signagePoints = await _theFarmer.GetSignagePoints(cts.Token); + var spInfo = signagePoints.FirstOrDefault(); + Assert.IsNotNull(spInfo); + var sp = await _theFarmer.GetSignagePoint(spInfo.SignagePoint.ChallengeChainSp, cts.Token); + + Assert.IsNotNull(sp); + } + + [TestMethod] + public async Task GetPoolState() + { + using var cts = new CancellationTokenSource(15000); + + var state = await _theFarmer.GetPoolState(cts.Token); + + Assert.IsNotNull(state); + } + + [TestMethod] + public async Task GetPoolLoginLink() + { + using var cts = new CancellationTokenSource(15000); + + var state = await _theFarmer.GetPoolState(cts.Token); + var pool = state.FirstOrDefault(); + if (pool is not null) + { + Assert.IsNotNull(pool.PoolConfig); + + var link = await _theFarmer.GetPoolLoginLink(pool.PoolConfig.LauncherId, cts.Token); + + Assert.IsNotNull(link); + } + else + { + Assert.Inconclusive("This node isn't part of a pool"); + } } [TestMethod] @@ -82,6 +127,7 @@ public async Task GetHarvesters() using var cts = new CancellationTokenSource(15000); var harvesters = await _theFarmer.GetHarvesters(cts.Token); + Assert.IsNotNull(harvesters); } @@ -99,16 +145,16 @@ public async Task GetConnections() using var cts = new CancellationTokenSource(15000); var connections = await _theFarmer.GetConnections(cts.Token); + Assert.IsNotNull(connections); } [TestMethod] - [Ignore] // only works on mainnet public async Task OpenConnection() { using var cts = new CancellationTokenSource(15000); - await _theFarmer.OpenConnection("node.chia.net", 8444, cts.Token); + await _theFarmer.OpenConnection("testnet-node.chia.net", 58444, cts.Token); } } } diff --git a/src/chia-dotnet.tests/FullNodeProxyTests.cs b/src/chia-dotnet.tests/FullNodeProxyTests.cs index d76b7df5..a434c781 100644 --- a/src/chia-dotnet.tests/FullNodeProxyTests.cs +++ b/src/chia-dotnet.tests/FullNodeProxyTests.cs @@ -47,7 +47,10 @@ public async Task GetBlockChainState() public async Task GetBlock() { using var cts = new CancellationTokenSource(15000); - var block = await _theFullNode.GetBlock("0xcb5c085a1f0259ab5581ebfce219f82cac9ec288da29665ce31e21a5b5856089", cts.Token); + + var state = await _theFullNode.GetBlockchainState(cts.Token); + Assert.IsNotNull(state.Peak, "peak not retreived yet"); + var block = await _theFullNode.GetBlock(state.Peak.HeaderHash, cts.Token); Assert.IsNotNull(block); } @@ -56,7 +59,10 @@ public async Task GetBlock() public async Task GetBlockRecord() { using var cts = new CancellationTokenSource(15000); - var record = await _theFullNode.GetBlockRecord("0xcb5c085a1f0259ab5581ebfce219f82cac9ec288da29665ce31e21a5b5856089", cts.Token); + + var state = await _theFullNode.GetBlockchainState(cts.Token); + Assert.IsNotNull(state.Peak, "peak not retreived yet"); + var record = await _theFullNode.GetBlockRecord(state.Peak.HeaderHash, cts.Token); Assert.IsNotNull(record); } @@ -64,8 +70,11 @@ public async Task GetBlockRecord() [TestMethod] public async Task GetBlocks() { - using var cts = new CancellationTokenSource(15000); - var blocks = await _theFullNode.GetBlocks(435160, 435167, false, cts.Token); + using var cts = new CancellationTokenSource(30000); + + var state = await _theFullNode.GetBlockchainState(cts.Token); + Assert.IsNotNull(state.Peak, "peak not retreived yet"); + var blocks = await _theFullNode.GetBlocks(state.Peak.Height - 5, state.Peak.Height - 1, false, cts.Token); Assert.IsNotNull(blocks); } @@ -74,6 +83,7 @@ public async Task GetBlocks() public async Task GetNetworkInfo() { using var cts = new CancellationTokenSource(15000); + var info = await _theFullNode.GetNetworkInfo(cts.Token); Assert.IsNotNull(info); @@ -83,7 +93,13 @@ public async Task GetNetworkInfo() public async Task GetNetworkSpace() { using var cts = new CancellationTokenSource(15000); - var space = await _theFullNode.GetNetworkSpace("0xcb5c085a1f0259ab5581ebfce219f82cac9ec288da29665ce31e21a5b5856089", "0x9edc235dfcb12a14e20e8f83b53060d067d97d217d6f9a3420fc9dbb470040fe", cts.Token); + + var state = await _theFullNode.GetBlockchainState(cts.Token); + Assert.IsNotNull(state.Peak, "peak not retreived yet"); + var newerBlock = await _theFullNode.GetBlockRecordByHeight(state.Peak.Height, cts.Token); + var olderBlock = await _theFullNode.GetBlockRecordByHeight(state.Peak.Height - 5, cts.Token); + var space = await _theFullNode.GetNetworkSpace(newerBlock.HeaderHash, olderBlock.HeaderHash, cts.Token); + Assert.IsNotNull(space); } @@ -91,6 +107,7 @@ public async Task GetNetworkSpace() public async Task Ping() { using var cts = new CancellationTokenSource(15000); + await _theFullNode.Ping(cts.Token); } @@ -98,23 +115,29 @@ public async Task Ping() public async Task GetConnections() { using var cts = new CancellationTokenSource(15000); + var connections = await _theFullNode.GetConnections(cts.Token); + Assert.IsNotNull(connections); } [TestMethod] - [Ignore] // only works on mainnet public async Task OpenConnection() { using var cts = new CancellationTokenSource(15000); - await _theFullNode.OpenConnection("node.chia.net", 8444, cts.Token); + + await _theFullNode.OpenConnection("testnet-node.chia.net", 58444, cts.Token); } [TestMethod()] public async Task GetBlockRecordByHeight() { using var cts = new CancellationTokenSource(15000); - var blockRecord = await _theFullNode.GetBlockRecordByHeight(12441, cts.Token); + + var state = await _theFullNode.GetBlockchainState(cts.Token); + Assert.IsNotNull(state.Peak, "peak not retreived yet"); + var blockRecord = await _theFullNode.GetBlockRecordByHeight(state.Peak.Height - 1, cts.Token); + Assert.IsNotNull(blockRecord); } @@ -122,16 +145,21 @@ public async Task GetBlockRecordByHeight() public async Task GetBlockRecords() { using var cts = new CancellationTokenSource(15000); - var blockRecords = await _theFullNode.GetBlockRecords(12000, 12441, cts.Token); + + var state = await _theFullNode.GetBlockchainState(cts.Token); + Assert.IsNotNull(state.Peak, "peak not retreived yet"); + var blockRecords = await _theFullNode.GetBlockRecords(state.Peak.Height - 5, state.Peak.Height - 1, cts.Token); + Assert.IsNotNull(blockRecords); } - [TestMethod()] public async Task GetUnfinishedBlockHeaders() { using var cts = new CancellationTokenSource(15000); + var blockHeaders = await _theFullNode.GetUnfinishedBlockHeaders(cts.Token); + Assert.IsNotNull(blockHeaders); } @@ -139,15 +167,30 @@ public async Task GetUnfinishedBlockHeaders() public async Task GetCoinRecordsByPuzzleHash() { using var cts = new CancellationTokenSource(15000); - var records = await _theFullNode.GetCoinRecordsByPuzzleHash("0xb5a83c005c4ee98dc807a560ea5bc361d6d3b32d2f4d75061351d1f6d2b6085f", true, cts.Token); + + var state = await _theFullNode.GetBlockchainState(cts.Token); + Assert.IsNotNull(state.Peak, "peak not retreived yet"); + var records = await _theFullNode.GetCoinRecordsByPuzzleHash(state.Peak.FarmerPuzzleHash, true, cts.Token); + Assert.IsNotNull(records); } [TestMethod()] public async Task GetCoinRecordByName() { - using var cts = new CancellationTokenSource(15000); - var coinRecord = await _theFullNode.GetCoinRecordByName("0x2b83ca807d305cd142e0e91d4e7a18f8e57df0ac6b4fa403bff249d0d491c609", cts.Token); + using var cts = new CancellationTokenSource(25000); + + var items = await _theFullNode.GetAllMempoolItems(cts.Token); + var item = items.FirstOrDefault(); + Assert.IsNotNull(item); + Assert.IsNotNull(item.Value); + + var npc = item.Value.NPCResult.NpcList.FirstOrDefault(); + Assert.IsNotNull(npc); + + // this call can take a long time - notice longer timeout in cts + var coinRecord = await _theFullNode.GetCoinRecordByName(npc.CoinName, cts.Token); + Assert.IsNotNull(coinRecord); } @@ -155,7 +198,12 @@ public async Task GetCoinRecordByName() public async Task GetAdditionsAndRemovals() { using var cts = new CancellationTokenSource(15000); - var additionsAndRemovals = await _theFullNode.GetAdditionsAndRemovals("7d83874e532ea08b0a5882ce8df705a5f45fc94bdeae4b1f568f05ce3010c6ae", cts.Token); + + var state = await _theFullNode.GetBlockchainState(cts.Token); + Assert.IsNotNull(state.Peak, "peak not retreived yet"); + var blockRecord = await _theFullNode.GetBlockRecordByHeight(state.Peak.Height - 10, cts.Token); + var additionsAndRemovals = await _theFullNode.GetAdditionsAndRemovals(blockRecord.HeaderHash, cts.Token); + Assert.IsNotNull(additionsAndRemovals); } @@ -163,7 +211,9 @@ public async Task GetAdditionsAndRemovals() public async Task GetAllMempoolItems() { using var cts = new CancellationTokenSource(15000); + var items = await _theFullNode.GetAllMempoolItems(cts.Token); + Assert.IsNotNull(items); } @@ -171,7 +221,9 @@ public async Task GetAllMempoolItems() public async Task GetAllMemmpoolTxIds() { using var cts = new CancellationTokenSource(15000); + var ids = await _theFullNode.GetAllMemmpoolTxIds(cts.Token); + Assert.IsNotNull(ids); } @@ -179,11 +231,13 @@ public async Task GetAllMemmpoolTxIds() public async Task GetMemmpooItemByTxId() { using var cts = new CancellationTokenSource(15000); + var ids = await _theFullNode.GetAllMemmpoolTxIds(cts.Token); Assert.IsNotNull(ids); Assert.IsTrue(ids.Count() > 0); - var item = await _theFullNode.GetMemmpooItemByTxId((string)ids.First(), cts.Token); + var item = await _theFullNode.GetMemmpooItemByTxId(ids.First(), cts.Token); + Assert.IsNotNull(item); } @@ -191,8 +245,54 @@ public async Task GetMemmpooItemByTxId() public async Task GetRecentSignagePoint() { using var cts = new CancellationTokenSource(15000); - var sp = await _theFullNode.GetRecentSignagePoint("0xf3ca7a33ce723b38c9a72156252b3b2395ead751213eef5d8ed40c941c6a9017", cts.Token); + + var farmer = new FarmerProxy(_theFullNode.RpcClient, _theFullNode.OriginService); // this only works with dameon's endpoint + var signagePoints = await farmer.GetSignagePoints(cts.Token); + var spInfo = signagePoints.FirstOrDefault(); + Assert.IsNotNull(spInfo); + + var sp = await _theFullNode.GetRecentSignagePoint(spInfo.SignagePoint.ChallengeChainSp, cts.Token); + Assert.IsNotNull(sp); } + + [TestMethod()] + public async Task GetRecentEOS() + { + using var cts = new CancellationTokenSource(15000); + + var farmer = new FarmerProxy(_theFullNode.RpcClient, _theFullNode.OriginService); // this only works with dameon's endpoint + var signagePoints = await farmer.GetSignagePoints(cts.Token); + var spInfo = signagePoints.FirstOrDefault(); + Assert.IsNotNull(spInfo); + var eos = await _theFullNode.GetRecentEOS(spInfo.SignagePoint.ChallengeHash, cts.Token); + + Assert.IsNotNull(eos); + } + + [TestMethod()] + [Ignore("not sure how to easily get coin name and solution height")] + public async Task GetPuzzleAndSolution() + { + using var cts = new CancellationTokenSource(15000); + + var items = await _theFullNode.GetAllMempoolItems(cts.Token); + Assert.IsTrue(items.Any()); + + var item = items.FirstOrDefault(); + Assert.IsNotNull(item); + Assert.IsNotNull(item.Value); + + var npc = item.Value.NPCResult.NpcList.FirstOrDefault(); + Assert.IsNotNull(npc); + + var coinRecord = await _theFullNode.GetCoinRecordByName(npc.CoinName, cts.Token); + Assert.IsNotNull(coinRecord); + Assert.AreNotEqual(coinRecord.SpentBlockIndex, 0); + + var ps = await _theFullNode.GetPuzzleAndSolution(npc.CoinName, coinRecord.SpentBlockIndex, cts.Token); + + Assert.IsNotNull(ps); + } } } diff --git a/src/chia-dotnet.tests/HarvesterProxyTests.cs b/src/chia-dotnet.tests/HarvesterProxyTests.cs index ad0c6c4a..7b5f7915 100644 --- a/src/chia-dotnet.tests/HarvesterProxyTests.cs +++ b/src/chia-dotnet.tests/HarvesterProxyTests.cs @@ -34,6 +34,7 @@ public static void ClassCleanup() public async Task GetPlots() { using var cts = new CancellationTokenSource(15000); + var plots = await _theHarvester.GetPlots(cts.Token); Assert.IsNotNull(plots); @@ -41,9 +42,11 @@ public async Task GetPlots() [TestMethod()] [TestCategory("CAUTION")] + [Ignore("CAUTION")] public async Task DeletePlot() { using var cts = new CancellationTokenSource(15000); + await _theHarvester.DeletePlot("", cts.Token); } @@ -51,6 +54,7 @@ public async Task DeletePlot() public async Task GetPlotDirectories() { using var cts = new CancellationTokenSource(15000); + var directories = await _theHarvester.GetPlotDirectories(cts.Token); Assert.IsNotNull(directories); @@ -58,9 +62,11 @@ public async Task GetPlotDirectories() [TestMethod()] [TestCategory("CAUTION")] + [Ignore("CAUTION")] public async Task AddPlotDirectory() { using var cts = new CancellationTokenSource(15000); + await _theHarvester.AddPlotDirectory("/home/don/plots", cts.Token); } @@ -68,14 +74,17 @@ public async Task AddPlotDirectory() public async Task Ping() { using var cts = new CancellationTokenSource(15000); + await _theHarvester.Ping(cts.Token); } [TestMethod()] [TestCategory("CAUTION")] + [Ignore("CAUTION")] public async Task RemovePlotDirectory() { using var cts = new CancellationTokenSource(15000); + await _theHarvester.RemovePlotDirectory("/home/don/plots", cts.Token); } @@ -83,6 +92,7 @@ public async Task RemovePlotDirectory() public async Task RefreshPlots() { using var cts = new CancellationTokenSource(15000); + await _theHarvester.RefreshPlots(cts.Token); } } diff --git a/src/chia-dotnet.tests/PlotterProxyTests.cs b/src/chia-dotnet.tests/PlotterProxyTests.cs index 3988f000..8b9cf67e 100644 --- a/src/chia-dotnet.tests/PlotterProxyTests.cs +++ b/src/chia-dotnet.tests/PlotterProxyTests.cs @@ -9,13 +9,14 @@ namespace chia.dotnet.tests [TestClass] [TestCategory("Integration")] public class PlotterProxyTests - { + { private static PlotterProxy _thePlotter; [ClassInitialize] public static async Task Initialize(TestContext context) { using var cts = new CancellationTokenSource(15000); + var rpcClient = Factory.CreateRpcClientFromHardcodedLocation(); await rpcClient.Connect(cts.Token); @@ -35,9 +36,9 @@ public static void ClassCleanup() [ExpectedException(typeof(InvalidOperationException))] public async Task FailOnInvalidConfig() { - var config = new PlotterConfig(); using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)); + var config = new PlotterConfig(); await _thePlotter.StartPlotting(config, cts.Token); } @@ -45,6 +46,8 @@ public async Task FailOnInvalidConfig() [TestCategory("CAUTION")] public async Task StartPlotting() { + using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)); + var config = new PlotterConfig() { Size = KValues.K25, @@ -54,16 +57,19 @@ public async Task StartPlotting() }; await _thePlotter.StartPlotting(config); - - // this seems like the only way to get the plot queue - var q = await _thePlotter.RegisterPlotter(); + var q = await _thePlotter.RegisterPlotter(cts.Token); Assert.IsNotNull(q); } - private static void _theDaemon_BroadcastMessageReceived(object sender, Message e) + [TestMethod()] + public async Task RegisterPlotter() { + using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)); + var q = await _thePlotter.RegisterPlotter(cts.Token); + + Assert.IsNotNull(q); } } } diff --git a/src/chia-dotnet.tests/SerializationTests.cs b/src/chia-dotnet.tests/SerializationTests.cs new file mode 100644 index 00000000..1e639ba6 --- /dev/null +++ b/src/chia-dotnet.tests/SerializationTests.cs @@ -0,0 +1,84 @@ +using System.IO; + +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace chia.dotnet.tests +{ + [TestClass] + public class SerializationTests + { + [TestMethod] + public void DeserializeTransacation() + { + var file = new FileInfo("transaction.json"); + using var reader = file.OpenText(); + var json = reader.ReadToEnd(); + + var transaction = Converters.ToObject(json); + + Assert.IsNotNull(transaction); + } + + [TestMethod] + public void SerializeTransacation() + { + var file = new FileInfo("transaction.json"); + using var reader = file.OpenText(); + var json = reader.ReadToEnd(); + + // if we can go from json -> object -> json -> object + // the derialization and desrialziation is doing the correct things in aggregate + var transaction = Converters.ToObject(json); + Assert.IsNotNull(transaction); + + string t = transaction.ToJson(); + Assert.IsFalse(string.IsNullOrEmpty(t)); + + var transaction2 = Converters.ToObject(t); + Assert.IsNotNull(transaction2); + } + + [TestMethod] + public void DeserializeFullBlock() + { + var file = new FileInfo("block.json"); + using var reader = file.OpenText(); + var json = reader.ReadToEnd(); + + var block = Converters.ToObject(json); + + Assert.IsNotNull(block); + } + + [TestMethod] + public void DeserializeMempoolItem() + { + var file = new FileInfo("mempoolItem.json"); + using var reader = file.OpenText(); + var json = reader.ReadToEnd(); + + var item = Converters.ToObject(json); + + Assert.IsNotNull(item); + } + + [TestMethod] + public void SerializeMempoolItem() + { + var file = new FileInfo("mempoolItem.json"); + using var reader = file.OpenText(); + var json = reader.ReadToEnd(); + + // if we can go from json -> object -> json -> object + // the derialization and desrialziation is doing the correct things in aggregate + var item = Converters.ToObject(json); + Assert.IsNotNull(item); + + string s = item.ToJson(); + Assert.IsFalse(string.IsNullOrEmpty(s)); + + var item2 = Converters.ToObject(s); + Assert.IsNotNull(item2); + } + } +} diff --git a/src/chia-dotnet.tests/WalletProxyTests.cs b/src/chia-dotnet.tests/WalletProxyTests.cs index e6207d99..dcf0eb44 100644 --- a/src/chia-dotnet.tests/WalletProxyTests.cs +++ b/src/chia-dotnet.tests/WalletProxyTests.cs @@ -17,6 +17,7 @@ public class WalletProxyTests public static async Task Initialize(TestContext context) { using var cts = new CancellationTokenSource(15000); + var rpcClient = Factory.CreateRpcClientFromHardcodedLocation(); await rpcClient.Connect(cts.Token); @@ -36,6 +37,7 @@ public static void ClassCleanup() public async Task GetWallets() { using var cts = new CancellationTokenSource(15000); + var wallets = await _theWallet.GetWallets(cts.Token); Assert.IsNotNull(wallets); @@ -45,6 +47,7 @@ public async Task GetWallets() public async Task GetPublicKeys() { using var cts = new CancellationTokenSource(15000); + var keys = await _theWallet.GetPublicKeys(cts.Token); Assert.IsNotNull(keys); @@ -54,6 +57,7 @@ public async Task GetPublicKeys() public async Task Login() { using var cts = new CancellationTokenSource(15000); + var fingerprints = await _theWallet.GetPublicKeys(cts.Token); Assert.IsNotNull(fingerprints); Assert.IsTrue(fingerprints.Count() > 0); @@ -67,6 +71,7 @@ public async Task Login() public async Task GetPrivateKey() { using var cts = new CancellationTokenSource(15000); + var fingerprints = await _theWallet.GetPublicKeys(cts.Token); var key = await _theWallet.GetPrivateKey(fingerprints.First(), cts.Token); @@ -77,6 +82,7 @@ public async Task GetPrivateKey() public async Task GetSyncStatus() { using var cts = new CancellationTokenSource(15000); + var info = await _theWallet.GetSyncStatus(cts.Token); Assert.IsNotNull(info); @@ -86,15 +92,27 @@ public async Task GetSyncStatus() public async Task GetNetworkInfo() { using var cts = new CancellationTokenSource(15000); + var info = await _theWallet.GetNetworkInfo(cts.Token); Assert.IsNotNull(info); } + [TestMethod()] + public async Task GetAllTrades() + { + using var cts = new CancellationTokenSource(15000); + + var trades = await _theWallet.GetAllTrades(cts.Token); + + Assert.IsNotNull(trades); + } + [TestMethod()] public async Task GetHeightInfo() { using var cts = new CancellationTokenSource(15000); + var height = await _theWallet.GetHeightInfo(cts.Token); Assert.IsTrue(height > 0); @@ -105,6 +123,7 @@ public async Task GetHeightInfo() public async Task CreateBackup() { using var cts = new CancellationTokenSource(15000); + await _theWallet.CreateBackup(@"C:\tmp\b.bak", cts.Token); } @@ -112,6 +131,7 @@ public async Task CreateBackup() public async Task GenerateMnemonic() { using var cts = new CancellationTokenSource(15000); + var mnemonic = await _theWallet.GenerateMnemonic(cts.Token); Assert.IsNotNull(mnemonic); @@ -122,6 +142,7 @@ public async Task GenerateMnemonic() public async Task FullCircleKey() { using var cts = new CancellationTokenSource(15000); + var mnemonic = await _theWallet.GenerateMnemonic(cts.Token); var fingerprint = await _theWallet.AddKey(mnemonic, true, cts.Token); var key = await _theWallet.GetPrivateKey(fingerprint, cts.Token); @@ -132,11 +153,12 @@ public async Task FullCircleKey() [TestMethod()] [TestCategory("CAUTION")] + [Ignore("CAUTION")] public async Task CreateNewColourCoinWallet() { using var cts = new CancellationTokenSource(15000); - await LoginToFirstWallet(); + await LoginToFirstWallet(); var walletInfo = await _theWallet.CreateColourCoinWallet(1, 1, "dkackman.colouredwallet.1", cts.Token); Assert.IsNotNull(walletInfo); @@ -144,13 +166,13 @@ public async Task CreateNewColourCoinWallet() [TestMethod()] [TestCategory("CAUTION")] + [Ignore("CAUTION")] public async Task CreateDIDWallet() { using var cts = new CancellationTokenSource(15000); - await LoginToFirstWallet(); + await LoginToFirstWallet(); var backupIDs = new List(); - var walletInfo = await _theWallet.CreateDIDWallet(backupIDs, 1, 1, cts.Token); Assert.IsNotNull(walletInfo); @@ -159,29 +181,40 @@ public async Task CreateDIDWallet() [TestMethod()] public async Task GetTransaction() { - using var cts = new CancellationTokenSource(15000); - await LoginToFirstWallet(); - var transaction = await _theWallet.GetTransaction("0x03ba20de8cbaf42944277eef60ac716730721a1b253a606c5e9621541487b519", cts.Token); + using var cts = new CancellationTokenSource(150000); - Assert.IsNotNull(transaction); + var wallet = new Wallet(1, _theWallet); + _ = await wallet.Login(cts.Token); + + var transactions = await wallet.GetTransactions(cts.Token); + var transaction1 = transactions.FirstOrDefault(); + Assert.IsNotNull(transaction1); + + var transaction2 = await _theWallet.GetTransaction(transaction1.TransactionId, cts.Token); + Assert.IsNotNull(transaction2); + + Assert.AreEqual(transaction1.TransactionId, transaction2.TransactionId); } [TestMethod()] + [Ignore("CAUTION")] public async Task CreateOfferForIds() { using var cts = new CancellationTokenSource(15000); + var ids = new Dictionary() { { 1, 1 } }; - await _theWallet.CreateOfferForIds(ids, @"C:\tmp\test.offer", cts.Token); } [TestMethod()] + [Ignore("CAUTION")] public async Task GetDiscrepenciesForOffer() { using var cts = new CancellationTokenSource(15000); + var discrepencies = await _theWallet.GetDiscrepenciesForOffer(@"C:\tmp\test.offer", cts.Token); Assert.IsNotNull(discrepencies); @@ -191,6 +224,7 @@ public async Task GetDiscrepenciesForOffer() public async Task GetFarmedAmount() { using var cts = new CancellationTokenSource(15000); + var amount = await _theWallet.GetFarmedAmount(cts.Token); Assert.IsNotNull(amount); @@ -199,6 +233,7 @@ public async Task GetFarmedAmount() private async Task LoginToFirstWallet() { using var cts = new CancellationTokenSource(15000); + var fingerprints = await _theWallet.GetPublicKeys(); _ = await _theWallet.LogIn(fingerprints.First(), true, cts.Token); diff --git a/src/chia-dotnet.tests/WalletTests.cs b/src/chia-dotnet.tests/WalletTests.cs index a6cc806c..5478a976 100644 --- a/src/chia-dotnet.tests/WalletTests.cs +++ b/src/chia-dotnet.tests/WalletTests.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Threading; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -13,16 +14,18 @@ public class WalletTests [ClassInitialize] public static async Task Initialize(TestContext context) { + using var cts = new CancellationTokenSource(15000); + var rpcClient = Factory.CreateRpcClientFromHardcodedLocation(); - await rpcClient.Connect(); + await rpcClient.Connect(cts.Token); - var daemon = new DaemonProxy(rpcClient, "unit_tests"); - await daemon.RegisterService(); + var daemon = new DaemonProxy(rpcClient, "unit_tests"); + await daemon.RegisterService(cts.Token); var walletProxy = new WalletProxy(rpcClient, "unit_tests"); _theWallet = new Wallet(1, walletProxy); - _ = await _theWallet.Login(); + _ = await _theWallet.Login(cts.Token); } [ClassCleanup()] @@ -34,7 +37,9 @@ public static void ClassCleanup() [TestMethod()] public async Task GetWalletBalance() { - var balance = await _theWallet.GetBalance(); + using var cts = new CancellationTokenSource(15000); + + var balance = await _theWallet.GetBalance(cts.Token); Assert.IsNotNull(balance); } @@ -42,7 +47,9 @@ public async Task GetWalletBalance() [TestMethod()] public async Task GetTransactions() { - var transactions = await _theWallet.GetTransactions(); + using var cts = new CancellationTokenSource(15000); + + var transactions = await _theWallet.GetTransactions(cts.Token); Assert.IsNotNull(transactions); } @@ -50,7 +57,9 @@ public async Task GetTransactions() [TestMethod()] public async Task GetWalletAddress() { - var address = await _theWallet.GetNextAddress(false); + using var cts = new CancellationTokenSource(15000); + + var address = await _theWallet.GetNextAddress(false, cts.Token); Assert.IsNotNull(address); } @@ -59,8 +68,10 @@ public async Task GetWalletAddress() [TestCategory("CAUTION")] public async Task CreateNewWalletAddress() { - var address = await _theWallet.GetNextAddress(false); - var newAddress = await _theWallet.GetNextAddress(true); + using var cts = new CancellationTokenSource(15000); + + var address = await _theWallet.GetNextAddress(false, cts.Token); + var newAddress = await _theWallet.GetNextAddress(true, cts.Token); Assert.AreNotEqual(address, newAddress); } @@ -68,7 +79,9 @@ public async Task CreateNewWalletAddress() [TestMethod()] public async Task GetTransactionCount() { - var count = await _theWallet.GetTransactionCount(); + using var cts = new CancellationTokenSource(15000); + + var count = await _theWallet.GetTransactionCount(cts.Token); Assert.IsNotNull(count); } @@ -77,14 +90,18 @@ public async Task GetTransactionCount() [TestCategory("CAUTION")] public async Task DeleteUnconfirmedTransactions() { - await _theWallet.DeleteUnconfirmedTransactions(); + using var cts = new CancellationTokenSource(15000); + + await _theWallet.DeleteUnconfirmedTransactions(cts.Token); } [TestMethod()] [TestCategory("CAUTION")] public async Task SendTransaction() { - var transaction = await _theWallet.SendTransaction("txch1em43zsczg2fv79jlg00ucedl9x3atvpnfa09uuk5pgd7v9039sdsashhuq", 1, 1); + using var cts = new CancellationTokenSource(15000); + + var transaction = await _theWallet.SendTransaction("txch1em43zsczg2fv79jlg00ucedl9x3atvpnfa09uuk5pgd7v9039sdsashhuq", 1, 1, cts.Token); Assert.IsNotNull(transaction); } diff --git a/src/chia-dotnet.tests/block.json b/src/chia-dotnet.tests/block.json new file mode 100644 index 00000000..76675201 --- /dev/null +++ b/src/chia-dotnet.tests/block.json @@ -0,0 +1,168 @@ +{ + "challenge_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x02002f55e16d7db923a9644db7d51ab91aeb6f4ff1399588928b077d49c9ebaa4ab69d6953e90cd478a35ad70cd59780333c8d1e4b7ae0fc171d0bbc50dc49e502493a44bbe7596da18e08f3d13e62187b8423ddb1c1a8dc093c6139b96344789128010000000000001afcfcb6e5e5ad7348f08ffd118341747c2094aaaa6e30cd6e2eaaed21d626352d39b08302005d2600c08e8798272ab99be28aefa003d49abfa8b8a77a7c1e491c2e970a5faad7a3577f6b37f8b62b4ea2b8eceeadbc34bacdc5927cf4f7fce423edb41bff2593b2d3b81f8da9f32cacd634d22f64959da1649fe7fa52940096981048f8a3230100000000000050f6f484e2fe2104f36a8ee1d1b7510ba6d6ff52afe2026bff46704a49b4f4eab37599790100ed525780c8fb7202ba25e4a8c9f28ef693cc53282360c49903764e063f877bed0dbe027cd335b45378def31199487cd3477bb7c0f0e87a66336fa67eb687ba04b8f788a84c15af3dc100a22a3a1a11407e285040701ef878cd894037bfba14050804", + "witness_type": 2 + }, + "challenge_chain_sp_proof": { + "normalized_to_identity": false, + "witness": "0x0100317c21c00aef67c28896296b59ea654330b9a72ce5288b6676163d587b6863f004f053fd9ab4bd31892eb8d18b823d4021bb6296663751d050dcacfcddd0fa42ae547b0472def356e04436eeb573fd3f373beea2c31c374049a0e192570d324e01000000000000083590962a0bc7b9075ccaf24a94146326239fa7465766edcff785e822cf9e0889b652770200bd12c8e49cfbf9dc32542fcadddbb43b2dc02c890af41299ac8bc4a1924d69fd8494ffe434bfe07c501420dc58480da0e7c1f0dc08311979aa821ef6f6c4250205791ca76eec4244fc97e1a1f7dd6e3c37dc2042855aa25b9c2c67eef1132402100b000000000018a114ad6c1f0cb4b54edb201ee0ce430f1ef1112a0ccc5c75cf9d698fa56a0622c8094703000ae34c7b7f59a108e212ead708b96ef4fc1e9ba2a838e3c5be1b7288c6840c7d974e89ceca2ebdf09bd5bbf3186e72fc1cbf5fcbf4ca56d25353e937cb1d764cadda99b4ade04a35f08cc44a5488daf0a6aae59c0e34164c6727cf25a20ec1840100", + "witness_type": 2 + }, + "finished_sub_slots": [], + "foliage": { + "foliage_block_data": { + "extension_data": "0x0000000000000000000000000000000000000000000000000000000003a2c7c9", + "farmer_reward_puzzle_hash": "0x20e699a102a00097d692e74d8bc04be15955a21e98829f2220170d900ffa8db4", + "pool_signature": null, + "pool_target": { + "max_height": 0, + "puzzle_hash": "0xdcb5a5629da95b83e2aadd95da6ee5f9b25661a4b0f5cbb0b9834d014242ab38" + }, + "unfinished_reward_block_hash": "0x4a1b4a30946f29a6eb054039054d17c727223f51cf258c927d618f5efffb4291" + }, + "foliage_block_data_signature": "0xb079156996b0c5ab38ac68418fd355ee62ec1e2f3b7f069846cf39d3ffe2705a0a95f9272bf540a7a6770fac387a43390e6b04686226658322720dea7c0a85cec98182d5c9773938af0065601007dbc1b8061e50f36cdb907e41fda07a16d59a", + "foliage_transaction_block_hash": "0xe34d64bd3c7ede41bb1735954a30dab3b1d9bc52b02cec4fade7db658b87a122", + "foliage_transaction_block_signature": "0xa7e1cddc4a70f0135a4548b083d38516ebb3af08b73fbc04ad579412c9f5c308e39caa2cea8a729f4db2a3f12430c9c51392d21ed32192afe87ae3e561f7acb4e006bc06b0da7f16eb6d28aeebc2e2d4e18faa3b41b090806c2156d729af62a7", + "prev_block_hash": "0x7fdfbbc2e93488a7d7f9c2eb69a96ad0e578dec47f60b547a26e6b80ffd828f9", + "reward_block_hash": "0x3ad44705024dff44df5ccd4441de6f1282f3be1683b0dddd76d4a052ef545b21" + }, + "foliage_transaction_block": { + "additions_root": "0x678d4c5877a3fa404eb51de52246515b8323ebedbd89ec6a94374a9ed09932b9", + "filter_hash": "0x4f522ca4a5f36f531239480ea2f8d4936c45ad1c980b4fb40e9a21a13be24659", + "prev_transaction_block_hash": "0xdd9942dfad4709ddfca85e71fa892adf65edc8723151ea8c3d5c60096c49fea0", + "removals_root": "0x293aea1e124d5e1111c0755631a6b44b19205bf26801c39b97c4bf3df7cf61b6", + "timestamp": 1628440392, + "transactions_info_hash": "0x7f09e69d30e834c208c6b8868c9a42df23387a2ec7e98e8499916787971a698f" + }, + "header_hash": "1c2eb99fbe048d3ffaea4113a925ea06300288c8016c8589ce30ab0ef11b5953", + "infused_challenge_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x0000bc335b4a8dcb95712c538e7b8c666e4ee8ee9c050fd0833b44b6e725232c4a1e4427a7b1886a991652a6d421f459286aa20c1dd141e6665da5fb402b928d9a30b92be0489cd1b265bba5eecb143bab0e7747683c1b818a8b7bdd81da2f0f8719020000000000001afcfc99003e3a55666dac4fdc4049bf5fc55bb64217eb29619adc74bb21afc5c2b7488d000053fccf4f800d14af7f2d76c8360f256cde2c24e5099505a2e56d2578e19631b090045ec30b8a6792b77e31bac57e4d2dc4be7b87319322b88f4b79279fae3a3bdcae3532efc918cda4a31b1ee242849c8fb11c6baff539fe994b5dc64751820f0100000000000050f6f4c1b3e90b9d68312f2b1de1410def2e6a096533d26cbad790f12fbbc5a7985f30b301007ea0b3e2784ffe4dea8603c6ba33cb9f67bc87a9b68d4ee9fef780cf480931d7e971937060c44d6b4720faeb2af39ac0d4ed37cc322e739109375ff081fd231c67328c7a61e0de864beec64d9437e185c55a78509a15f25c60864faacba2cc0b0200", + "witness_type": 2 + }, + "reward_chain_block": { + "challenge_chain_ip_vdf": { + "challenge": "0xcd19141f71cffc29c27ea29d07766b1581f2afb06c0b8fb6a5b4f26ac8ed756f", + "number_of_iterations": 99393694, + "output": { + "data": "0x000099b0ee8cc2489523925a2793aa32febe9223a11fc6ce2d0db57fc526f2860484519ac495c2b9b86b13713277116020a36056604d09ca24456b474274d893cb034bdb599e8fcb760151287271068666654013b9469f400aa4fd5703ee4e8df3070301" + } + }, + "challenge_chain_sp_signature": "0xb813e4f95e15d983b1753a4fad6bf9af5116b8206a25e08213c8ef17cc5ebbae1aa25dedfb98caacb808fceae9c62d010c1b38ed0f33b90e3b00361716ad4b53e8080deb50e0d97732836bf16a20116b83075098c484a79552f28ee408f0877f", + "challenge_chain_sp_vdf": { + "challenge": "0xcd19141f71cffc29c27ea29d07766b1581f2afb06c0b8fb6a5b4f26ac8ed756f", + "number_of_iterations": 93855744, + "output": { + "data": "0x000075e104b51d2a106a545f1d4adea3a0df4271bac0ecfdb997eac3002fd6fe1cd9a6fd013805489a16805e163c117d95eef278f5209554f0e21ea22024cc188d18fcfd6923e097c194136d5dbc908099199d10ac030dd39660aa294f5e13623e0c0300" + } + }, + "height": 423514, + "infused_challenge_chain_ip_vdf": { + "challenge": "0x8e18b8f93d2666e2c4facb6a5ec496965b5c1c6553057442a640f746af4d575a", + "number_of_iterations": 7959159, + "output": { + "data": "0x030028bcf78e1ceeb1e0b80adbcc8304e12f8b54fd73663d67a912cfc87e17f13b4c04d7ec391756891121c5b3aa83cf45794fbf1d51d3ea7546d2b642d109f7d22821795022d4c06bf594dda9f4d37e782a919a54786a1cf3a0473fb03df48f5c460100" + } + }, + "is_transaction_block": true, + "pos_ss_cc_challenge_hash": "0xcd19141f71cffc29c27ea29d07766b1581f2afb06c0b8fb6a5b4f26ac8ed756f", + "proof_of_space": { + "challenge": "0x2bf1ec54b778242124f57df06b427ea50ed951ee7158b5c754fa1f571a06daf0", + "plot_public_key": "0xa9fef8928b1769e0a2f052ad87afd7582338a8c4e7412554753aab1cc42e0cb4081c9b302ab6fa463d26a9aba683f6a6", + "pool_contract_puzzle_hash": "0xdcb5a5629da95b83e2aadd95da6ee5f9b25661a4b0f5cbb0b9834d014242ab38", + "pool_public_key": null, + "proof": "0xe025272fc2dcc43f652876314e67adc366350e0cd1987ca51e5bfea06fd11ac5b8b9d81bb8d2b2237ad43e64e6a8bb86bccf17c7d9b0060ccea86d87f4e720d6d01667519e02afa318b5a1e263ac9d14383f1cef091d01d1b4888b5d2101905bfe075fe4408abe7495fabb3837dd22acfac5ebfead58807eb27da797308aa3916c6c127e64dc111446e8bde16b23d2bd11580cc2b843f4f23edb86e93904504d9e1023b44d9c4e33c5f4573dbc275149d5f477c60a4d1c321fceabde2251d557cda76a16c99e33f817a2224011939661ccc59244288bdf380d6749e77ae8346ae25e31dc2b5b4084ed149680a507d44eb9e0e50599e048745610007d6d892804", + "size": 32 + }, + "reward_chain_ip_vdf": { + "challenge": "0x991e2e305a8317b1e1833b81a67be45a199a9a88be5bd265500d9227987a7847", + "number_of_iterations": 7959159, + "output": { + "data": "0x02005f05d1f2c4db8b01ceda61e3b16a0e210f31bb8ca912770aa896e3315050f8d819d9e02043fd1865219aee15404cab88586b3c0b6b3bc8e93443f48e1ab8333081c51085887d5b907ed51ef7abd69b7e53f4a5a1199a8c323954e3421df988100201" + } + }, + "reward_chain_sp_signature": "0x903893e4f320b929aad6875d60156a1ed32f6da823943e4b91119168228017217a399b4a3cce653f66eb67cad83685a01810d913a5b8017a1a3b79c0b6bdd64883d8e45752d0e90834a525c9164366ae4f7d12e31816383e3b638146b52c0927", + "reward_chain_sp_vdf": { + "challenge": "0x991e2e305a8317b1e1833b81a67be45a199a9a88be5bd265500d9227987a7847", + "number_of_iterations": 2421209, + "output": { + "data": "0x0300e05b517f062725501f189f2f1de0d8d47f995a4882cf5c6eeb71f8b4e1a32cbecbbb798bf1384ecb1cbfdb26e05f7661aab222243bde54977a9c04b69f5bba00d77265b4a5914978f364ff9cf5d1d20608bfbf54e1f9d9d1d7fb221dba0833000100" + } + }, + "signage_point_index": 57, + "total_iters": 982939312286, + "weight": 41441837191 + }, + "reward_chain_ip_proof": { + "normalized_to_identity": false, + "witness": "0x010039ca997e53e97de62ed1332c916a6ebb529b7c00f36f3b210eba30b7ac27b3f6234012ca802db30c74535e074940addc8bc7d1974e950084c986c06805dcb70d8ec990244274f60767c0a3038b6bde20b285c51b6dfea2504b4c57dd48337011070600000000001afcfc9db4876c46c8775c398c21218239e53dc950fa7c1fd4fc17283d43bd03728dc1c90000ce6ab6a60e9d8a67e540f17760aebc831a0bbdce2976ebdf7eb06823d7bc95cb33ff095b6fa6082f8c45e1d1e076f821a220589e36c55decdaadf836d1034e2e5bb5cda814b1b445bd88a8c635ed20cbef14839a278db295973698bb6561ee1d0100000000000050f6f4a64720057a91d99d2553e6945b2a5b5e1d5d1e0fbafcd1f31fe092b9552f26c5b5030013f3777644a87596db905b22651da8463618abd5b7cda6498556472b6ed5b2b98c9f215f32a5b736f1c24cf01cf8858b87edddbbe440d8d07819217cb9e3d1138331167a7317b1a9c5bb46a291e41fc69f6cc94af6ebf69e1e8e3945f474681f0201", + "witness_type": 2 + }, + "reward_chain_sp_proof": { + "normalized_to_identity": false, + "witness": "0x03009b83e72c6d3a277ba4dac98fc3b54e2c8d8fe52184600694afa08f489ce048bfdaf49c1fb4842d24029905660cf8dd5cc5862b3a74c83455314b0211a9195c0a59b6e50a3706085b36d52aa88852b6d22cc4846c9885e997d863d78682c1181007060000000000083590f23af77177a7e083b82c27bd3f7cd0ed9426ef3c562be1eadc479925f6f16521210300857f24d103fbababfb46aa018cbdeaddbc6b3d626832fcc477dd93ba6775d54d88a0f886126603ed40235156df940d766a39b14561d680f3dbbece6c9bb5484505d13540b108949cc15ba121a0138c74f302a4be59b604b63c45dd407a9783210100000000000018a1149812585d1ed88e824b3f5b50875c5597ba196acef999afc33021a39edaddfd83970200e65929c65f9dc3981cf61ae8af205b69ae0414893fdcf7b4a1b8b18d46bac9daf228d6b53d2edf5a5b7e6068161cf2dfde3d4417d4ab51bdfe61ec7451bc43035fb777836ba5be674f09aac4c8e5fac83ef20a1a0f128690803b09c894e32e060100", + "witness_type": 2 + }, + "transactions_generator": "0xff01ffffffa01e65afd67f3e80ad05e8541f681201dca9e607b46fd0d5aabbe2379d1a08e31fffff02ffff01ff02ffff01ff02ffff03ffff18ff2fffff010180ffff01ff02ff36ffff04ff02ffff04ff05ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff0bff80808080ffff04ff2fffff04ff0bffff04ff5fff808080808080808080ffff01ff088080ff0180ffff04ffff01ffffffff4602ff3304ffff0101ff02ffff02ffff03ff05ffff01ff02ff5cffff04ff02ffff04ff0dffff04ffff0bff2cffff0bff24ff3880ffff0bff2cffff0bff2cffff0bff24ff3480ff0980ffff0bff2cff0bffff0bff24ff8080808080ff8080808080ffff010b80ff0180ff02ffff03ff0bffff01ff02ff32ffff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ffff02ff2affff04ff02ffff04ffff02ffff03ffff09ff23ff2880ffff0181b3ff8080ff0180ff80808080ff80808080808080ffff01ff02ffff03ff17ff80ffff01ff088080ff018080ff0180ffffffff0bffff0bff17ffff02ff3affff04ff02ffff04ff09ffff04ff2fffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ff5f80ff0bff81bf80ff02ffff03ffff20ffff22ff4fff178080ffff01ff02ff7effff04ff02ffff04ff6fffff04ffff04ffff02ffff03ff4fffff01ff04ff23ffff04ffff02ff3affff04ff02ffff04ff09ffff04ff53ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff81b3ff80808080ffff011380ff0180ffff02ff7cffff04ff02ffff04ff05ffff04ff1bffff04ffff21ff4fff1780ff80808080808080ff8080808080ffff01ff088080ff0180ffff04ffff09ffff18ff05ffff010180ffff010180ffff09ff05ffff01818f8080ff0bff2cffff0bff24ff3080ffff0bff2cffff0bff2cffff0bff24ff3480ff0580ffff0bff2cffff02ff5cffff04ff02ffff04ff07ffff04ffff0bff24ff2480ff8080808080ffff0bff24ff8080808080ffffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff26ffff04ff02ffff04ff09ff80808080ffff02ff26ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ff5effff04ff02ffff04ff05ffff04ff0bffff04ffff02ff3affff04ff02ffff04ff09ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfff80808080808080808080ffff04ffff04ff20ffff04ff17ff808080ffff02ff7cffff04ff02ffff04ff05ffff04ffff02ff82017fffff04ffff04ffff04ff17ff2f80ffff04ffff04ff5fff81bf80ffff04ff0bff05808080ff8202ff8080ffff01ff80808080808080ffff02ff2effff04ff02ffff04ff05ffff04ff0bffff04ffff02ffff03ff3bffff01ff02ff22ffff04ff02ffff04ff05ffff04ff17ffff04ff13ffff04ff2bffff04ff5bffff04ff5fff808080808080808080ffff01ff02ffff03ffff09ff15ffff0bff13ff1dff2b8080ffff01ff0bff15ff17ff5f80ffff01ff088080ff018080ff0180ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfffff04ff82017fff8080808080808080808080ff02ffff03ff05ffff011bffff010b80ff0180ff018080ffff04ffff01ffa024e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fdffa00204c3fa6d0aa0013bf1568de47d6793971c0563fbfce1fb53aaa96463f9f836a0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff8202ffffff01ff02ff16ffff04ff02ffff04ff05ffff04ff8204bfffff04ff8206bfffff04ff82017fffff04ffff0bffff19ff2fffff18ffff019100ffffffffffffffffffffffffffffffffff8202ff8080ff0bff82017f80ff8080808080808080ffff01ff04ffff04ff08ffff04ff17ffff04ffff02ff1effff04ff02ffff04ff82017fff80808080ff80808080ffff04ffff04ff1cffff04ff5fffff04ff8206bfff80808080ff80808080ff0180ffff04ffff01ffff32ff3d33ff3effff04ffff04ff1cffff04ff0bffff04ff17ff80808080ffff04ffff04ff1cffff04ff05ffff04ff2fff80808080ffff04ffff04ff0affff04ff5fff808080ffff04ffff04ff14ffff04ffff0bff5fffff012480ff808080ff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01a096374f9c598bc05bed00a40b7a2f13f871c6e00701beecdb38887a119754d0d4ffff04ffff01a0b767d71ade318d803d31a4b26e8e285df2dcbdc97dd09f94059decaa3e8f5231ffff04ffff01b0b198b7362cd8c1717f697cfb190fb28bc5f8a3ec895dd679d515ba27c6f69267d5253d72ec3d134c88063ecf28954d33ffff04ffff01a0117816bf8f01cfea414140de5dae222300000000000000000000000000000000ffff04ffff01a05cbbf88de046849f9dd93eef87f2eb7a5bbffc43c872ded0807ddb2a46d12371ff01808080808080ff01808080ff01ffffffa013ac40ec75cd5b1325c8cb4256961b922669689b0860761ef6738a03904e043cffa0746b376c60d1215ff3dd864c479b29ad161382b480216095f22d05da4b891d3bff0180ff01ffff8601977420dc00ff83067640808080ffffa0117816bf8f01cfea414140de5dae222300000000000000000000000000067640ffff02ffff01ff02ffff01ff02ffff03ff82017fffff01ff04ffff04ff38ffff04ffff0bffff02ff2effff04ff02ffff04ff05ffff04ff81bfffff04ffff02ff3effff04ff02ffff04ffff04ff05ffff04ff0bff178080ff80808080ff808080808080ff82017f80ff808080ffff04ffff04ff3cffff01ff248080ffff04ffff04ff28ffff04ff82017fff808080ff80808080ffff01ff04ffff04ff24ffff04ff2fff808080ffff04ffff04ff2cffff04ff5fffff04ff81bfff80808080ffff04ffff04ff10ffff04ff81bfff808080ff8080808080ff0180ffff04ffff01ffffff49ff463fffff5002ff333cffff04ff0101ffff02ff02ffff03ff05ffff01ff02ff36ffff04ff02ffff04ff0dffff04ffff0bff26ffff0bff2aff1280ffff0bff26ffff0bff26ffff0bff2aff3a80ff0980ffff0bff26ff0bffff0bff2aff8080808080ff8080808080ffff010b80ff0180ffff0bff26ffff0bff2aff3480ffff0bff26ffff0bff26ffff0bff2aff3a80ff0580ffff0bff26ffff02ff36ffff04ff02ffff04ff07ffff04ffff0bff2aff2a80ff8080808080ffff0bff2aff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ff09ff80808080ffff02ff3effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01a024e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fdffff04ffff01a00204c3fa6d0aa0013bf1568de47d6793971c0563fbfce1fb53aaa96463f9f836ffff04ffff01a0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff0183093a80ffff04ffff01a049ac71c68bfffbc8d68a9a5e48779db990c6d8d9688a8a554ebb17dda1b067e6ff01808080808080ff8601977420dc00ffffa0746b376c60d1215ff3dd864c479b29ad161382b480216095f22d05da4b891d3bffa0dca55dfbe1aa210a10b9843be8821531b506e64065f0a7c0db2e7543d6fa4ab98080ffffa09e0d6a91fd0e8f6218926f6d222cb3856edf455448c0e569b156b39e8c100a36ffff02ffff01ff02ffff01ff02ffff03ffff18ff2fffff010180ffff01ff02ff36ffff04ff02ffff04ff05ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff0bff80808080ffff04ff2fffff04ff0bffff04ff5fff808080808080808080ffff01ff088080ff0180ffff04ffff01ffffffff4602ff3304ffff0101ff02ffff02ffff03ff05ffff01ff02ff5cffff04ff02ffff04ff0dffff04ffff0bff2cffff0bff24ff3880ffff0bff2cffff0bff2cffff0bff24ff3480ff0980ffff0bff2cff0bffff0bff24ff8080808080ff8080808080ffff010b80ff0180ff02ffff03ff0bffff01ff02ff32ffff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ffff02ff2affff04ff02ffff04ffff02ffff03ffff09ff23ff2880ffff0181b3ff8080ff0180ff80808080ff80808080808080ffff01ff02ffff03ff17ff80ffff01ff088080ff018080ff0180ffffffff0bffff0bff17ffff02ff3affff04ff02ffff04ff09ffff04ff2fffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ff5f80ff0bff81bf80ff02ffff03ffff20ffff22ff4fff178080ffff01ff02ff7effff04ff02ffff04ff6fffff04ffff04ffff02ffff03ff4fffff01ff04ff23ffff04ffff02ff3affff04ff02ffff04ff09ffff04ff53ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff81b3ff80808080ffff011380ff0180ffff02ff7cffff04ff02ffff04ff05ffff04ff1bffff04ffff21ff4fff1780ff80808080808080ff8080808080ffff01ff088080ff0180ffff04ffff09ffff18ff05ffff010180ffff010180ffff09ff05ffff01818f8080ff0bff2cffff0bff24ff3080ffff0bff2cffff0bff2cffff0bff24ff3480ff0580ffff0bff2cffff02ff5cffff04ff02ffff04ff07ffff04ffff0bff24ff2480ff8080808080ffff0bff24ff8080808080ffffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff26ffff04ff02ffff04ff09ff80808080ffff02ff26ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ff5effff04ff02ffff04ff05ffff04ff0bffff04ffff02ff3affff04ff02ffff04ff09ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfff80808080808080808080ffff04ffff04ff20ffff04ff17ff808080ffff02ff7cffff04ff02ffff04ff05ffff04ffff02ff82017fffff04ffff04ffff04ff17ff2f80ffff04ffff04ff5fff81bf80ffff04ff0bff05808080ff8202ff8080ffff01ff80808080808080ffff02ff2effff04ff02ffff04ff05ffff04ff0bffff04ffff02ffff03ff3bffff01ff02ff22ffff04ff02ffff04ff05ffff04ff17ffff04ff13ffff04ff2bffff04ff5bffff04ff5fff808080808080808080ffff01ff02ffff03ffff09ff15ffff0bff13ff1dff2b8080ffff01ff0bff15ff17ff5f80ffff01ff088080ff018080ff0180ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfffff04ff82017fff8080808080808080808080ff02ffff03ff05ffff011bffff010b80ff0180ff018080ffff04ffff01ffa024e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fdffa00204c3fa6d0aa0013bf1568de47d6793971c0563fbfce1fb53aaa96463f9f836a0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff8202ffffff01ff02ff16ffff04ff02ffff04ff05ffff04ff8204bfffff04ff8206bfffff04ff82017fffff04ffff0bffff19ff2fffff18ffff019100ffffffffffffffffffffffffffffffffff8202ff8080ff0bff82017f80ff8080808080808080ffff01ff04ffff04ff08ffff04ff17ffff04ffff02ff1effff04ff02ffff04ff82017fff80808080ff80808080ffff04ffff04ff1cffff04ff5fffff04ff8206bfff80808080ff80808080ff0180ffff04ffff01ffff32ff3d33ff3effff04ffff04ff1cffff04ff0bffff04ff17ff80808080ffff04ffff04ff1cffff04ff05ffff04ff2fff80808080ffff04ffff04ff0affff04ff5fff808080ffff04ffff04ff14ffff04ffff0bff5fffff012480ff808080ff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01a096374f9c598bc05bed00a40b7a2f13f871c6e00701beecdb38887a119754d0d4ffff04ffff01a0b767d71ade318d803d31a4b26e8e285df2dcbdc97dd09f94059decaa3e8f5231ffff04ffff01b0b198b7362cd8c1717f697cfb190fb28bc5f8a3ec895dd679d515ba27c6f69267d5253d72ec3d134c88063ecf28954d33ffff04ffff01a0117816bf8f01cfea414140de5dae222300000000000000000000000000000000ffff04ffff01a05cbbf88de046849f9dd93eef87f2eb7a5bbffc43c872ded0807ddb2a46d12371ff01808080808080ff01808080ff01ffffffa01e65afd67f3e80ad05e8541f681201dca9e607b46fd0d5aabbe2379d1a08e31fffa0746b376c60d1215ff3dd864c479b29ad161382b480216095f22d05da4b891d3bff0180ff01ffff8601977420dc00ff8306764b808080ffffa0117816bf8f01cfea414140de5dae22230000000000000000000000000006764bffff02ffff01ff02ffff01ff02ffff03ff82017fffff01ff04ffff04ff38ffff04ffff0bffff02ff2effff04ff02ffff04ff05ffff04ff81bfffff04ffff02ff3effff04ff02ffff04ffff04ff05ffff04ff0bff178080ff80808080ff808080808080ff82017f80ff808080ffff04ffff04ff3cffff01ff248080ffff04ffff04ff28ffff04ff82017fff808080ff80808080ffff01ff04ffff04ff24ffff04ff2fff808080ffff04ffff04ff2cffff04ff5fffff04ff81bfff80808080ffff04ffff04ff10ffff04ff81bfff808080ff8080808080ff0180ffff04ffff01ffffff49ff463fffff5002ff333cffff04ff0101ffff02ff02ffff03ff05ffff01ff02ff36ffff04ff02ffff04ff0dffff04ffff0bff26ffff0bff2aff1280ffff0bff26ffff0bff26ffff0bff2aff3a80ff0980ffff0bff26ff0bffff0bff2aff8080808080ff8080808080ffff010b80ff0180ffff0bff26ffff0bff2aff3480ffff0bff26ffff0bff26ffff0bff2aff3a80ff0580ffff0bff26ffff02ff36ffff04ff02ffff04ff07ffff04ffff0bff2aff2a80ff8080808080ffff0bff2aff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ff09ff80808080ffff02ff3effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01a024e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fdffff04ffff01a00204c3fa6d0aa0013bf1568de47d6793971c0563fbfce1fb53aaa96463f9f836ffff04ffff01a0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff0183093a80ffff04ffff01a049ac71c68bfffbc8d68a9a5e48779db990c6d8d9688a8a554ebb17dda1b067e6ff01808080808080ff8601977420dc00ffffa0746b376c60d1215ff3dd864c479b29ad161382b480216095f22d05da4b891d3bffa05e4a33e1ac344f9b050540c635042afc7fa74781f9e9985da091363f6df2e99f8080ffffa020e4dc47dfc8c5699f31d1ede0a462c04da53d865e97a3a83e675a40ab268484ffff02ffff01ff02ffff01ff02ffff03ffff18ff2fffff010180ffff01ff02ff36ffff04ff02ffff04ff05ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff0bff80808080ffff04ff2fffff04ff0bffff04ff5fff808080808080808080ffff01ff088080ff0180ffff04ffff01ffffffff4602ff3304ffff0101ff02ffff02ffff03ff05ffff01ff02ff5cffff04ff02ffff04ff0dffff04ffff0bff2cffff0bff24ff3880ffff0bff2cffff0bff2cffff0bff24ff3480ff0980ffff0bff2cff0bffff0bff24ff8080808080ff8080808080ffff010b80ff0180ff02ffff03ff0bffff01ff02ff32ffff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ffff02ff2affff04ff02ffff04ffff02ffff03ffff09ff23ff2880ffff0181b3ff8080ff0180ff80808080ff80808080808080ffff01ff02ffff03ff17ff80ffff01ff088080ff018080ff0180ffffffff0bffff0bff17ffff02ff3affff04ff02ffff04ff09ffff04ff2fffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ff5f80ff0bff81bf80ff02ffff03ffff20ffff22ff4fff178080ffff01ff02ff7effff04ff02ffff04ff6fffff04ffff04ffff02ffff03ff4fffff01ff04ff23ffff04ffff02ff3affff04ff02ffff04ff09ffff04ff53ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff81b3ff80808080ffff011380ff0180ffff02ff7cffff04ff02ffff04ff05ffff04ff1bffff04ffff21ff4fff1780ff80808080808080ff8080808080ffff01ff088080ff0180ffff04ffff09ffff18ff05ffff010180ffff010180ffff09ff05ffff01818f8080ff0bff2cffff0bff24ff3080ffff0bff2cffff0bff2cffff0bff24ff3480ff0580ffff0bff2cffff02ff5cffff04ff02ffff04ff07ffff04ffff0bff24ff2480ff8080808080ffff0bff24ff8080808080ffffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff26ffff04ff02ffff04ff09ff80808080ffff02ff26ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ff5effff04ff02ffff04ff05ffff04ff0bffff04ffff02ff3affff04ff02ffff04ff09ffff04ff17ffff04ffff02ff26ffff04ff02ffff04ff05ff80808080ff808080808080ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfff80808080808080808080ffff04ffff04ff20ffff04ff17ff808080ffff02ff7cffff04ff02ffff04ff05ffff04ffff02ff82017fffff04ffff04ffff04ff17ff2f80ffff04ffff04ff5fff81bf80ffff04ff0bff05808080ff8202ff8080ffff01ff80808080808080ffff02ff2effff04ff02ffff04ff05ffff04ff0bffff04ffff02ffff03ff3bffff01ff02ff22ffff04ff02ffff04ff05ffff04ff17ffff04ff13ffff04ff2bffff04ff5bffff04ff5fff808080808080808080ffff01ff02ffff03ffff09ff15ffff0bff13ff1dff2b8080ffff01ff0bff15ff17ff5f80ffff01ff088080ff018080ff0180ffff04ff17ffff04ff2fffff04ff5fffff04ff81bfffff04ff82017fff8080808080808080808080ff02ffff03ff05ffff011bffff010b80ff0180ff018080ffff04ffff01ffa024e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fdffa0d1871e4274e57f28c93db73808e72015c97ecdd10cc026a48db1a8bf3fa1c574a0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff8202ffffff01ff02ff16ffff04ff02ffff04ff05ffff04ff8204bfffff04ff8206bfffff04ff82017fffff04ffff0bffff19ff2fffff18ffff019100ffffffffffffffffffffffffffffffffff8202ff8080ff0bff82017f80ff8080808080808080ffff01ff04ffff04ff08ffff04ff17ffff04ffff02ff1effff04ff02ffff04ff82017fff80808080ff80808080ffff04ffff04ff1cffff04ff5fffff04ff8206bfff80808080ff80808080ff0180ffff04ffff01ffff32ff3d33ff3effff04ffff04ff1cffff04ff0bffff04ff17ff80808080ffff04ffff04ff1cffff04ff05ffff04ff2fff80808080ffff04ffff04ff0affff04ff5fff808080ffff04ffff04ff14ffff04ffff0bff5fffff012480ff808080ff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01a061f3d00aa0824a3cf1794421175847098be82e944d9924f6293a56dfe98e82c8ffff04ffff01a0f145fb281fc62a94a5885dee1adf2355a182ceef4aab4eeeff2a4d836853c087ffff04ffff01b0a962a3d4d63044aceba4cb81d4cdc9d3df2bbbbbb21ca16ff3e76efdda9c0c095f03ce9b70a7f5279b40292e4ab162b3ffff04ffff01a0117816bf8f01cfea414140de5dae222300000000000000000000000000000000ffff04ffff01a00716889714d58c51c645aa7f48b70ba0eafa96728550019b3be948877243b274ff01808080808080ff01808080ff01ffffffa08fb21ebc02156c85ba3aef7a844a8b3d45185f4fecd3fe9a9aca7dcd9b4c697cffa01303897ea4e4a9804dc46b24de24ece6a03f2e41a04b511732712870f2a72002ff0180ff01ffff8601977420dc00ff83067636808080ffffa0117816bf8f01cfea414140de5dae222300000000000000000000000000067636ffff02ffff01ff02ffff01ff02ffff03ff82017fffff01ff04ffff04ff38ffff04ffff0bffff02ff2effff04ff02ffff04ff05ffff04ff81bfffff04ffff02ff3effff04ff02ffff04ffff04ff05ffff04ff0bff178080ff80808080ff808080808080ff82017f80ff808080ffff04ffff04ff3cffff01ff248080ffff04ffff04ff28ffff04ff82017fff808080ff80808080ffff01ff04ffff04ff24ffff04ff2fff808080ffff04ffff04ff2cffff04ff5fffff04ff81bfff80808080ffff04ffff04ff10ffff04ff81bfff808080ff8080808080ff0180ffff04ffff01ffffff49ff463fffff5002ff333cffff04ff0101ffff02ff02ffff03ff05ffff01ff02ff36ffff04ff02ffff04ff0dffff04ffff0bff26ffff0bff2aff1280ffff0bff26ffff0bff26ffff0bff2aff3a80ff0980ffff0bff26ff0bffff0bff2aff8080808080ff8080808080ffff010b80ff0180ffff0bff26ffff0bff2aff3480ffff0bff26ffff0bff26ffff0bff2aff3a80ff0580ffff0bff26ffff02ff36ffff04ff02ffff04ff07ffff04ffff0bff2aff2a80ff8080808080ffff0bff2aff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ff09ff80808080ffff02ff3effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01a024e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fdffff04ffff01a0d1871e4274e57f28c93db73808e72015c97ecdd10cc026a48db1a8bf3fa1c574ffff04ffff01a0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff0183093a80ffff04ffff01a0fc77f2e8a5c7eb2d0f1ddfb4d8323506e3ed4f1f4855dbabf360002cc1f6c877ff01808080808080ff8601977420dc00ffffa01303897ea4e4a9804dc46b24de24ece6a03f2e41a04b511732712870f2a72002ffa055a2c3da424783848125f4aca00dbdb408a956feddf4d5826aea2030a4b6b92a80808080", + "transactions_generator_ref_list": [], + "transactions_info": { + "aggregated_signature": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "cost": 124119494, + "fees": 0, + "generator_refs_root": "0x0101010101010101010101010101010101010101010101010101010101010101", + "generator_root": "0x9a927827544d11ba162d14710381ce36cdcbe80b33a8db78a2f9805221754cd1", + "reward_claims_incorporated": [ + { + "amount": 1750000000000, + "parent_coin_info": "0x117816bf8f01cfea414140de5dae222300000000000000000000000000067657", + "puzzle_hash": "0xe3ff0bfb9fbc3dff1d6025a2a01271de9fb6caae06242836c01aa18427869d5f" + }, + { + "amount": 250000000000, + "parent_coin_info": "0xb00361a396177a9cb410ff61f20015af00000000000000000000000000067657", + "puzzle_hash": "0x20e699a102a00097d692e74d8bc04be15955a21e98829f2220170d900ffa8db4" + }, + { + "amount": 1750000000000, + "parent_coin_info": "0x117816bf8f01cfea414140de5dae222300000000000000000000000000067656", + "puzzle_hash": "0x2531cfef6d60de8f92add9b718d05b472c4ff66944a79d4948c6d0316e405d2c" + }, + { + "amount": 250000000000, + "parent_coin_info": "0xb00361a396177a9cb410ff61f20015af00000000000000000000000000067656", + "puzzle_hash": "0x2531cfef6d60de8f92add9b718d05b472c4ff66944a79d4948c6d0316e405d2c" + }, + { + "amount": 1750000000000, + "parent_coin_info": "0x117816bf8f01cfea414140de5dae222300000000000000000000000000067655", + "puzzle_hash": "0x2531cfef6d60de8f92add9b718d05b472c4ff66944a79d4948c6d0316e405d2c" + }, + { + "amount": 250000000000, + "parent_coin_info": "0xb00361a396177a9cb410ff61f20015af00000000000000000000000000067655", + "puzzle_hash": "0x2531cfef6d60de8f92add9b718d05b472c4ff66944a79d4948c6d0316e405d2c" + }, + { + "amount": 1750000000000, + "parent_coin_info": "0x117816bf8f01cfea414140de5dae222300000000000000000000000000067654", + "puzzle_hash": "0x2531cfef6d60de8f92add9b718d05b472c4ff66944a79d4948c6d0316e405d2c" + }, + { + "amount": 250000000000, + "parent_coin_info": "0xb00361a396177a9cb410ff61f20015af00000000000000000000000000067654", + "puzzle_hash": "0x2531cfef6d60de8f92add9b718d05b472c4ff66944a79d4948c6d0316e405d2c" + }, + { + "amount": 1750000000000, + "parent_coin_info": "0x117816bf8f01cfea414140de5dae222300000000000000000000000000067653", + "puzzle_hash": "0x2531cfef6d60de8f92add9b718d05b472c4ff66944a79d4948c6d0316e405d2c" + }, + { + "amount": 250000000000, + "parent_coin_info": "0xb00361a396177a9cb410ff61f20015af00000000000000000000000000067653", + "puzzle_hash": "0x2531cfef6d60de8f92add9b718d05b472c4ff66944a79d4948c6d0316e405d2c" + } + ] + } + } \ No newline at end of file diff --git a/src/chia-dotnet.tests/chia-dotnet.tests.csproj b/src/chia-dotnet.tests/chia-dotnet.tests.csproj index 3d5f5d12..1201919f 100644 --- a/src/chia-dotnet.tests/chia-dotnet.tests.csproj +++ b/src/chia-dotnet.tests/chia-dotnet.tests.csproj @@ -12,7 +12,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -23,9 +23,18 @@ + + Always + Always + + Always + + + Always + diff --git a/src/chia-dotnet.tests/mempoolItem.json b/src/chia-dotnet.tests/mempoolItem.json new file mode 100644 index 00000000..935159a0 --- /dev/null +++ b/src/chia-dotnet.tests/mempoolItem.json @@ -0,0 +1,152 @@ +{ + "additions": [ + { + "amount": 1, + "parent_coin_info": "0xd2ab06f9568607ea6a6f66b8c81095f9685656d3ea789cf51f6ffa401bba3473", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + }, + { + "amount": 74287139999, + "parent_coin_info": "0xd2ab06f9568607ea6a6f66b8c81095f9685656d3ea789cf51f6ffa401bba3473", + "puzzle_hash": "0xd75218ea0c13ec4ee82e010b73565afd344df8d6da3d34deb99a0f80dc4ab379" + }, + { + "amount": 1, + "parent_coin_info": "0x6bfd185c1bea08bad84959d3f6cc1b36f98afd0d42cf42bcc2448aa5793de5ef", + "puzzle_hash": "0x765a83f74b471e181019916f8beb682218243dacafbb398b141f08d7647fa219" + } + ], + "cost": 18439459, + "fee": 0, + "npc_result": { + "clvm_cost": 727459, + "error": null, + "npc_list": [ + { + "coin_name": "0xd2ab06f9568607ea6a6f66b8c81095f9685656d3ea789cf51f6ffa401bba3473", + "conditions": [ + [ + "0x32", + [ + { + "opcode": "AGG_SIG_ME", + "vars": [ + "0xad6f7bb6d3f43c69907de17a0812941ca94eee83e3f781dc99ebf75cba691cd1ede0011a9bc001a998969b7489364535", + "0x0faa40fc4eb5264897515dc42c88a5c81db10e10528610b74e32d2f3ae654d6b" + ] + } + ] + ], + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9", + "0x01" + ] + }, + { + "opcode": "CREATE_COIN", + "vars": [ + "0xd75218ea0c13ec4ee82e010b73565afd344df8d6da3d34deb99a0f80dc4ab379", + "0x114bdbcc9f" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x3a5e61f3f49096edb6a67f258bf26c7d9025795f70584fb83fd0ac98ca2c7fa3" + ] + } + ] + ], + [ + "0x3d", + [ + { + "opcode": "ASSERT_COIN_ANNOUNCEMENT", + "vars": [ + "0x5bb3487e221455e7b797fb9c6f75d01f8b2d79491c5a05be9be6f1fd17af8b32" + ] + } + ] + ] + ], + "puzzle_hash": "0x227b8b65f272c5ac7559b29fdf30fc95e627d0ab342b9ca5377c5db0fe12ade0" + }, + { + "coin_name": "0x6bfd185c1bea08bad84959d3f6cc1b36f98afd0d42cf42bcc2448aa5793de5ef", + "conditions": [ + [ + "0x33", + [ + { + "opcode": "CREATE_COIN", + "vars": [ + "0x765a83f74b471e181019916f8beb682218243dacafbb398b141f08d7647fa219", + "0x01" + ] + } + ] + ], + [ + "0x3c", + [ + { + "opcode": "CREATE_COIN_ANNOUNCEMENT", + "vars": [ + "0x68cf159df856e92f70d298bbf62c7d5db51ac3fcfa76e2a64b61b1d93e427bb4" + ] + } + ] + ] + ], + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + } + ] + }, + "program": "0xff01ffffffa051f22a1500d7d218193ae6510b6185ace2467ddeac60ad787982fe5b52829669ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0ad6f7bb6d3f43c69907de17a0812941ca94eee83e3f781dc99ebf75cba691cd1ede0011a9bc001a998969b7489364535ff018080ff85114bdbcca0ffff80ffff01ffff33ffa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ff0180ffff33ffa0d75218ea0c13ec4ee82e010b73565afd344df8d6da3d34deb99a0f80dc4ab379ff85114bdbcc9f80ffff3cffa03a5e61f3f49096edb6a67f258bf26c7d9025795f70584fb83fd0ac98ca2c7fa380ffff3dffa05bb3487e221455e7b797fb9c6f75d01f8b2d79491c5a05be9be6f1fd17af8b328080ff808080ffffa0d2ab06f9568607ea6a6f66b8c81095f9685656d3ea789cf51f6ffa401bba3473ffff02ffff01ff04ffff04ff04ffff04ff05ffff04ff0bff80808080ffff04ffff04ff0affff04ffff02ff0effff04ff02ffff04ffff04ff05ffff04ff0bffff04ff17ff80808080ff80808080ff808080ff808080ffff04ffff01ff33ff3cff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ff09ff80808080ffff02ff0effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ff01ffffa0765a83f74b471e181019916f8beb682218243dacafbb398b141f08d7647fa219ff01ffffff70c07101032f2c9ba1b2315d413a92b5f034fa03282ccba1767fd9ae7b14d942b969ed5d578c3039a323611ddf48cc01e44395246c3139fda5b55b36367a83861dda4d44d3c3179d2edef746ac6f441b8790c2983d010000001668747470733a2f2f6575312e706f6f6c2e737061636500000040ffff7483093a80ffff68a0c93e53a35ce7aa338dbcf29af43f48acdd5f8b4109d000ead2ca593a6d42ffbf8080808080", + "removals": [ + { + "amount": 74287140000, + "parent_coin_info": "0x51f22a1500d7d218193ae6510b6185ace2467ddeac60ad787982fe5b52829669", + "puzzle_hash": "0x227b8b65f272c5ac7559b29fdf30fc95e627d0ab342b9ca5377c5db0fe12ade0" + }, + { + "amount": 1, + "parent_coin_info": "0xd2ab06f9568607ea6a6f66b8c81095f9685656d3ea789cf51f6ffa401bba3473", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + } + ], + "spend_bundle": { + "aggregated_signature": "0xa411479d4b2e2d3f6b83fe29644c27f16d9b8740ce8b665ddb2366a748ce7a2f58f6fdfe9671c33f615e30d3b152a5dd0bc9ee29160e8e00e2d01aa9094a3abc8abb1e667eb27557dc10889a50e417b740619a178377c3f099151ae6e79e5f83", + "coin_spends": [ + { + "coin": { + "amount": 74287140000, + "parent_coin_info": "0x51f22a1500d7d218193ae6510b6185ace2467ddeac60ad787982fe5b52829669", + "puzzle_hash": "0x227b8b65f272c5ac7559b29fdf30fc95e627d0ab342b9ca5377c5db0fe12ade0" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0ad6f7bb6d3f43c69907de17a0812941ca94eee83e3f781dc99ebf75cba691cd1ede0011a9bc001a998969b7489364535ff018080", + "solution": "0xff80ffff01ffff33ffa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ff0180ffff33ffa0d75218ea0c13ec4ee82e010b73565afd344df8d6da3d34deb99a0f80dc4ab379ff85114bdbcc9f80ffff3cffa03a5e61f3f49096edb6a67f258bf26c7d9025795f70584fb83fd0ac98ca2c7fa380ffff3dffa05bb3487e221455e7b797fb9c6f75d01f8b2d79491c5a05be9be6f1fd17af8b328080ff8080" + }, + { + "coin": { + "amount": 1, + "parent_coin_info": "0xd2ab06f9568607ea6a6f66b8c81095f9685656d3ea789cf51f6ffa401bba3473", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + }, + "puzzle_reveal": "0xff02ffff01ff04ffff04ff04ffff04ff05ffff04ff0bff80808080ffff04ffff04ff0affff04ffff02ff0effff04ff02ffff04ffff04ff05ffff04ff0bffff04ff17ff80808080ff80808080ff808080ff808080ffff04ffff01ff33ff3cff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ff09ff80808080ffff02ff0effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080", + "solution": "0xffa0765a83f74b471e181019916f8beb682218243dacafbb398b141f08d7647fa219ff01ffffff70c07101032f2c9ba1b2315d413a92b5f034fa03282ccba1767fd9ae7b14d942b969ed5d578c3039a323611ddf48cc01e44395246c3139fda5b55b36367a83861dda4d44d3c3179d2edef746ac6f441b8790c2983d010000001668747470733a2f2f6575312e706f6f6c2e737061636500000040ffff7483093a80ffff68a0c93e53a35ce7aa338dbcf29af43f48acdd5f8b4109d000ead2ca593a6d42ffbf8080" + } + ] + }, + "spend_bundle_name": "0x05613d723b1090797235b9a1f40cd0c60e1c547e2ff9fef05d5f9feaa862b4e8" +} \ No newline at end of file diff --git a/src/chia-dotnet.tests/signagepoint.json b/src/chia-dotnet.tests/signagepoint.json new file mode 100644 index 00000000..dc3efa3e --- /dev/null +++ b/src/chia-dotnet.tests/signagepoint.json @@ -0,0 +1,29 @@ +({ + { + "cc_proof": { + "normalized_to_identity": false, + "witness": "0x01000bf0ff007e2a9ff004ba8049fba77cedffb801f3be36da9444c74ffb92fba092665ee657c63c48388228e90cace9de62a7307e402f91d77bf9f441dd1cbf28508021e7d09c73d7f8ae9d1ce2219a1069c1607311009dfafa695672829359dc6c01000000000000330fe0b1a89b67e0c6a03c5a07233e103e49bce71704ea9f844cd240aca7db965237c30d0200cc298ec0b707ea3b937ded7e12ce1795474f69f390f683cc38013a448f58a6ba45278fc966d140788237aff509738405057044563fb8ac8e29bf7da06c541a4fcfe7dae2002a5d57db7643624a06f02d81085c52130d63f42737ffe8eb6b492d01000000000000992fa0e525e626d540de4ff673f73d7ee10df68e52abe36d3e007b765ff1c0ebd991ae8f0200d46af2f93f02dea2c953bd053800e21de14889d29a1ffef8efd31cceb2c52daf109ae2ca152109d349bc1c4b5d94b7a3bf2a86ccf92c0ed68794ecef89039f2d851b17a9ffa2ed981b0e740661e6d93ca77d5db2a52ca18376d9eb594f86955f0100", + "witness_type": 2 + }, + "cc_vdf": { + "challenge": "0x71dd0e3af3cdef2a21bd8a29858e2fcf263a414c4eddd9aed0305fcc45bb62aa", + "number_of_iterations": 38928384, + "output": { + "data": "0x030020a149eb8193685df9cf5a8fb351af15b5acb00bec7e65b94a8ea36e894b2332c1db6cb42c3a89607cae0a586ae0a55830d3f1e3787ce28164dcbc93cf4db249d73a886d8e474e66cfdb2dac5fef2de75226dac310f94826c0f114aabbb943100100" + } + }, + "rc_proof": { + "normalized_to_identity": false, + "witness": "0x0300ee238655a503a4f9530d74c72569371bea71bf8e403ce7d272bdaf23c5db1e50024f7b9b29a7f22e3e7af948a8a7016405a535794e03fe32adc8ca09279935346565f6f8cc93eb0afcc4b25714b1707eb5f6d759bc4dd92ccc9bd50469b35c1d01000000000000330fe0dd3e710f276ac72cc4ce4c827a1c481f65a8720718aa0c1d1e0192678c66403c3503002c1bfdc7bafb2c3318f6d26f608a940faacbfc0ae81d6c44cd5d17d0adf6435245a160a5c98d68f36c471082a9996f35825acac6ff353aad707ae8bd5552043cb98711d45341cbdb0ba9f5f352bbb7ab3beed2317c9634e394b010f34b72ca1e01000000000000992fa0cd4e6aec7f11e6babaa8a37d9233cfc809f3d5a623dfb2a0e355a61f3e313ccd9103008e6f2f2f8de6e1d28a09c85649b96b634e731abfee26a5fdf041653b07d01131f655701b3c0c0c330094769b4836024cf2e6c4ab6cc6675289478902580d1a104f86994fd35a63717e7335a7ab84a9b0262a891bc45bc3c21dc41a327681a31c0100", + "witness_type": 2 + }, + "rc_vdf": { + "challenge": "0x2b5b53fe9657524b717239767e43c82f4353569f10cfa3654e8c871b7688ff67", + "number_of_iterations": 15058895, + "output": { + "data": "0x03006f57613307250930e6d1623c828c9b5ff4482980264e39df57f504705aaeb2b92675a54f48fd2c40623b529a1989030728e0238f752d9893f3b8358a9c16182aad4ab9e8f3fb0763149f50a09a8869dc3e2854b7d67b1cd6abf2bf8d6639ec340100" + } + } + } +}, +1628547596.9924006, false) \ No newline at end of file diff --git a/src/chia-dotnet.tests/transaction.json b/src/chia-dotnet.tests/transaction.json new file mode 100644 index 00000000..da8f55f9 --- /dev/null +++ b/src/chia-dotnet.tests/transaction.json @@ -0,0 +1,73 @@ +{ + "additions": [ + { + "amount": 1, + "parent_coin_info": "0x181503704c9022d7677ccd62d8f9de469975fd1e07c35739c6a071ef1f1982cf", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + }, + { + "amount": 230999799, + "parent_coin_info": "0x181503704c9022d7677ccd62d8f9de469975fd1e07c35739c6a071ef1f1982cf", + "puzzle_hash": "0x3094ede18241a513ddc62a1c46adb75c815e026a4e1e4489c9c7e3a6c3c2210c" + }, + { + "amount": 1, + "parent_coin_info": "0xf6e7ec32ce3880a2c81fb50ef656fc7ea65c267e27a37e7f8ce0802da45182e0", + "puzzle_hash": "0xbf49c26c778e453d6ea3ca59ffd852a06008bbc78c4b59378664cb7585795559" + } + ], + "amount": 1, + "confirmed": true, + "confirmed_at_height": 158877, + "created_at_time": 1625751356, + "fee_amount": 0, + "name": "0x47be9c74c902d075562ca6b9f873386d30516eb6a698afc5067bf2f4f1b9b1d3", + "removals": [ + { + "amount": 230999800, + "parent_coin_info": "0x205aa1b622a8b92166ca3358b48e94e2e89d61be09c6a2628011d3ea95764f09", + "puzzle_hash": "0xfc3a5b77d73c300ed0a32e903192e995ca9689dce14b5339303e78608575953f" + }, + { + "amount": 1, + "parent_coin_info": "0x181503704c9022d7677ccd62d8f9de469975fd1e07c35739c6a071ef1f1982cf", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + } + ], + "sent": 1, + "sent_to": [ + [ + "d8fe46e8ad01a40702c27f279248d3b69a1508caca9003292525a84a3105da03", + 1, + null + ] + ], + "spend_bundle": { + "aggregated_signature": "0x85473f130853be21cbbe68f2ea7b4bc48810105b83d290bff457bf694aa0cccfd55251d10dd55806173f32e229376d9518e8fdbb35c0aea370aeda905a733022b7ac91e25c5eb7504dd7e4b08b9f16ff5867ae254f01faac42f6e296c9e50f03", + "coin_spends": [ + { + "coin": { + "amount": 230999800, + "parent_coin_info": "0x205aa1b622a8b92166ca3358b48e94e2e89d61be09c6a2628011d3ea95764f09", + "puzzle_hash": "0xfc3a5b77d73c300ed0a32e903192e995ca9689dce14b5339303e78608575953f" + }, + "puzzle_reveal": "0xff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b08bea098fcf5af8c336335a1e5e35700913f204b4ffa32415fa2280468d2be0730bf0e49e5bd3c9ea3decda914bfea483ff018080", + "solution": "0xff80ffff01ffff33ffa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ff0180ffff33ffa03094ede18241a513ddc62a1c46adb75c815e026a4e1e4489c9c7e3a6c3c2210cff840dc4c6f780ffff3cffa003f573fa169fff5081b56f3963e5d35d561987acd65ec4a6e2c8bef22f41554280ffff3dffa02ca578d7cfa49a7799c9afc83862c0272c01a5f859e479317e7bf818b716ff138080ff8080" + }, + { + "coin": { + "amount": 1, + "parent_coin_info": "0x181503704c9022d7677ccd62d8f9de469975fd1e07c35739c6a071ef1f1982cf", + "puzzle_hash": "0xeff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9" + }, + "puzzle_reveal": "0xff02ffff01ff04ffff04ff04ffff04ff05ffff04ff0bff80808080ffff04ffff04ff0affff04ffff02ff0effff04ff02ffff04ffff04ff05ffff04ff0bffff04ff17ff80808080ff80808080ff808080ff808080ffff04ffff01ff33ff3cff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ff09ff80808080ffff02ff0effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080", + "solution": "0xffa0bf49c26c778e453d6ea3ca59ffd852a06008bbc78c4b59378664cb7585795559ff01ffffff70c07101032f2c9ba1b2315d413a92b5f034fa03282ccba1767fd9ae7b14d942b969ed5d57b6a4265a7e9dd23272668ef3768853790bd2a5deac6f76db2b110898dcbab6ac302eeb735435fc5ea4488943b7288e76010000001668747470733a2f2f6e61312e706f6f6c2e737061636500000040ffff7483093a80ffff68a030a3c5434e9e6c14ab452f2226f03561a3c99d0d72a5ef9a61cea6b1b0542f5a8080" + } + ] + }, + "to_address": "txch1hayuymrh3ezn6m4refvllkzj5psq3w783394jduxvn9htpte24vss7z2hf", + "to_puzzle_hash": "0xbf49c26c778e453d6ea3ca59ffd852a06008bbc78c4b59378664cb7585795559", + "trade_id": null, + "type": 1, + "wallet_id": 1 +} \ No newline at end of file diff --git a/src/chia-dotnet/AssemblyInfo.cs b/src/chia-dotnet/AssemblyInfo.cs new file mode 100644 index 00000000..ad8f0347 --- /dev/null +++ b/src/chia-dotnet/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("chia-dotnet.tests")] diff --git a/src/chia-dotnet/ChiaTypes/BlockRecord.cs b/src/chia-dotnet/ChiaTypes/BlockRecord.cs new file mode 100644 index 00000000..e573bd2b --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/BlockRecord.cs @@ -0,0 +1,126 @@ +using System; +using System.Numerics; +using System.Collections.Generic; + +namespace chia.dotnet +{ + public record SubEpochSummary + { + public string PrevSubepochSummaryHash { get; init; } + /// + /// hash of reward chain at end of last segment + /// + public string RewardChainHash { get; init; } + /// + /// How many more blocks than 384*(N-1) + /// + public byte NumBlocksOverflow { get; init; } + /// + /// Only once per epoch (diff adjustment) + /// + public ulong? NewDifficulty { get; init; } + /// + /// Only once per epoch (diff adjustment) + /// + public ulong? NewSubSlotIters { get; init; } + } + + public record VdfOutput + { + public string Data { get; init; } + } + + /// + /// This class is not included or hashed into the blockchain, but it is kept in memory as a more + /// efficient way to maintain data about the blockchain. This allows us to validate future blocks, + /// difficulty adjustments, etc, without saving the whole header block in memory. + /// + public record BlockRecord + { + /// + /// Hash of challenge chain data, used to validate end of slots in the future + /// + public string ChallengeBlockInfoHash { get; init; } + /// + /// This is the intermediary VDF output at ip_iters in challenge chain + /// + public VdfOutput ChallengeVdfOutput { get; init; } + /// + /// A deficit of 16 is an overflow block after an infusion. Deficit of 15 is a challenge block + /// + public byte Deficit { get; init; } + public string FarmerPuzzleHash { get; init; } + /// + /// Transaction block (present iff is_transaction_block) + /// + public ulong? Fees { get; init; } + /// + /// Slot (present iff this is the first SB in sub slot) + /// + public ICollection FinishedChallengeSlotHashes { get; init; } + /// + /// Slot (present iff this is the first SB in sub slot) + /// + public ICollection FinishedInfusedChallengeSlotHashes { get; init; } + /// + /// Slot (present iff this is the first SB in sub slot) + /// + public ICollection FinishedRewardSlotHashes { get; init; } + public string HeaderHash { get; init; } + public uint Height { get; init; } + /// + /// This is the intermediary VDF output at ip_iters in infused cc, if deficit less than or equal to 3 + /// + public VdfOutput InfusedChallengeVdfOutput { get; init; } + public bool Overflow { get; init; } + /// + /// Need to keep track of these because Coins are created in a future block + /// + public string PoolPuzzleHash { get; init; } + /// + /// Header hash of the previous block + /// Transaction block (present iff is_transaction_block) + /// + public string PrevHash { get; init; } + /// + /// Header hash of the previous transaction block + /// + public string PrevTransactionBlockHash { get; init; } + public uint PrevTransactionBlockHeight { get; init; } + /// + /// The number of iters required for this proof of space + /// + public ulong RequiredIters { get; init; } + /// + /// Transaction block (present iff is_transaction_block) + /// + public ICollection RewardClaimsIncorporated { get; init; } + /// + /// The reward chain infusion output, input to next VDF + /// + public string RewardInfusionNewChallenge { get; init; } + public byte SignagePointIndex { get; init; } + /// + /// Sub-epoch (present iff this is the first SB after sub-epoch) + /// + public SubEpochSummary SubEpochSummaryIncluded { get; init; } + /// + /// Current network sub_slot_iters parameter + /// + public ulong SubSlotIters { get; init; } + /// + /// Transaction block (present iff is_transaction_block) + /// + public ulong? Timestamp { get; init; } + /// + /// Total number of VDF iterations since genesis, including this block + /// + public BigInteger TotalIters { get; init; } + /// + /// Total cumulative difficulty of all ancestor blocks since genesis + /// + public BigInteger Weight { get; init; } + + public DateTime? DateTimestamp => Timestamp.ToDateTime(); + } +} diff --git a/src/chia-dotnet/ChiaTypes/BlockchainState.cs b/src/chia-dotnet/ChiaTypes/BlockchainState.cs new file mode 100644 index 00000000..736cfd61 --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/BlockchainState.cs @@ -0,0 +1,15 @@ +using System.Numerics; + +namespace chia.dotnet +{ + public record BlockchainState + { + public ulong Difficulty { get; init; } + public bool GenesisChallengeInitiated { get; init; } + public int MempoolSize { get; init; } + public BlockRecord Peak { get; init; } + public BigInteger Space { get; init; } + public ulong SubSlotIters { get; init; } + public SyncState Sync { get; init; } + } +} diff --git a/src/chia-dotnet/ChiaTypes/Coin.cs b/src/chia-dotnet/ChiaTypes/Coin.cs new file mode 100644 index 00000000..e8aaad62 --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/Coin.cs @@ -0,0 +1,12 @@ +namespace chia.dotnet +{ + /// + /// This structure is used in the body for the reward and fees genesis coins. + /// + public record Coin + { + public string ParentCoinInfo { get; init; } + public string PuzzleHash { get; init; } + public ulong Amount { get; init; } + } +} diff --git a/src/chia-dotnet/ChiaTypes/CoinRecord.cs b/src/chia-dotnet/ChiaTypes/CoinRecord.cs new file mode 100644 index 00000000..0a265f79 --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/CoinRecord.cs @@ -0,0 +1,25 @@ +using System; + +namespace chia.dotnet +{ + /// + /// These are values that correspond to a CoinName that are used + /// in keeping track of the unspent database. + /// + public record CoinRecord + { + public Coin Coin { get; init; } + public uint ConfirmedBlockIndex { get; init; } + public uint SpentBlockIndex { get; init; } + public bool Spent { get; init; } + public bool Coinbase { get; init; } + /// + /// Timestamp of the block at height confirmed_block_index + /// + public ulong Timestamp { get; init; } + /// + /// Timestamp of the block at height confirmed_block_index + /// + public DateTime? DateTimestamp => Timestamp.ToDateTime(); + } +} diff --git a/src/chia-dotnet/ChiaTypes/ConditionConverter.cs b/src/chia-dotnet/ChiaTypes/ConditionConverter.cs new file mode 100644 index 00000000..5764a9b5 --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/ConditionConverter.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; + +using Newtonsoft.Json; + +namespace chia.dotnet +{ + internal sealed class ConditionConverter : JsonConverter + { + public override Condition ReadJson(JsonReader reader, Type objectType, Condition existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + + var opcode = reader.ReadAsString(); // the opcode is stored without a name (as part of an unnamed tuple (aka array in json)) + _ = reader.Read(); // move ahead to the start of the collection + var args = serializer.Deserialize>(reader); + _ = reader.Read(); + + return new Condition() + { + ConditionOpcode = opcode, + Args = args + }; + } + + public override void WriteJson(JsonWriter writer, Condition value, JsonSerializer serializer) + { + writer.WriteStartArray(); + writer.WriteValue(value.ConditionOpcode); + serializer.Serialize(writer, value.Args); + writer.WriteEndArray(); + } + } +} diff --git a/src/chia-dotnet/ChiaTypes/ConnectionInfo.cs b/src/chia-dotnet/ChiaTypes/ConnectionInfo.cs new file mode 100644 index 00000000..528ee3eb --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/ConnectionInfo.cs @@ -0,0 +1,27 @@ +using System; + +namespace chia.dotnet +{ + /// + /// Chia's representation of a connection from node to node + /// + public record ConnectionInfo + { + public uint? BytesRead { get; init; } + public uint? BytesWritten { get; init; } + public double CreationTime { get; init; } + public double LastMessageTime { get; init; } + public int LocalPort { get; init; } + public string NodeId { get; init; } + public string PeakHash { get; init; } + public ulong? PeakHeight { get; init; } + public ulong? PeakWeight { get; init; } + public string PeerHost { get; init; } + public int PeerPort { get; init; } + public int PeerServerPort { get; init; } + public byte Type { get; init; } + + public DateTime CreationDateTime => CreationTime.ToDateTime(); + public DateTime LastMessageDateTime => LastMessageTime.ToDateTime(); + } +} diff --git a/src/chia-dotnet/ChiaTypes/ErrorResponse.cs b/src/chia-dotnet/ChiaTypes/ErrorResponse.cs new file mode 100644 index 00000000..386ad1b5 --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/ErrorResponse.cs @@ -0,0 +1,11 @@ +namespace chia.dotnet +{ + /// + /// Response in error case for all endpoints of the pool protocol + /// + public record ErrorResponse + { + public ushort ErrorCode { get; init; } + public string ErrorMessage { get; init; } + } +} diff --git a/src/chia-dotnet/ChiaTypes/FarmerSignagePoint.cs b/src/chia-dotnet/ChiaTypes/FarmerSignagePoint.cs new file mode 100644 index 00000000..af25f37c --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/FarmerSignagePoint.cs @@ -0,0 +1,16 @@ +namespace chia.dotnet +{ + /// + /// This type doesn't exist in the chia code but is generated and passed around as a dicitonary + /// (not to be ocnfused with ) + /// + public record FarmerSignagePoint + { + public string ChallengeChainSp { get; init; } + public string ChallengeHash { get; init; } + public ulong Difficulty { get; init; } + public string RewardChainSp { get; init; } + public byte SignagePointIndex { get; init; } + public ulong SubSlotIters { get; init; } + } +} diff --git a/src/chia-dotnet/ChiaTypes/FullBlock.cs b/src/chia-dotnet/ChiaTypes/FullBlock.cs new file mode 100644 index 00000000..f072563d --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/FullBlock.cs @@ -0,0 +1,251 @@ +using System; +using System.Numerics; +using System.Collections.Generic; + +namespace chia.dotnet +{ + /// + /// Represents a classgroup element (a,b,c) where a, b, and c are 512 bit signed integers. However this is using + /// a compressed representation. VDF outputs are a single classgroup element. VDF proofs can also be one classgroup + /// element(or multiple). + /// + public record ClassGroupElement + { + public string Data { get; init; } + } + + public record VDFInfo + { + /// + /// Used to generate the discriminant (VDF group) + /// + public string Challenge { get; init; } + public ulong NumberOfIterations { get; init; } + public ClassGroupElement VdfOutput { get; init; } + } + + public record ChallengeChainSubSlot + { + public VDFInfo ChallengeChainEndOfSlotVdf { get; init; } + /// + /// Only at the end of a slot + /// + public string InfusedChallengeChainSubSlotHash { get; init; } + /// + /// Only once per sub-epoch, and one sub-epoch delayed + /// + public string SubepochSummaryHash { get; init; } + /// + /// Only at the end of epoch, sub-epoch, and slot + /// + public ulong? NewSubSlotIters { get; init; } + /// + /// Only at the end of epoch, sub-epoch, and slot + /// + public ulong? NewDifficulty { get; init; } + } + + public record InfusedChallengeChainSubSlot + { + public VDFInfo InfusedChallengeChainEndOfSlotVdf { get; init; } + } + + public record RewardChainSubSlot + { + public VDFInfo EndOfSlotVdf { get; init; } + public string ChallengeChainSubSlotHash { get; init; } + public string InfusedChallengeChainSubSlotHash { get; init; } + /// + /// 16 or less. usually zero + /// + public byte Deficit { get; init; } + } + + public record VDFProof + { + public byte WitnessType { get; init; } + public string Witness { get; init; } + public bool NormalizedToIdentity { get; init; } + } + + public record SubSlotProofs + { + public VDFProof ChallengeChainSlotProof { get; init; } + public VDFProof InfusedChallengeChainSlotProof { get; init; } + public VDFProof RewardChainSlotProof { get; init; } + } + + public record ProofOfSpace + { + public string Challenge { get; init; } + /// + /// Only one of these two should be present + /// + public string PublicPoolKey { get; init; } + public string PoolContractPuzzleHash { get; init; } + public string PlotPublicKey { get; init; } + public byte Size { get; init; } + public string Proof { get; init; } + } + + public record RewardChainBlock + { + public BigInteger Weight { get; init; } + public uint Height { get; init; } + public BigInteger TotalIters { get; init; } + public byte SignagePointIndex { get; init; } + public string PosSsCcChallengeHash { get; init; } + public ProofOfSpace ProofOfSpace { get; init; } + /// + /// Not present for first sp in slot + /// + public VDFInfo ChallengeChainSpVdf { get; init; } + public string ChallengeChainSpSignature { get; init; } + public VDFInfo ChallengeChainIpVdf { get; init; } + /// + /// Not present for first sp in slot + /// + public VDFInfo RewardChainSpVdf { get; init; } + public string RewardChainSpSignature { get; init; } + public VDFInfo RewardChainIpVdf { get; init; } + /// + /// Iff deficit < 16 + /// + public VDFInfo InfusedChallengeChainIpVdf { get; init; } + public bool IsTransactionBlock { get; init; } + } + + public record PoolTarget + { + public string PuzzleHash { get; init; } + /// + /// A max height of 0 means it is valid forever + /// + public uint MaxHeight { get; init; } + } + + /// + /// Part of the block that is signed by the plot key + /// + public record FoliageBlockData + { + public string UnfinishedRewardBlockHash { get; init; } + public PoolTarget PoolTarget { get; init; } + /// + /// Iff ProofOfSpace has a pool pk + /// + public string PoolSignature { get; init; } + public string FarmerRewardPuzzleHash { get; init; } + /// + /// Used for future updates. Can be any 32 byte value initially + /// + public string ExtensionData { get; init; } + } + + /// + /// The entire foliage block, containing signature and the unsigned back pointer + /// The hash of this is the "header hash". Note that for unfinished blocks, the prev_block_hash + /// Is the prev from the signage point, and can be replaced with a more recent block + /// + public record Foliage + { + public string PrevBlockHash { get; init; } + public string RewardBlockHash { get; init; } + public FoliageBlockData FoliageBlockData { get; init; } + public string FoliageBlockDataSignature { get; init; } + public string FoliageTransactionBlockHash { get; init; } + public string FoliageTransactionBlockSignature { get; init; } + } + + /// + /// Information that goes along with each transaction block that is relevant for light clients + /// + public record FoliageTransactionBlock + { + public string PrevTransactionBlockHash { get; init; } + public ulong Timestamp { get; init; } + public string FilterHash { get; init; } + public string AdditionsRoot { get; init; } + public string RemovalsRoot { get; init; } + public string TransactionsInfoHash { get; init; } + + public DateTime? DateTimestamp => Timestamp.ToDateTime(); + } + + /// + /// Information that goes along with each transaction block + /// + public record TransactionsInfo + { + /// + /// sha256 of the block generator in this block + /// + public string GeneratorRoot { get; init; } + /// + /// sha256 of the concatenation of the generator ref list entries + /// + public string GeneratorRefsRoot { get; init; } + public string AggregatedSignature { get; init; } + /// + /// This only includes user fees, not block rewards + /// + public ulong Fees { get; init; } + /// + /// This is the total cost of this block, including CLVM cost, cost of program size and conditions + /// + public ulong Cost { get; init; } + /// + /// These can be in any order + /// + public ICollection RewardClaimsIncorporated { get; init; } + } + + /// + /// All the information required to validate a block + /// + public record FullBlock + { + /// + /// If first sb + /// + public ICollection FinishedSubSlots { get; init; } + /// + /// Reward chain trunk data + /// + public RewardChainBlock RewardChainBlock { get; init; } + /// + /// If not first sp in sub-slot + /// + public VDFProof ChallengeChainSpProof { get; init; } + public VDFProof ChallengeChainIpProof { get; init; } + /// + /// If not first sp in sub-slot + /// + public VDFProof RewardChainSpProof { get; init; } + public VDFProof RewardChainIpProof { get; init; } + /// + /// # Iff deficit < 4 + /// + public VDFProof InfusedChallengeChainIpProof { get; init; } + /// + /// Reward chain foliage data + /// + public Foliage Foliage { get; init; } + /// + /// Reward chain foliage data (tx block) + /// + public FoliageTransactionBlock FoliageTransactionBlock { get; init; } + /// + /// Reward chain foliage data (tx block additional) + /// + public TransactionsInfo TransactionsInfo { get; init; } + /// + /// Program that generates transactions + /// + public string TransactionsGenerator { get; init; } + /// + /// List of block heights of previous generators referenced in this block + /// + public ICollection TransactionsGeneratorRefList { get; init; } + } +} diff --git a/src/chia-dotnet/ChiaTypes/HarvesterInfo.cs b/src/chia-dotnet/ChiaTypes/HarvesterInfo.cs new file mode 100644 index 00000000..38cd4299 --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/HarvesterInfo.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; + +namespace chia.dotnet +{ + public record HarvesterConnection + { + public string Host { get; init; } + public string NodeId { get; init; } + public int Port { get; init; } + } + + public record HarvesterInfo + { + public HarvesterConnection Connection { get; init; } + public ICollection FailedToOpenFileNames { get; init; } + public ICollection NotFoundFileNames { get; init; } + public ICollection Plots { get; init; } + } +} diff --git a/src/chia-dotnet/ChiaTypes/MempoolItem.cs b/src/chia-dotnet/ChiaTypes/MempoolItem.cs new file mode 100644 index 00000000..0f18862c --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/MempoolItem.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; + +using Newtonsoft.Json; + +namespace chia.dotnet +{ + /// + /// This structure is used to store parsed CLVM conditions + /// Conditions in CLVM have either format of(opcode, var1) or(opcode, var1, var2) + /// + public record ConditionWithArgs + { + public string Opcode { get; init; } + public ICollection Vars { get; init; } + } + + /// + /// This type doesn't exist in the chia code. This property is serialzied into the Json + /// as a tuple, which shows up as a mixed type json array. There is a speciailzed converter to read + /// the Json and get the ConditionOpCode into + /// conditions: List[Tuple[ConditionOpcode, List[ConditionWithArgs]]] + /// + [JsonConverter(typeof(ConditionConverter))] + public record Condition + { + public string ConditionOpcode { get; init; } + public ICollection Args { get; init; } + } + + public record NPC + { + public string CoinName { get; init; } + public string PuzzleHash { get; init; } + public ICollection Conditions { get; init; } + } + + public record NPCResult + { + public ushort? Error { get; init; } + public ICollection NpcList { get; init; } + /// + /// CLVM cost only, cost of conditions and tx size is not included + /// + public ulong ClvmCost { get; init; } + } + + public record MempoolItem + { + public SpendBundle SpendBundle { get; init; } + public ulong Fee { get; init; } + public NPCResult NPCResult { get; init; } + public ulong Cost { get; init; } + public string SpendBudndleName { get; init; } + public ICollection Additions { get; init; } + public ICollection Removals { get; init; } + public string Program { get; init; } + } +} diff --git a/src/chia-dotnet/ChiaTypes/PlotInfo.cs b/src/chia-dotnet/ChiaTypes/PlotInfo.cs new file mode 100644 index 00000000..8af1dff2 --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/PlotInfo.cs @@ -0,0 +1,21 @@ +using System; + +namespace chia.dotnet +{ + /// + /// Info about a plot file + /// + public record PlotInfo + { + public int FileSize { get; init; } + public string Filename { get; init; } + public string PlotId { get; init; } + public string PlotPublicKey { get; init; } + public string PoolContractPuzzleHash { get; init; } + public string PoolPublicKey { get; init; } + public KValues Size { get; init; } + public double TimeModified { get; init; } + + public DateTime DateTimeModified => TimeModified.ToDateTime(); + } +} diff --git a/src/chia-dotnet/ChiaTypes/PoolPointConverter.cs b/src/chia-dotnet/ChiaTypes/PoolPointConverter.cs new file mode 100644 index 00000000..fc879da1 --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/PoolPointConverter.cs @@ -0,0 +1,32 @@ +using System; +using System.Globalization; + +using Newtonsoft.Json; + +namespace chia.dotnet +{ + internal sealed class PoolPointConverter : JsonConverter + { + public override PoolPoint ReadJson(JsonReader reader, Type objectType, PoolPoint existingValue, bool hasExistingValue, JsonSerializer serializer) + { + // these things are stored as an array of two numbers [double, int] - pivot those into an object + var found = reader.ReadAsDouble() ?? 0; + var difficulty = Convert.ToUInt64(reader.ReadAsString(), CultureInfo.InvariantCulture); + _ = reader.Read(); + + return new PoolPoint() + { + TimeFound = found, + Difficulty = difficulty + }; + } + + public override void WriteJson(JsonWriter writer, PoolPoint value, JsonSerializer serializer) + { + writer.WriteStartArray(); + writer.WriteValue(value.TimeFound); + writer.WriteValue(value.Difficulty); + writer.WriteEndArray(); + } + } +} diff --git a/src/chia-dotnet/ChiaTypes/PoolState.cs b/src/chia-dotnet/ChiaTypes/PoolState.cs new file mode 100644 index 00000000..d1dd7451 --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/PoolState.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; + +using Newtonsoft.Json; + +namespace chia.dotnet +{ + /// + /// From the user's point of view, a pool group can be in these states: + /// `SELF_POOLING`: The singleton exists on the blockchain, and we are farming + /// block rewards to a wallet address controlled by the user + /// + /// `LEAVING_POOL`: The singleton exists, and we have entered the "escaping" state, which + /// means we are waiting for a number of blocks = `relative_lock_height` to pass, so we can leave. + /// + /// `FARMING_TO_POOL`: The singleton exists, and it is assigned to a pool. + /// + /// `CLAIMING_SELF_POOLED_REWARDS`: We have submitted a transaction to sweep our + /// self-pooled funds. + /// + public enum PoolSingletonState + { + /// + /// The singleton exists on the blockchain, and we are farming + /// block rewards to a wallet address controlled by the user + /// + SELF_POOLING = 1, + /// + /// The singleton exists, and we have entered the "escaping" state, which + /// means we are waiting for a number of blocks = `relative_lock_height` to pass, so we can leave. + /// + LEAVING_POOL = 2, + /// + /// The singleton exists, and it is assigned to a pool. + /// + FARMING_TO_POOL = 3 + } + + /// + /// This is what goes into the user's config file, to communicate between the wallet and the farmer processes. + /// + public record PoolWalletConfig + { + public string LauncherId { get; init; } + public string PoolUrl { get; init; } + public string PayoutInstructions { get; init; } + public string TargetPuzzleHash { get; init; } + public string P2SingletonPuzzleHash { get; init; } + public string OwnerPublicKey { get; init; } + public string AuthenticationPublicKey { get; init; } + } + + [JsonConverter(typeof(PoolPointConverter))] + public record PoolPoint + { + public double TimeFound { get; init; } + public ulong Difficulty { get; init; } + public DateTime DateTimeFound => TimeFound.ToDateTime(); + } + + /// + /// This type does not exist in the chia python, but is returned as a dicitonary for the UI to show pool state. + /// Not to be confused with + /// + public record PoolStateInfo + { + public int AuthenticationTokenTimeout { get; init; } + public ulong CurrentDifficulty { get; init; } + public ulong CurrentPoints { get; init; } + public double NextFarmerUpdate { get; init; } + public double NextPoolInfoUpdate { get; init; } + public string P2SingletonPuzzleHash { get; init; } + [JsonProperty("points_acknowledged_24h")] + public ICollection PointsAcknowledged24h { get; init; } + public ulong PointsAcknowledgedSinceStart { get; init; } + [JsonProperty("points_found_24h")] + public ICollection PointsFound24h { get; init; } + public ulong PointsFoundSinceStart { get; init; } + public PoolWalletConfig PoolConfig { get; init; } + public ICollection PoolErrors24h { get; init; } + public DateTime NextFarmerUpdateDateTime => NextFarmerUpdate.ToDateTime(); + public DateTime NextPoolInfoUpdateDateTime => NextFarmerUpdate.ToDateTime(); + } + + /// + /// `PoolState` is a type that is serialized to the blockchain to track the state of the user's pool singleton + /// `target_puzzle_hash` is either the pool address, or the self-pooling address that pool rewards will be paid to. + /// `target_puzzle_hash` is NOT the p2_singleton puzzle that block rewards are sent to. + /// The `p2_singleton` address is the initial address, and the `target_puzzle_hash` is the final destination. + /// `relative_lock_height` is zero when in SELF_POOLING state + /// + public record PoolState + { + public byte Version { get; init; } + /// + /// PoolSingletonState + /// + public PoolSingletonState State { get; init; } + /// + /// A puzzle_hash we pay to + /// When self-farming, this is a main wallet address + /// When farming-to-pool, the pool sends this to the farmer during pool protocol setup + /// + public string TargetPuzzleHash { get; init; } + /// + /// owner_pubkey is set by the wallet, once + /// + public string OwnerPubkey { get; init; } + public string PoolUrl { get; init; } + public uint RelativeLockHeight { get; init; } + } +} diff --git a/src/chia-dotnet/ChiaTypes/PoolWalletInfo.cs b/src/chia-dotnet/ChiaTypes/PoolWalletInfo.cs new file mode 100644 index 00000000..3afbdb1f --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/PoolWalletInfo.cs @@ -0,0 +1,24 @@ +namespace chia.dotnet +{ + /// + /// Internal Pool Wallet state, not destined for the blockchain. This can be completely derived with + /// the Singleton's CoinSpends list, or with the information from the WalletPoolStore. + /// + public record PoolWalletInfo + { + public PoolState Current { get; init; } + public PoolState target { get; init; } + public Coin LauncherCoin { get; init; } + public string LauncherId { get; init; } + public string P2SingletonPuzzleHash { get; init; } + /// + /// Inner puzzle in current singleton, not revealed yet + /// + public string CurrentInner { get; init; } + public string TipSingletonCoinId { get; init; } + /// + /// Block height that current PoolState is from + /// + public uint SingletonBlockHeight { get; init; } + } +} diff --git a/src/chia-dotnet/ChiaTypes/QueuedPlotInfo.cs b/src/chia-dotnet/ChiaTypes/QueuedPlotInfo.cs new file mode 100644 index 00000000..ea5d05dd --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/QueuedPlotInfo.cs @@ -0,0 +1,19 @@ +namespace chia.dotnet +{ + /// + /// An entry on the plotter queue + /// + public record QueuedPlotInfo + { + public int Delay { get; init; } + public bool Deleted { get; init; } + public string Error { get; init; } + public string Id { get; init; } + public string Log { get; init; } + public string LogNew { get; init; } + public bool Parallel { get; init; } + public string Queue { get; init; } + public KValues Size { get; init; } + public string State { get; init; } + } +} diff --git a/src/chia-dotnet/ChiaTypes/SendPeerConverter.cs b/src/chia-dotnet/ChiaTypes/SendPeerConverter.cs new file mode 100644 index 00000000..64f7c56d --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/SendPeerConverter.cs @@ -0,0 +1,35 @@ +using System; +using System.Globalization; + +using Newtonsoft.Json; + +namespace chia.dotnet +{ + internal sealed class SendPeerConverter : JsonConverter + { + public override SendPeer ReadJson(JsonReader reader, Type objectType, SendPeer existingValue, bool hasExistingValue, JsonSerializer serializer) + { + // these things are stored as an array of two numbers [string, byte, string] - pivot those into an object + var peer = reader.ReadAsString(); + var includedInMempool = Convert.ToByte(reader.ReadAsString(), CultureInfo.InvariantCulture); + var error = reader.ReadAsString(); + _ = reader.Read(); + + return new SendPeer() + { + Peer = peer, + IncludedInMempool = includedInMempool, + ErrorMessage = error + }; + } + + public override void WriteJson(JsonWriter writer, SendPeer value, JsonSerializer serializer) + { + writer.WriteStartArray(); + writer.WriteValue(value.Peer); + writer.WriteValue(value.IncludedInMempool); + writer.WriteValue(value.ErrorMessage); + writer.WriteEndArray(); + } + } +} diff --git a/src/chia-dotnet/ChiaTypes/SignagePoint.cs b/src/chia-dotnet/ChiaTypes/SignagePoint.cs new file mode 100644 index 00000000..f159e091 --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/SignagePoint.cs @@ -0,0 +1,10 @@ +namespace chia.dotnet +{ + public record SignagePoint + { + public VDFInfo CcVdf { get; init; } + public VDFProof CcProof { get; init; } + public VDFInfo RcVdf { get; init; } + public VDFProof RcProof { get; init; } + } +} diff --git a/src/chia-dotnet/ChiaTypes/SyncState.cs b/src/chia-dotnet/ChiaTypes/SyncState.cs new file mode 100644 index 00000000..08ebc6d3 --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/SyncState.cs @@ -0,0 +1,10 @@ +namespace chia.dotnet +{ + public record SyncState + { + public bool SyncMode { get; init; } + public ulong SyncProgressHeight { get; init; } + public ulong SyncTipHeight { get; init; } + public bool Synced { get; init; } + } +} diff --git a/src/chia-dotnet/ChiaTypes/TradeRecord.cs b/src/chia-dotnet/ChiaTypes/TradeRecord.cs new file mode 100644 index 00000000..86d14b0f --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/TradeRecord.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; + +namespace chia.dotnet +{ + /// + /// Used for storing transaction data and status in wallets. + /// + public record TradeRecord + { + public uint ConfirmedAtIndex { get; init; } + public ulong? AcceptedAtTime { get; init; } + public ulong CreatedAtTime { get; init; } + public bool MyOffer { get; init; } + public uint Sent { get; init; } + /// + /// This in not complete spendbundle + /// + public SpendBundle SpendBundle { get; init; } + /// + /// this is full trade + /// + public SpendBundle TxSpendBundle { get; init; } + public ICollection Additions { get; init; } + public ICollection Removals { get; init; } + public string TradeId { get; init; } + /// + /// TradeStatus, enum not streamable + /// + public string Status { get; init; } + public ICollection SentTo { get; init; } + + public DateTime? AcceptedAtDateTime => AcceptedAtTime.ToDateTime(); + public DateTime CreatedAtDateTime => CreatedAtTime.ToDateTime(); + } +} diff --git a/src/chia-dotnet/ChiaTypes/TransactionRecord.cs b/src/chia-dotnet/ChiaTypes/TransactionRecord.cs new file mode 100644 index 00000000..ae3798ab --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/TransactionRecord.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; + +using Newtonsoft.Json; + +namespace chia.dotnet +{ + /// + /// Represents the list of peers that we sent the transaction to, whether each one + /// included it in the mempool, and what the error message (if any) was + /// + [JsonConverter(typeof(SendPeerConverter))] + public record SendPeer + { + public string Peer { get; init; } + public byte IncludedInMempool { get; init; } + public string ErrorMessage { get; init; } + } + + /// + /// This is a rather disparate data structure that validates coin transfers. It's generally populated + /// with data from different sources, since burned coins are identified by name, so it is built up + /// more often that it is streamed. + /// + public record CoinSpend + { + public Coin Coin { get; init; } + public string PuzzleReveal { get; init; } + public string Solution { get; init; } + } + + /// + /// This is a list of coins being spent along with their solution programs, and a single + /// aggregated signature. This is the object that most closely corresponds to a bitcoin + /// transaction (although because of non-interactive signature aggregation, the boundaries + /// between transactions are more flexible than in bitcoin). + /// + public record SpendBundle + { + public string AggregatedSignature { get; init; } + public ICollection CoinSpends { get; init; } + } + + public enum TransactionType + { + INCOMING_TX = 0, + OUTGOING_TX = 1, + COINBASE_REWARD = 2, + FEE_REWARD = 3, + INCOMING_TRADE = 4, + OUTGOING_TRADE = 5 + } + + /// + /// Used for storing transaction data and status in wallets. + /// + public record TransactionRecord + { + public ICollection Additions { get; init; } + public ulong Amount { get; init; } + public bool Confirmed { get; init; } + public uint ConfirmedAtHeight { get; init; } + public double CreatedAtTime { get; init; } + public ulong FeeAmount { get; init; } + /// + /// chia pyhton aliases the property to return this along with the record + /// + public string TransactionId => Name; + public string Name { get; init; } + public ICollection Removals { get; init; } + public uint Sent { get; init; } + /// + /// Represents the list of peers that we sent the transaction to, whether each one + /// included it in the mempool, and what the error message (if any) was + /// + public ICollection SentTo { get; init; } + public SpendBundle SpendBundle { get; init; } + public string ToAddress { get; init; } + public string ToPuzzleHash { get; init; } + public string TradeId { get; init; } + /// + /// TransactionType + /// + public TransactionType Type { get; init; } + public uint WalletId { get; init; } + + public DateTime CreatedAtDateTime => CreatedAtTime.ToDateTime(); + } +} diff --git a/src/chia-dotnet/ChiaTypes/UnfinishedHeaderBlock.cs b/src/chia-dotnet/ChiaTypes/UnfinishedHeaderBlock.cs new file mode 100644 index 00000000..82866f9d --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/UnfinishedHeaderBlock.cs @@ -0,0 +1,66 @@ +using System.Numerics; +using System.Collections.Generic; + +namespace chia.dotnet +{ + public record RewardChainBlockUnfinished + { + public BigInteger TotalIters { get; init; } + public byte SignagePointIndex { get; init; } + public string PosSsCcChallengeHash { get; init; } + public ProofOfSpace ProofOfSpace { get; init; } + /// + /// Not present for first sp in slot + /// + public VDFInfo ChallengeChainSpVdf { get; init; } + public string ChallengeChainSpSignature { get; init; } + /// + /// Not present for first sp in slot + /// + public VDFInfo RewardChainSpVdf { get; init; } + public string RewardChainSpSignature { get; init; } + } + + public record EndOfSubSlotBundle + { + public ChallengeChainSubSlot ChallengeChain { get; init; } + public InfusedChallengeChainSubSlot InfusedChallengeChain { get; init; } + public RewardChainSubSlot RewardChain { get; init; } + public SubSlotProofs Proofs { get; init; } + } + + /// + /// Same as a FullBlock but without TransactionInfo and Generator, used by light clients + /// + public record UnfinishedHeaderBlock + { + /// + /// If first sb + /// + public ICollection FinishedSubSlots { get; init; } + /// + /// Reward chain trunk data + /// + public RewardChainBlockUnfinished RewardChainBlock { get; init; } + /// + /// If not first sp in sub-slot + /// + public VDFProof ChallengeChainSpProof { get; init; } + /// + /// If not first sp in sub-slot + /// + public VDFProof RewardChainSpProof { get; init; } + /// + /// Reward chain foliage data + /// + public Foliage Foliage { get; init; } + /// + /// Reward chain foliage data (tx block) + /// + public FoliageTransactionBlock FoliageTransactionBlock { get; init; } + /// + /// Filter for block transactions + /// + public string TransactionsFilter { get; init; } + } +} diff --git a/src/chia-dotnet/ChiaTypes/WalletInfo.cs b/src/chia-dotnet/ChiaTypes/WalletInfo.cs new file mode 100644 index 00000000..8d2829c5 --- /dev/null +++ b/src/chia-dotnet/ChiaTypes/WalletInfo.cs @@ -0,0 +1,36 @@ +namespace chia.dotnet +{ + /// + /// Wallet Types + /// + public enum WalletType + { + STANDARD_WALLET = 0, + RATE_LIMITED = 1, + ATOMIC_SWAP = 2, + AUTHORIZED_PAYEE = 3, + MULTI_SIG = 4, + CUSTODY = 5, + COLOURED_COIN = 6, + RECOVERABLE = 7, + DISTRIBUTED_ID = 8, + POOLING_WALLET = 9 + } + + /// + /// This object represents the wallet data as it is stored in DB. + /// ID: Main wallet (Standard) is stored at index 1, every wallet created after done has auto incremented id. + /// Name: can be a user provided or default generated name. (can be modified) + /// Type: is specified during wallet creation and should never be changed. + /// Data: this filed is intended to be used for storing any wallet specific information required for it. + /// (RL wallet stores origin_id, admin/user pubkey, rate limit, etc.) + /// This data should be json encoded string. + /// + public record WalletInfo + { + public uint Id { get; init; } + public string Name { get; init; } + public WalletType Type { get; init; } + public string Data { get; init; } + } +} diff --git a/src/chia-dotnet/ColouredCoinWallet.cs b/src/chia-dotnet/ColouredCoinWallet.cs index ba376912..0a8bcac6 100644 --- a/src/chia-dotnet/ColouredCoinWallet.cs +++ b/src/chia-dotnet/ColouredCoinWallet.cs @@ -1,5 +1,4 @@ -using System.Numerics; -using System.Dynamic; +using System.Dynamic; using System.Threading; using System.Threading.Tasks; @@ -54,7 +53,7 @@ public async Task SetName(string name, CancellationToken cancellationToken = def /// Get the colour of a wallet's coloured coin /// /// - /// The colout as a string + /// The colour as a string public async Task GetColour(CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); @@ -68,12 +67,12 @@ public async Task GetColour(CancellationToken cancellationToken = defaul /// /// Spend a coloured coin /// - /// inner address for the spend - /// the amount to put in the wallet (in units of mojos) - /// fee to create the wallet (in units of mojos) + /// The inner address for the spend + /// The amount to put in the wallet (in units of mojos) + /// The fee to create the wallet (in units of mojos) /// - /// A transaction - public async Task Spend(string innerAddress, ulong amount, ulong fee, CancellationToken cancellationToken = default) + /// A + public async Task Spend(string innerAddress, ulong amount, ulong fee, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.wallet_id = WalletId; @@ -81,9 +80,7 @@ public async Task Spend(string innerAddress, ulong amount, ulong fee, C data.amount = amount; data.fee = fee; - var response = await WalletProxy.SendMessage("cc_spend", data, cancellationToken); - - return response.transaction; + return await WalletProxy.SendMessage("cc_spend", data, "transaction", cancellationToken); } } } diff --git a/src/chia-dotnet/Config.cs b/src/chia-dotnet/Config.cs index ba759a6d..f6923ab8 100644 --- a/src/chia-dotnet/Config.cs +++ b/src/chia-dotnet/Config.cs @@ -11,7 +11,8 @@ namespace chia.dotnet { /// - /// Represents a chia config yaml file and its contents. Used to find the uri and ssl certs needed to connect via a + /// Represents a chia config yaml file and its contents. + /// Used to find the uri and ssl certs needed to connect /// public sealed class Config { @@ -40,10 +41,14 @@ public EndpointInfo GetEndpoint(string serviceName) throw new ArgumentNullException(nameof(serviceName)); } + // this allows a ServicesNames member to used + serviceName = serviceName.Replace("chia_", ""); + UriBuilder builder = new(); dynamic ssl; - if (serviceName == "ui") + // any daemon connection uses wss: + if (serviceName == "ui") // this is the daemon that the ui connects to { builder.Scheme = "wss"; dynamic section = Contents.ui; @@ -51,14 +56,14 @@ public EndpointInfo GetEndpoint(string serviceName) builder.Port = Convert.ToInt32(section.daemon_port); ssl = section.daemon_ssl; } - else if (serviceName == "daemon") + else if (serviceName is "daemon" or "chia plots create") // this is the local daemon { builder.Scheme = "wss"; builder.Host = Contents.self_hostname; builder.Port = Convert.ToInt32(Contents.daemon_port); ssl = Contents.daemon_ssl; } - else + else // all other endpoints are https direct connections { builder.Scheme = "https"; builder.Host = Contents.self_hostname; @@ -87,7 +92,7 @@ public EndpointInfo GetEndpoint(string serviceName) /// Opens a chia config yaml file /// /// The full filesystem path to the config file - /// A instance + /// The config instance public static Config Open(string fullPath) { if (string.IsNullOrEmpty(fullPath)) @@ -119,7 +124,7 @@ public static Config Open(string fullPath) /// /// Opens the from plus 'config' and 'config.yaml' /// - /// + /// The user's chia install instance public static Config Open() { return Open(Path.Combine(DefaultRootPath, "config", "config.yaml")); diff --git a/src/chia-dotnet/Converters.cs b/src/chia-dotnet/Converters.cs new file mode 100644 index 00000000..ae14acd0 --- /dev/null +++ b/src/chia-dotnet/Converters.cs @@ -0,0 +1,98 @@ +using System; +using System.Linq; +using System.Diagnostics; +using System.Collections.Generic; + +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using Newtonsoft.Json.Linq; + +namespace chia.dotnet +{ + internal static class Converters + { + public static T ToObject(JObject j, string childItem) + { + Debug.Assert(j is not null); + + var token = string.IsNullOrEmpty(childItem) ? j : j.GetValue(childItem); + + return ToObject(token); + } + + public static T ToObject(JToken token) + { + Debug.Assert(token is not null); + + var serializerSettings = new JsonSerializerSettings + { + ContractResolver = new DefaultContractResolver + { + NamingStrategy = new SnakeCaseNamingStrategy() + } + }; + + return token.ToObject(JsonSerializer.Create(serializerSettings)); + } + + public static T ToObject(this string json) + { + var serializerSettings = new JsonSerializerSettings + { + ContractResolver = new DefaultContractResolver + { + NamingStrategy = new SnakeCaseNamingStrategy() + } + }; + return JsonConvert.DeserializeObject(json, serializerSettings); + } + + public static IEnumerable ConvertList(dynamic enumerable) + { + Debug.Assert(enumerable is not null); + + return ((IEnumerable)enumerable).Select(item => (T)item); + } + + public static IEnumerable ToStrings(dynamic stringEnumerable) + { + Debug.Assert(stringEnumerable is not null); + + return ((IEnumerable)stringEnumerable).Select(item => item.ToString()); + } + + public static DateTime? ToDateTime(this ulong? epoch) + { + if (epoch.HasValue) + { + var start = new DateTime(1970, 1, 1, 0, 0, 0, 0); //from start epoch time + return start.AddSeconds(epoch.Value); //add the seconds to the start DateTime + } + return null; + } + + public static DateTime ToDateTime(this ulong epoch) + { + var start = new DateTime(1970, 1, 1, 0, 0, 0, 0); //from start epoch time + return start.AddSeconds(epoch); //add the seconds to the start DateTime + } + + public static DateTime ToDateTime(this double epoch) + { + var start = new DateTime(1970, 1, 1, 0, 0, 0, 0); //from start epoch time + return start.AddSeconds(epoch); //add the seconds to the start DateTime + } + + public static string ToJson(this object o) + { + var serializerSettings = new JsonSerializerSettings + { + ContractResolver = new DefaultContractResolver + { + NamingStrategy = new SnakeCaseNamingStrategy() + } + }; + return JsonConvert.SerializeObject(o, serializerSettings); + } + } +} diff --git a/src/chia-dotnet/DIDWallet.cs b/src/chia-dotnet/DIDWallet.cs index f1310d19..9ccf4488 100644 --- a/src/chia-dotnet/DIDWallet.cs +++ b/src/chia-dotnet/DIDWallet.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Numerics; using System.Dynamic; using System.Threading; using System.Threading.Tasks; @@ -137,9 +136,7 @@ public async Task RecoverySpend(IEnumerable attestFilenames, string pubk var response = await WalletProxy.SendMessage("did_get_recovery_list", data, cancellationToken); - var recoverList = ((IEnumerable)response.recover_list).Select(i => i.ToString()); - - return (recoverList, response.num_required); + return (Converters.ToStrings(response.recover_list), response.num_required); } /// @@ -151,7 +148,7 @@ public async Task RecoverySpend(IEnumerable attestFilenames, string pubk /// The puzzlehash /// /// A spendbundle and information about the attest - public async Task<(dynamic MessageSpendBundle, dynamic Info)> CreateAttest(string filename, string coinName, string pubkey, string puzHash, CancellationToken cancellationToken = default) + public async Task<(string MessageSpendBundle, (string Parent, string InnerPuzzleHash, ulong Amount) Info)> CreateAttest(string filename, string coinName, string pubkey, string puzHash, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.wallet_id = WalletId; @@ -162,7 +159,7 @@ public async Task RecoverySpend(IEnumerable attestFilenames, string pubk var response = await WalletProxy.SendMessage("did_create_attest", data, cancellationToken); - return (response.message_spend_bundle, response.info); + return (response.message_spend_bundle, (response.info[0], response.info[1], response.info[2])); } /// @@ -170,14 +167,20 @@ public async Task RecoverySpend(IEnumerable attestFilenames, string pubk /// /// /// A spendbundle and information about the attest - public async Task<(string MyDID, string CoinName, string NewPuzzleHash, string PublicKey, IEnumerable BackUpIds)> GetInformationNeededForRecovery(CancellationToken cancellationToken = default) + public async Task<(string MyDID, string CoinName, string NewPuzzleHash, string PublicKey, ICollection BackUpIds)> GetInformationNeededForRecovery(CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.wallet_id = WalletId; var response = await WalletProxy.SendMessage("did_get_information_needed_for_recovery", data, cancellationToken); - return (response.my_did, response.coin_name, response.newpuzhash, response.pubkey, response.backup_dids); + return ( + response.my_did, + response.coin_name, + response.newpuzhash, + response.pubkey, + Converters.ConvertList(response.backup_dids) + ); } /// diff --git a/src/chia-dotnet/DaemonProxy.cs b/src/chia-dotnet/DaemonProxy.cs index 128e11be..8e7ce0fe 100644 --- a/src/chia-dotnet/DaemonProxy.cs +++ b/src/chia-dotnet/DaemonProxy.cs @@ -6,21 +6,9 @@ namespace chia.dotnet { /// - /// The names of chia services. These are used as values - /// - public struct ServiceNames - { - public const string FullNode = "chia_full_node"; - public const string Wallet = "chia_wallet"; - public const string Farmer = "chia_farmer"; - public const string Harvester = "chia_harvester"; - public const string Simulator = "chia_full_node_simulator"; - public const string Plotter = "chia plots create"; - public const string Daemon = "daemon"; - } - - /// - /// for the daemon interface. The daemon can be used to proxy messages to and from other chia services. + /// for the daemon interface. + /// The daemon can be used to proxy messages to and from other chia services as well + /// as controlling the and having it's own procedures /// public sealed class DaemonProxy : ServiceProxy { @@ -37,7 +25,7 @@ public DaemonProxy(WebSocketRpcClient rpcClient, string originService) /// /// Tells the daemon at the RPC endpoint to exit. /// - /// There isn't a way to start the daemon remotely via RPC so take care that you have access to the RPC host if needed + /// There isn't a way to start the daemon remotely via RPC, so take care that you have access to the RPC host if needed /// /// Awaitable public async Task Exit(CancellationToken cancellationToken = default) @@ -50,7 +38,7 @@ public async Task Exit(CancellationToken cancellationToken = default) /// /// The of the service /// - /// Awaitable with the boolean value indicating whether the service is running + /// A boolean value indicating whether the service is running public async Task IsServiceRunning(string service, CancellationToken cancellationToken = default) { var response = await SendMessage("is_running", CreateDataObject(service), cancellationToken); @@ -102,7 +90,7 @@ public async Task StopService(string service, CancellationToken cancellationToke _ = await SendMessage("stop_service", CreateDataObject(service), cancellationToken); } - private dynamic CreateDataObject(string service) + private object CreateDataObject(string service) { if (string.IsNullOrEmpty(service)) { diff --git a/src/chia-dotnet/Deserializer.cs b/src/chia-dotnet/Deserializer.cs deleted file mode 100644 index 89d89401..00000000 --- a/src/chia-dotnet/Deserializer.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System.IO; -using System.Net.Http; -using System.Dynamic; -using System.Diagnostics; -using System.Collections.Generic; -using System.Threading.Tasks; - -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; - -namespace chia.dotnet -{ - /// - /// Extension methods to aid deserialization - /// - internal static class HttpClientExtensions - { - /// - /// Helper method to deserialize content in a number of diferent ways - /// - /// The type to deserialize to - /// - /// - /// array - /// when T is dynamic - /// or other POCO types - /// - /// An to deserialize - /// content deserialized to type T - public static async Task Deserialize(this HttpResponseMessage response) - { - // if the client asked for a stream or byte array, return without serializing to a different type - if (typeof(T) == typeof(Stream)) - { - var stream = await response.Content.ReadAsStreamAsync(); - - return (T)(object)stream; - } - - if (typeof(T) == typeof(byte[])) - { - var bytes = await response.Content.ReadAsByteArrayAsync(); - return (T)(object)bytes; - } - - var content = await response.Content.ReadAsStringAsync(); - - if (!string.IsNullOrEmpty(content)) - { - // return type is string, just return the content - if (typeof(T) == typeof(string)) - { - return (T)(object)content; - } - - // if the return type is object return a dynamic object - if (typeof(T) == typeof(object)) - { - return DeserializeToDynamic(content.Trim()); - } - - // otherwise deserialize to the return type - return JsonConvert.DeserializeObject(content); - } - - // no content - return default - return default; - } - - private static dynamic DeserializeToDynamic(string content) - { - Debug.Assert(!string.IsNullOrEmpty(content)); - - var settings = new JsonSerializerSettings(); - settings.Converters.Add(new ExpandoObjectConverter()); - return content.StartsWith("[") - ? (dynamic)JsonConvert.DeserializeObject>(content, settings) - : (dynamic)JsonConvert.DeserializeObject(content, settings); - } - } -} diff --git a/src/chia-dotnet/FarmerProxy.cs b/src/chia-dotnet/FarmerProxy.cs index e226a931..ed0a14dc 100644 --- a/src/chia-dotnet/FarmerProxy.cs +++ b/src/chia-dotnet/FarmerProxy.cs @@ -6,7 +6,7 @@ namespace chia.dotnet { /// - /// Proxy that communicates with the farmer via the daemon + /// Proxy that communicates with the farmer /// public sealed class FarmerProxy : ServiceProxy { @@ -57,11 +57,31 @@ public async Task SetRewardTargets(string farmerTarget, string poolTarget, Cance /// /// /// List of signage points - public async Task> GetSignagePoints(CancellationToken cancellationToken = default) + public async Task Proofs, FarmerSignagePoint SignagePoint)>> GetSignagePoints(CancellationToken cancellationToken = default) { var response = await SendMessage("get_signage_points", cancellationToken); - return response.signage_points; + // proofs are List[Tuple[str, ProofOfSpace]] + var list = new List<(IEnumerable<(string SpHash, ProofOfSpace ProofOfSpace)> Proofs, FarmerSignagePoint SignagePoint)>(); + foreach (var sp in response.signage_points) + { + list.Add(ConvertSignagePoint(sp)); + } + + return list; + } + + private static (IEnumerable<(string SpHash, ProofOfSpace ProofOfSpace)> Proofs, FarmerSignagePoint SignagePoint) ConvertSignagePoint(dynamic sp) + { + var proofs = new List<(string SpHash, ProofOfSpace ProofOfSpace)>(); + foreach (var proof in sp.proofs) + { + var hash = proof[0]; + var proofOfSpace = Converters.ToObject(hash[1]); + proofs.Add((hash, proofOfSpace)); + } + var signagePoint = Converters.ToObject(sp.signage_point); + return (proofs, signagePoint); } /// @@ -70,14 +90,14 @@ public async Task> GetSignagePoints(CancellationToken cance /// signage point hash /// /// a signage point and proofs of space - public async Task<(dynamic SignagePoint, IEnumerable Proofs)> GetSignagePoint(string spHash, CancellationToken cancellationToken = default) + public async Task<(IEnumerable<(string SpHash, ProofOfSpace ProofOfSpace)> Proofs, FarmerSignagePoint SignagePoint)> GetSignagePoint(string spHash, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.sp_hash = spHash; var response = await SendMessage("get_signage_point", data, cancellationToken); - return (response.signage_point, response.proofs); + return ConvertSignagePoint(response); } /// @@ -85,11 +105,9 @@ public async Task> GetSignagePoints(CancellationToken cance /// /// /// A list of harvesters - public async Task> GetHarvesters(CancellationToken cancellationToken = default) + public async Task> GetHarvesters(CancellationToken cancellationToken = default) { - var response = await SendMessage("get_harvesters", cancellationToken); - - return response.harvesters; + return await SendMessage>("get_harvesters", "harvesters", cancellationToken); } /// @@ -105,7 +123,7 @@ public async Task GetPoolLoginLink(string launcherID, CancellationToken var response = await SendMessage("get_pool_login_link", data, cancellationToken); - return response.login_link?.ToString(); + return response.login_link; } /// @@ -113,11 +131,9 @@ public async Task GetPoolLoginLink(string launcherID, CancellationToken /// /// /// A list of pool states - public async Task> GetPoolState(CancellationToken cancellationToken = default) + public async Task> GetPoolState(CancellationToken cancellationToken = default) { - var response = await SendMessage("get_pool_state", cancellationToken); - - return response.pool_state; + return await SendMessage>("get_pool_state", "pool_state", cancellationToken); } /// diff --git a/src/chia-dotnet/FullNodeProxy.cs b/src/chia-dotnet/FullNodeProxy.cs index ae7e477e..c50a0486 100644 --- a/src/chia-dotnet/FullNodeProxy.cs +++ b/src/chia-dotnet/FullNodeProxy.cs @@ -1,4 +1,5 @@ -using System.Dynamic; +using System; +using System.Dynamic; using System.Numerics; using System.Threading; using System.Threading.Tasks; @@ -8,7 +9,7 @@ namespace chia.dotnet { /// - /// Proxy that communicates with the full node via the daemon + /// Proxy that communicates with the full node /// public sealed class FullNodeProxy : ServiceProxy { @@ -26,12 +27,10 @@ public FullNodeProxy(IRpcClient rpcClient, string originService) /// Returns a summary of the node's view of the blockchain. /// /// - /// blockchain_state - public async Task GetBlockchainState(CancellationToken cancellationToken = default) + /// The + public async Task GetBlockchainState(CancellationToken cancellationToken = default) { - var response = await SendMessage("get_blockchain_state", cancellationToken); - - return response.blockchain_state; + return await SendMessage("get_blockchain_state", "blockchain_state", cancellationToken); } /// @@ -39,15 +38,31 @@ public async Task GetBlockchainState(CancellationToken cancellationToke /// /// The header hash /// - /// block - public async Task GetBlock(string headerhash, CancellationToken cancellationToken = default) + /// The + public async Task GetBlock(string headerhash, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.header_hash = headerhash; - var response = await SendMessage("get_block", data, cancellationToken); + return await SendMessage("get_block", data, "block", cancellationToken); + } - return response.block; + /// + /// Get the blocks between a start and end height + /// + /// Start height + /// End Height - non-inclusive + /// Flag indicating whether to include the header hash in the result or not + /// + /// A list of s + public async Task> GetBlocks(uint start, uint end, bool excludeHeaderhash, CancellationToken cancellationToken = default) + { + dynamic data = new ExpandoObject(); + data.start = start; + data.end = end; + data.exclude_header_hash = excludeHeaderhash; + + return await SendMessage>("get_blocks", data, "blocks", cancellationToken); } /// @@ -55,15 +70,13 @@ public async Task GetBlock(string headerhash, CancellationToken cancell /// /// The header hash /// - /// block_record - public async Task GetBlockRecord(string headerhash, CancellationToken cancellationToken = default) + /// The + public async Task GetBlockRecord(string headerhash, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.header_hash = headerhash; - var response = await SendMessage("get_block_record", data, cancellationToken); - - return response.block_record; + return await SendMessage("get_block_record", data, "block_record", cancellationToken); } /// @@ -71,15 +84,13 @@ public async Task GetBlockRecord(string headerhash, CancellationToken c /// /// the height to get /// - /// block_record - public async Task GetBlockRecordByHeight(uint height, CancellationToken cancellationToken = default) + /// The + public async Task GetBlockRecordByHeight(uint height, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.height = height; - var response = await SendMessage("get_block_record_by_height", data, cancellationToken); - - return response.block_record; + return await SendMessage("get_block_record_by_height", data, "block_record", cancellationToken); } /// @@ -88,48 +99,24 @@ public async Task GetBlockRecordByHeight(uint height, CancellationToken /// Start height /// End Height - non-inclusive /// - /// list of block_record - public async Task> GetBlockRecords(uint start, uint end, CancellationToken cancellationToken = default) + /// list of s + public async Task> GetBlockRecords(uint start, uint end, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.start = start; data.end = end; - var response = await SendMessage("get_block_records", data, cancellationToken); - - return response.block_records; - } - - /// - /// Get the blocks between a start and end height - /// - /// Start height - /// End Height - non-inclusive - /// Flag indicating whether to include the header hash in the result or not - /// - /// A list of blocks - public async Task> GetBlocks(uint start, uint end, bool excludeHeaderhash, CancellationToken cancellationToken = default) - { - dynamic data = new ExpandoObject(); - data.start = start; - data.end = end; - data.exclude_header_hash = excludeHeaderhash; - - var response = await SendMessage("get_blocks", data, cancellationToken); - - return response.blocks; + return await SendMessage>("get_block_records", data, "block_records", cancellationToken); } /// /// Get unfinished block headers /// /// - /// A list of headers - public async Task> GetUnfinishedBlockHeaders(CancellationToken cancellationToken = default) + /// A list of s + public async Task> GetUnfinishedBlockHeaders(CancellationToken cancellationToken = default) { - var response = await SendMessage("get_unfinished_block_headers", cancellationToken); - - return response.headers; + return await SendMessage>("get_unfinished_block_headers", "headers", cancellationToken); } /// @@ -138,16 +125,14 @@ public async Task> GetUnfinishedBlockHeaders(CancellationTo /// The puzzle hash /// whether to include spent coins too, instead of just unspent /// - /// A list of coin records - public async Task> GetCoinRecordsByPuzzleHash(string puzzlehash, bool includeSpendCoins, CancellationToken cancellationToken = default) + /// A list of s + public async Task> GetCoinRecordsByPuzzleHash(string puzzlehash, bool includeSpendCoins, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.puzzle_hash = puzzlehash; data.include_spend_coins = includeSpendCoins; - var response = await SendMessage("get_coin_records_by_puzzle_hash", data, cancellationToken); - - return response.coin_records; + return await SendMessage>("get_coin_records_by_puzzle_hash", data, "coin_records", cancellationToken); } /// @@ -158,8 +143,8 @@ public async Task> GetCoinRecordsByPuzzleHash(string puzzle /// confirmation end height for search /// whether to include spent coins too, instead of just unspent /// - /// A list of coin records - public async Task> GetCoinRecordsByPuzzleHash(string puzzlehash, uint startHeight, uint endHeight, bool includeSpendCoins, CancellationToken cancellationToken = default) + /// A list of s + public async Task> GetCoinRecordsByPuzzleHash(string puzzlehash, uint startHeight, uint endHeight, bool includeSpendCoins, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.puzzle_hash = puzzlehash; @@ -167,9 +152,7 @@ public async Task> GetCoinRecordsByPuzzleHash(string puzzle data.end_height = endHeight; data.include_spend_coins = includeSpendCoins; - var response = await SendMessage("get_coin_records_by_puzzle_hash", data, cancellationToken); - - return response.coin_records; + return await SendMessage>("get_coin_records_by_puzzle_hash", data, "coin_records", cancellationToken); } /// @@ -180,8 +163,8 @@ public async Task> GetCoinRecordsByPuzzleHash(string puzzle /// confirmation end height for search /// whether to include spent coins too, instead of just unspent /// - /// A list of coin records - public async Task> GetCoinRecordsByPuzzleHashes(IEnumerable puzzlehashes, uint startHeight, uint endHeight, bool includeSpendCoins, CancellationToken cancellationToken = default) + /// A list of s + public async Task> GetCoinRecordsByPuzzleHashes(IEnumerable puzzlehashes, uint startHeight, uint endHeight, bool includeSpendCoins, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.puzzle_hash = puzzlehashes.ToList(); @@ -189,9 +172,7 @@ public async Task> GetCoinRecordsByPuzzleHashes(IEnumerable data.end_height = endHeight; data.include_spend_coins = includeSpendCoins; - var response = await SendMessage("get_coin_records_by_puzzle_hashes", data, cancellationToken); - - return response.coin_records; + return await SendMessage>("get_coin_records_by_puzzle_hashes", data, "coin_records", cancellationToken); } /// @@ -199,43 +180,43 @@ public async Task> GetCoinRecordsByPuzzleHashes(IEnumerable /// /// The coin name /// - /// A coin record - public async Task GetCoinRecordByName(string name, CancellationToken cancellationToken = default) + /// A + public async Task GetCoinRecordByName(string name, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.name = name; - var response = await SendMessage("get_coin_record_by_name", data, cancellationToken); - - return response.coin_record; + return await SendMessage("get_coin_record_by_name", data, "coin_record", cancellationToken); } /// - /// Retrieves the additions and removals (state transitions) for a certain block. Returns coin records for each addition and removal. + /// Retrieves the additions and removals (state transitions) for a certain block. + /// Returns coin records for each addition and removal. /// /// The header hash /// /// A list of additions and a list of removals - public async Task<(IEnumerable Additions, IEnumerable Removals)> GetAdditionsAndRemovals(string headerhash, CancellationToken cancellationToken = default) + public async Task<(ICollection Additions, ICollection Removals)> GetAdditionsAndRemovals(string headerhash, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.header_hash = headerhash; var response = await SendMessage("get_additions_and_removals", data, cancellationToken); - return (response.additions, response.removals); + return ( + Converters.ToObject>(response.additions), + Converters.ToObject>(response.removals) + ); } /// /// Returns all items in the mempool. /// /// - /// a list of mempool items - public async Task> GetAllMempoolItems(CancellationToken cancellationToken = default) + /// A dictionary of mempool items + public async Task> GetAllMempoolItems(CancellationToken cancellationToken = default) { - var response = await SendMessage("get_all_mempool_items", cancellationToken); - - return response.mempool_items; + return await SendMessage>("get_all_mempool_items", "mempool_items", cancellationToken); } /// @@ -243,11 +224,11 @@ public async Task> GetAllMempoolItems(CancellationToken can /// /// /// a list of tx_ids - public async Task> GetAllMemmpoolTxIds(CancellationToken cancellationToken = default) + public async Task> GetAllMemmpoolTxIds(CancellationToken cancellationToken = default) { var response = await SendMessage("get_all_mempool_tx_ids", cancellationToken); - return response.tx_ids; + return Converters.ToStrings(response.tx_ids); } /// @@ -255,15 +236,13 @@ public async Task> GetAllMemmpoolTxIds(CancellationToken ca /// /// Trasnaction id /// - /// a list of tx_ids - public async Task GetMemmpooItemByTxId(string txId, CancellationToken cancellationToken = default) + /// The + public async Task GetMemmpooItemByTxId(string txId, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.tx_id = txId; - var response = await SendMessage("get_mempool_item_by_tx_id", cancellationToken); - - return response.mempool_item; + return await SendMessage("get_mempool_item_by_tx_id", data, "mempool_item", cancellationToken); } /// @@ -303,7 +282,7 @@ public async Task GetNetworkSpace(string newerBlockHeaderhash, strin /// /// /// Indicator of whether the spend bundle was successfully included in the mempool - public async Task PushTx(dynamic spendBundle, CancellationToken cancellationToken = default) + public async Task PushTx(SpendBundle spendBundle, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.spend_bundle = spendBundle; @@ -318,15 +297,20 @@ public async Task PushTx(dynamic spendBundle, CancellationToken cancellati /// /// signage point hash /// - /// Indicator of whether the spend bundle was successfully included in the mempool - public async Task<(dynamic signagePoint, double timeReceived, bool reverted)> GetRecentSignagePoint(string spHash, CancellationToken cancellationToken = default) + /// The + public async Task<(SignagePoint SignagePoint, double TimeReceived, bool Reverted, DateTime DateTimeReceived)> GetRecentSignagePoint(string spHash, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.sp_hash = spHash; var response = await SendMessage("get_recent_signage_point_or_eos", data, cancellationToken); - return (response.signage_point, response.time_received, response.reverted); + return ( + Converters.ToObject(response.signage_point), + response.time_received, + response.reverted, + Converters.ToDateTime((double)response.time_received) + ); } /// @@ -334,34 +318,36 @@ public async Task PushTx(dynamic spendBundle, CancellationToken cancellati /// /// challenge hash /// - /// A signange _point or an eos - public async Task<(dynamic eos, double timeReceived, bool reverted)> GetRecentEOS(string challengeHash, CancellationToken cancellationToken = default) + /// The + public async Task<(EndOfSubSlotBundle eos, double timeReceived, bool reverted, DateTime DateTimeReceived)> GetRecentEOS(string challengeHash, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.challenge_hash = challengeHash; var response = await SendMessage("get_recent_signage_point_or_eos", data, cancellationToken); - return (response.eos, response.time_received, response.reverted); + return ( + Converters.ToObject(response.eos), + response.time_received, + response.reverted, + Converters.ToDateTime((double)response.time_received) + ); } - /// /// Gets a coin solution /// - /// Id of the coin - /// Block height + /// Id/name of the coin + /// Block height at which the coin was spent 'spent_block_index' /// - /// A coin_solution - public async Task GetPuzzleAndSolution(string coinId, uint height, CancellationToken cancellationToken = default) + /// A + public async Task GetPuzzleAndSolution(string coinId, uint height, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.coin_id = coinId; data.height = height; - var response = await SendMessage("get_puzzle_and_solution", data, cancellationToken); - - return response.coin_solution; + return await SendMessage("get_puzzle_and_solution", data, "coin_solution", cancellationToken); } } } diff --git a/src/chia-dotnet/HarvesterProxy.cs b/src/chia-dotnet/HarvesterProxy.cs index e78799ee..d2199271 100644 --- a/src/chia-dotnet/HarvesterProxy.cs +++ b/src/chia-dotnet/HarvesterProxy.cs @@ -2,12 +2,11 @@ using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; -using System.Linq; namespace chia.dotnet { /// - /// Proxy that communicates with the harvester via the daemon + /// Proxy that communicates with the harvester /// public sealed class HarvesterProxy : ServiceProxy { @@ -26,11 +25,15 @@ public HarvesterProxy(IRpcClient rpcClient, string originService) /// /// /// A list of plots - public async Task<(IEnumerable FailedToOpenFilenames, IEnumerable NotFoundFileNames, IEnumerable Plots)> GetPlots(CancellationToken cancellationToken = default) + public async Task<(IEnumerable FailedToOpenFilenames, IEnumerable NotFoundFileNames, IEnumerable Plots)> GetPlots(CancellationToken cancellationToken = default) { var response = await SendMessage("get_plots", cancellationToken); - return (response.failed_to_open_filenames, response.not_found_filenames, response.plots); + return ( + Converters.ToObject>(response.failed_to_open_filenames), + Converters.ToObject>(response.not_found_filenames), + Converters.ToObject>(response.plots) + ); } /// @@ -57,7 +60,7 @@ public async Task> GetPlotDirectories(CancellationToken canc { var response = await SendMessage("get_plot_directories", cancellationToken); - return ((IEnumerable)response.directories).Select(item => item.ToString()); + return Converters.ToStrings(response.directories); } /// diff --git a/src/chia-dotnet/HttpRpcClient.cs b/src/chia-dotnet/HttpRpcClient.cs index b496ca26..ded075d1 100644 --- a/src/chia-dotnet/HttpRpcClient.cs +++ b/src/chia-dotnet/HttpRpcClient.cs @@ -1,17 +1,14 @@ using System; using System.Net.Security; using System.Net.Http; -using System.Net.Http.Json; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -using System.Collections.Generic; - +using System.Text; namespace chia.dotnet { /// /// Base class that handles core communication with the rpc endpoint using http(s) - /// and synchronizes request and response messages /// public class HttpRpcClient : IDisposable, IRpcClient { @@ -54,8 +51,12 @@ public async Task PostMessage(Message message, CancellationToken cancellationTok throw new ObjectDisposedException(nameof(WebSocketRpcClient)); } - var d = message.Data as IDictionary; - using var response = await _httpClient.PostAsJsonAsync(message.Command, d, cancellationToken); + // need to use our json to ensure we get the snake case resolver + // (don't change to extension method syntax as it won't bind to the dynamic 'Data' object) + var json = Converters.ToJson(message.Data); + + using var content = new StringContent(json, Encoding.UTF8, "application/json"); + using var response = await _httpClient.PostAsync(message.Command, content, cancellationToken); _ = response.EnsureSuccessStatusCode(); } @@ -74,12 +75,18 @@ public async Task SendMessage(Message message, CancellationToken cancel throw new ObjectDisposedException(nameof(WebSocketRpcClient)); } - var d = message.Data as IDictionary; - using var response = await _httpClient.PostAsJsonAsync(message.Command, d, cancellationToken); + // need to use our json to ensure we get the snake case resolver + // (don't change to extension method syntax as it won't bind to the dynamic 'Data' object) + var json = Converters.ToJson(message.Data); + + using var content = new StringContent(json, Encoding.UTF8, "application/json"); + using var response = await _httpClient.PostAsync(message.Command, content, cancellationToken); _ = response.EnsureSuccessStatusCode(); - dynamic responseMessage = await response.Deserialize(); - return responseMessage?.success == false ? throw new ResponseException(message, responseMessage?.error?.ToString()) : (dynamic)responseMessage; + var responseJson = await response.Content.ReadAsStringAsync(); + var responseData = responseJson.ToObject(); + + return responseData?.success == false ? throw new ResponseException(message, responseData?.error?.ToString()) : (dynamic)responseData; } private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) diff --git a/src/chia-dotnet/Message.cs b/src/chia-dotnet/Message.cs index a615ef8c..c7dc59d5 100644 --- a/src/chia-dotnet/Message.cs +++ b/src/chia-dotnet/Message.cs @@ -1,9 +1,6 @@ using System; using System.Dynamic; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; - namespace chia.dotnet { /// @@ -44,7 +41,6 @@ public record Message /// /// Inidcates whether this is a response ( is true) and the success flag is also true /// - [JsonIgnore] public bool IsSuccessfulResponse => Ack && Data?.success == true; /// @@ -74,39 +70,6 @@ public static Message Create(string command, object data, string destination, st }; } - /// - /// Serialize the to a json string - /// - /// Json representation of the message - public string ToJson() - { - var serializerSettings = new JsonSerializerSettings - { - ContractResolver = new DefaultContractResolver - { - NamingStrategy = new SnakeCaseNamingStrategy() - } - }; - return JsonConvert.SerializeObject(this, serializerSettings); - } - - /// - /// Deserialize a from a json string - /// - /// Json representation of the Message - /// - public static Message FromJson(string json) - { - var serializerSettings = new JsonSerializerSettings - { - ContractResolver = new DefaultContractResolver - { - NamingStrategy = new SnakeCaseNamingStrategy() - } - }; - return JsonConvert.DeserializeObject(json, serializerSettings); - } - private static readonly Random random = new(); private static string GetNewReuqestId() diff --git a/src/chia-dotnet/PlotterProxy.cs b/src/chia-dotnet/PlotterProxy.cs index 5f369d67..b6abd11b 100644 --- a/src/chia-dotnet/PlotterProxy.cs +++ b/src/chia-dotnet/PlotterProxy.cs @@ -16,6 +16,7 @@ public sealed class PlotterProxy : ServiceProxy /// /// instance to use for rpc communication /// + /// The daemon endpoint handles plotting commands, so the rpc client should use the daemon endpoint public PlotterProxy(WebSocketRpcClient rpcClient, string originService) : base(rpcClient, ServiceNames.Daemon, originService) { @@ -25,15 +26,13 @@ public PlotterProxy(WebSocketRpcClient rpcClient, string originService) /// Registers this instance as a plotter and retreives the plot queue /// /// - /// The plot queue - public async Task> RegisterPlotter(CancellationToken cancellationToken = default) + /// The list of s + public async Task> RegisterPlotter(CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.service = ServiceNames.Plotter; - var response = await SendMessage("register_service", data, cancellationToken); - - return response.queue; + return await SendMessage>("register_service", data, "queue", cancellationToken); } /// diff --git a/src/chia-dotnet/PoolWallet.cs b/src/chia-dotnet/PoolWallet.cs index 3c50172d..2bebefc7 100644 --- a/src/chia-dotnet/PoolWallet.cs +++ b/src/chia-dotnet/PoolWallet.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Numerics; using System.Dynamic; using System.Threading; using System.Threading.Tasks; @@ -28,8 +27,8 @@ public PoolWallet(uint walletId, WalletProxy walletProxy) /// Url of the pool to join /// Relative lock height /// - /// A transaction - public async Task JoinPool(string targetPuzzlehash, string poolUrl, uint relativeLockHeight, CancellationToken cancellationToken = default) + /// The resulting + public async Task JoinPool(string targetPuzzlehash, string poolUrl, uint relativeLockHeight, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.wallet_id = WalletId; @@ -37,9 +36,7 @@ public async Task JoinPool(string targetPuzzlehash, string poolUrl, uin data.pool_url = poolUrl; data.relative_lock_height = relativeLockHeight; - var response = await WalletProxy.SendMessage("pw_join_pool", data, cancellationToken); - - return response.transaction; + return await WalletProxy.SendMessage("pw_join_pool", data, "transaction", cancellationToken); } /// @@ -48,15 +45,13 @@ public async Task JoinPool(string targetPuzzlehash, string poolUrl, uin /// Then we transition to FARMING_TO_POOL or SELF_POOLING /// /// - /// A transaction - public async Task SelfPool(CancellationToken cancellationToken = default) + /// The resulting + public async Task SelfPool(CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.wallet_id = WalletId; - var response = await WalletProxy.SendMessage("pw_self_pool", data, cancellationToken); - - return response.transaction; + return await WalletProxy.SendMessage("pw_self_pool", data, "transaction", cancellationToken); } /// @@ -65,7 +60,7 @@ public async Task SelfPool(CancellationToken cancellationToken = defaul /// Transaction fee (in units of mojos) /// /// Wallet state and transaction - public async Task<(dynamic State, dynamic Transaction)> AbsorbRewards(ulong fee, CancellationToken cancellationToken = default) + public async Task<(PoolWalletInfo State, TransactionRecord Transaction)> AbsorbRewards(ulong fee, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.wallet_id = WalletId; @@ -73,7 +68,10 @@ public async Task SelfPool(CancellationToken cancellationToken = defaul var response = await WalletProxy.SendMessage("pw_absorb_rewards", cancellationToken); - return (response.state, response.transaction); + return ( + Converters.ToObject(response.state), + Converters.ToObject(response.transaction) + ); } /// @@ -81,14 +79,17 @@ public async Task SelfPool(CancellationToken cancellationToken = defaul /// /// /// Wallet state and list of unconfirmed transactions - public async Task<(dynamic State, IEnumerable UnconfirmedTransactions)> Status(CancellationToken cancellationToken = default) + public async Task<(PoolWalletInfo State, IEnumerable UnconfirmedTransactions)> Status(CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.wallet_id = WalletId; var response = await WalletProxy.SendMessage("pw_status", data, cancellationToken); - return (response.state, response.unconfirmed_transactions); + return ( + Converters.ToObject(response.state), + Converters.ToObject>(response.unconfirmed_transactions) + ); } } } diff --git a/src/chia-dotnet/RateLimitedWallet.cs b/src/chia-dotnet/RateLimitedWallet.cs index 41add82c..5b5bad1c 100644 --- a/src/chia-dotnet/RateLimitedWallet.cs +++ b/src/chia-dotnet/RateLimitedWallet.cs @@ -1,5 +1,4 @@ -using System.Numerics; -using System.Dynamic; +using System.Dynamic; using System.Threading; using System.Threading.Tasks; @@ -46,16 +45,14 @@ public async Task SetUserInfo(ulong interval, ulong limit, (string parent_coin_i /// /// Fee amount (in units of mojos) /// - /// Information about the transaction - public async Task SendClawbackTransaction(ulong fee, CancellationToken cancellationToken = default) + /// The + public async Task SendClawbackTransaction(ulong fee, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.wallet_id = WalletId; data.fee = fee; - var response = await WalletProxy.SendMessage("send_clawback_transaction", data, cancellationToken); - - return response.transaction; + return await WalletProxy.SendMessage("send_clawback_transaction", data, "transaction", cancellationToken); } /// diff --git a/src/chia-dotnet/ResponseException.cs b/src/chia-dotnet/ResponseException.cs index cfbbe84c..d1cbfbe2 100644 --- a/src/chia-dotnet/ResponseException.cs +++ b/src/chia-dotnet/ResponseException.cs @@ -4,6 +4,7 @@ namespace chia.dotnet { /// /// Exception thrown when the RPC endpoint returns a response but Data.success is false + /// oro there is a communication error on the websocket of http channgel /// public sealed class ResponseException : Exception { diff --git a/src/chia-dotnet/ServiceProxy.cs b/src/chia-dotnet/ServiceProxy.cs index 35af958e..a069679e 100644 --- a/src/chia-dotnet/ServiceProxy.cs +++ b/src/chia-dotnet/ServiceProxy.cs @@ -76,12 +76,10 @@ public async Task StopNode(CancellationToken cancellationToken = default) /// Get connections that the service has /// /// - /// A list of connections - public async Task> GetConnections(CancellationToken cancellationToken = default) + /// A list of s + public async Task> GetConnections(CancellationToken cancellationToken = default) { - var response = await SendMessage("get_connections", cancellationToken); - - return response.connections; + return await SendMessage>("get_connections", "connections", cancellationToken); } /// @@ -124,15 +122,53 @@ public async Task CloseConnection(string nodeId, CancellationToken cancellationT _ = await SendMessage("close_connection", data, cancellationToken); } - internal async Task SendMessage(string command, CancellationToken cancellationToken) + // + // These methods are the important ones that package up the request for the rpc lcient and then + // parse and convert the response for the requester + // + internal async Task SendMessage(string command, dynamic data, CancellationToken cancellationToken = default) + { + var message = Message.Create(command, data, DestinationService, OriginService); + + try + { + return await RpcClient.SendMessage(message, cancellationToken); + } + catch (ResponseException) + { + throw; + } + catch (TaskCanceledException) + { + throw; + } + catch (Exception e) // wrap eveything else in a resposne exception - this will include websocket or http specific failures + { + throw new ResponseException(message, "Something went wrong sending the rpc message. Inspect the InnerException for details.", e); + } + } + + internal async Task SendMessage(string command, CancellationToken cancellationToken = default) { return await SendMessage(command, null, cancellationToken); } - internal async Task SendMessage(string command, dynamic data, CancellationToken cancellationToken) + // + // If the return is a collection, specify the collection type in the caller e.g. ICollection, IList, IEnumerable + // + internal async Task SendMessage(string command, string childItem = null, CancellationToken cancellationToken = default) { - var message = Message.Create(command, data, DestinationService, OriginService); - return await RpcClient.SendMessage(message, cancellationToken); + return await SendMessage(command, null, childItem, cancellationToken); + } + + // + // If the return is a collection, specify the collection type in the caller e.g. ICollection, IList, IEnumerable + // + internal async Task SendMessage(string command, dynamic data, string childItem = null, CancellationToken cancellationToken = default) + { + var d = await SendMessage(command, data, cancellationToken); + + return Converters.ToObject(d, childItem); } } } diff --git a/src/chia-dotnet/ServicesNames.cs b/src/chia-dotnet/ServicesNames.cs new file mode 100644 index 00000000..b7eb7b83 --- /dev/null +++ b/src/chia-dotnet/ServicesNames.cs @@ -0,0 +1,16 @@ +namespace chia.dotnet +{ + /// + /// The names of chia services. These are used as values + /// + public struct ServiceNames + { + public const string FullNode = "chia_full_node"; + public const string Wallet = "chia_wallet"; + public const string Farmer = "chia_farmer"; + public const string Harvester = "chia_harvester"; + public const string Simulator = "chia_full_node_simulator"; + public const string Plotter = "chia plots create"; + public const string Daemon = "daemon"; + } +} diff --git a/src/chia-dotnet/Wallet.cs b/src/chia-dotnet/Wallet.cs index 73f57529..6a95a9fe 100644 --- a/src/chia-dotnet/Wallet.cs +++ b/src/chia-dotnet/Wallet.cs @@ -38,7 +38,7 @@ public Wallet(uint walletId, WalletProxy walletProxy) /// Login to the wallet /// /// Always login before interacting with the wallet. Logged in state is kept on the serve so might have changed - /// an awaitable + /// The wallet fingerprint public async Task Login(CancellationToken cancellationToken = default) { var fingerprints = await WalletProxy.GetPublicKeys(cancellationToken); @@ -63,13 +63,14 @@ public async Task Login(CancellationToken cancellationToken = default) var response = await WalletProxy.SendMessage("get_wallet_balance", data, cancellationToken); - return (response.wallet_balance.confirmed_wallet_balance, - response.wallet_balance.unconfirmed_wallet_balance, - response.wallet_balance.spendable_balance, - response.wallet_balance.pending_change, - response.wallet_balance.max_send_amount, - response.wallet_balance.unspent_coin_count, - response.wallet_balance.pending_coin_removal_count + return ( + response.wallet_balance.confirmed_wallet_balance, + response.wallet_balance.unconfirmed_wallet_balance, + response.wallet_balance.spendable_balance, + response.wallet_balance.pending_change, + response.wallet_balance.max_send_amount, + response.wallet_balance.unspent_coin_count, + response.wallet_balance.pending_coin_removal_count ); } @@ -77,15 +78,13 @@ public async Task Login(CancellationToken cancellationToken = default) /// Get the list of transactions /// /// - /// A list of transactions - public async Task> GetTransactions(CancellationToken cancellationToken = default) + /// A list of s + public async Task> GetTransactions(CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.wallet_id = WalletId; - var response = await WalletProxy.SendMessage("get_transactions", data, cancellationToken); - - return response.transactions; + return await WalletProxy.SendMessage>("get_transactions", data, "transactions", cancellationToken); } /// @@ -140,8 +139,8 @@ public async Task DeleteUnconfirmedTransactions(CancellationToken cancellationTo /// The amount to send (in units of mojos) /// Fee amount (in units of mojos) /// - /// The transaction - public async Task SendTransaction(string address, ulong amount, ulong fee, CancellationToken cancellationToken = default) + /// The + public async Task SendTransaction(string address, ulong amount, ulong fee, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.wallet_id = WalletId; @@ -149,9 +148,7 @@ public async Task SendTransaction(string address, ulong amount, ulong f data.amount = amount; data.fee = fee; - var response = await WalletProxy.SendMessage("send_transaction", data, cancellationToken); - - return response.transaction; + return await WalletProxy.SendMessage("send_transaction", data, "transaction", cancellationToken); } /// @@ -161,8 +158,8 @@ public async Task SendTransaction(string address, ulong amount, ulong f /// Coins to include /// Fee amount (in units of mojos) /// - /// The transaction - public async Task SendTransactionMulti(IEnumerable additions, IEnumerable coins, ulong fee, CancellationToken cancellationToken = default) + /// The + public async Task SendTransactionMulti(IEnumerable additions, IEnumerable coins, ulong fee, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.wallet_id = WalletId; @@ -173,9 +170,7 @@ public async Task SendTransactionMulti(IEnumerable additions, data.coins = coins.ToList(); } - var response = await WalletProxy.SendMessage("send_transaction_multi", data, cancellationToken); - - return response.transaction; + return await WalletProxy.SendMessage("send_transaction_multi", data, "transaction", cancellationToken); } /// @@ -184,8 +179,8 @@ public async Task SendTransactionMulti(IEnumerable additions, /// Additions to the block chain /// Fee amount (in units of mojo) /// - /// The transaction - public async Task SendTransactionMulti(IEnumerable additions, ulong fee, CancellationToken cancellationToken = default) + /// The + public async Task SendTransactionMulti(IEnumerable additions, ulong fee, CancellationToken cancellationToken = default) { return await SendTransactionMulti(additions, null, fee, cancellationToken); } diff --git a/src/chia-dotnet/WalletProxy.cs b/src/chia-dotnet/WalletProxy.cs index 611ba60f..a5b45e4d 100644 --- a/src/chia-dotnet/WalletProxy.cs +++ b/src/chia-dotnet/WalletProxy.cs @@ -3,12 +3,11 @@ using System.Threading.Tasks; using System.Collections.Generic; using System.Linq; -using System.Numerics; namespace chia.dotnet { /// - /// Proxy that communicates with the wallet via the daemon + /// Proxy that communicates with the wallet endpoint /// public sealed class WalletProxy : ServiceProxy { @@ -33,7 +32,7 @@ public WalletProxy(IRpcClient rpcClient, string originService) /// The fingerprint /// Indicator whether to skip the import at login /// - /// a key fingerprint + /// The key fingerprint public async Task LogIn(uint fingerprint, bool skipImport, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); @@ -52,7 +51,7 @@ public async Task LogIn(uint fingerprint, bool skipImport, CancellationTok /// The fingerprint /// The path to the backup file /// - /// a key fingerprint + /// The key fingerprint public async Task LogInAndRestoreBackup(uint fingerprint, string filePath, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); @@ -70,24 +69,22 @@ public async Task LogInAndRestoreBackup(uint fingerprint, string filePath, /// Get the list of wallets /// /// - /// A list of wallets - public async Task> GetWallets(CancellationToken cancellationToken = default) + /// The list of wallets + public async Task> GetWallets(CancellationToken cancellationToken = default) { - var response = await SendMessage("get_wallets", cancellationToken); - - return response.wallets; + return await SendMessage>("get_wallets", "wallets", cancellationToken); } /// /// Get all root public keys accessible by the wallet /// /// - /// all root public keys accessible by the walle + /// All root public keys accessible by the wallet public async Task> GetPublicKeys(CancellationToken cancellationToken = default) { var response = await SendMessage("get_public_keys", cancellationToken); - return ((IEnumerable)response.public_key_fingerprints).Select(item => (uint)item); + return Converters.ConvertList(response.public_key_fingerprints); } /// @@ -95,7 +92,7 @@ public async Task> GetPublicKeys(CancellationToken cancellatio /// /// The fingerprint /// - /// a private key + /// The private key for the fingerprint public async Task<(uint Fingerprint, string Sk, string Pk, string FarmerPk, string PoolPk, string Seed)> GetPrivateKey(uint fingerprint, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); @@ -110,7 +107,7 @@ public async Task> GetPublicKeys(CancellationToken cancellatio /// Get the wallet's sync status /// /// - /// sync status + /// The current sync status public async Task<(bool GenesisInitialized, bool Synced, bool Syncing)> GetSyncStatus(CancellationToken cancellationToken = default) { var response = await SendMessage("get_sync_status", cancellationToken); @@ -122,7 +119,7 @@ public async Task> GetPublicKeys(CancellationToken cancellatio /// Retrieves information about the current network /// /// - /// network name and prefix + /// The current network name and prefix public async Task<(string NetworkName, string NetworkPrefix)> GetNetworkInfo(CancellationToken cancellationToken = default) { var response = await SendMessage("get_network_info", cancellationToken); @@ -147,15 +144,13 @@ public async Task GetHeightInfo(CancellationToken cancellationToken = defa /// /// The id of the transaction to find /// - /// A transaction - public async Task GetTransaction(string transactionId, CancellationToken cancellationToken = default) + /// The + public async Task GetTransaction(string transactionId, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.transaction_id = transactionId; - var response = await SendMessage("get_transaction", data, cancellationToken); - - return response.transaction; + return await SendMessage("get_transaction", data, "transaction", cancellationToken); } /// @@ -196,7 +191,7 @@ public async Task AddKey(IEnumerable mnemonic, bool skipImport, Ca /// The fingerprint /// The path to the backup file /// - /// a key fingerprint + /// The key's fingerprint public async Task AddKeyAndRestoreBackup(uint fingerprint, string filePath, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); @@ -231,7 +226,7 @@ public async Task DeleteKey(uint fingerprint, CancellationToken cancellationToke /// The key's fingerprint /// /// - /// idicators of how wallet is used + /// Indicators of how wallet is used /// public async Task<(bool UsedForFarmerRewards, bool UsedForPoolRewards, bool WalletBalance)> CheckDeleteKey(uint fingerprint, CancellationToken cancellationToken = default) { @@ -262,7 +257,7 @@ public async Task> GenerateMnemonic(CancellationToken cancel { var response = await SendMessage("generate_mnemonic", cancellationToken); - return ((IEnumerable)response.mnemonic).Select(item => item.ToString()); + return Converters.ToStrings(response.mnemonic); } /// @@ -293,7 +288,7 @@ public async Task> GenerateMnemonic(CancellationToken cancel /// /// The coin Colour /// - /// Information about the wallet + /// The wallet type public async Task CreateColouredCoinForColour(string colour, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); @@ -317,7 +312,7 @@ public async Task CreateColouredCoinForColour(string colour, CancellationT /// fee to create the wallet (in units of mojos) /// /// Information about the wallet - public async Task<(uint Id, byte Type, dynamic origin, string pubkey)> CreateRateLimitedAdminWallet(string pubkey, ulong interval, ulong limit, ulong amount, ulong fee, CancellationToken cancellationToken = default) + public async Task<(uint Id, byte Type, Coin origin, string pubkey)> CreateRateLimitedAdminWallet(string pubkey, ulong interval, ulong limit, ulong amount, ulong fee, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.wallet_type = "rl_wallet"; @@ -331,7 +326,12 @@ public async Task CreateColouredCoinForColour(string colour, CancellationT var response = await SendMessage("create_new_wallet", data, cancellationToken); - return (response.id, response.type, response.origin, response.pubkey); + return ( + response.id, + response.type, + Converters.ToObject(response.origin), + response.pubkey + ); } /// @@ -380,7 +380,7 @@ public async Task CreateColouredCoinForColour(string colour, CancellationT /// Filename to recover from /// /// Information about the wallet - public async Task<(uint Type, string myDID, uint walletId, string coinName, IEnumerable coinList, string newPuzHash, string pubkey, IEnumerable backupDIDs, ulong numVerificationsRequired)> + public async Task<(uint Type, string myDID, uint walletId, string coinName, Coin coin, string newPuzHash, string pubkey, IEnumerable backupDIDs, ulong numVerificationsRequired)> RecoverDIDWallet(string filename, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); @@ -390,7 +390,25 @@ public async Task CreateColouredCoinForColour(string colour, CancellationT var response = await SendMessage("create_new_wallet", data, cancellationToken); - return (response.type, response.my_did, response.wallet_id, response.coin_name, response.coin_list, response.newpuzhash, response.pubkey, response.backup_dids, response.num_verifications_required); + // this gets serialzied back as an unnamed tuple [self.parent_coin_info, self.puzzle_hash, self.amount] + var coinList = response.coin_list; + var coin = new Coin() + { + ParentCoinInfo = coinList[0], + PuzzleHash = coinList[1], + Amount = coinList[2] + }; + return ( + response.type, + response.my_did, + response.wallet_id, + response.coin_name, + coin, + response.newpuzhash, + response.pubkey, + Converters.ConvertList(response.backup_dids), + response.num_verifications_required + ); } /// @@ -401,7 +419,8 @@ public async Task CreateColouredCoinForColour(string colour, CancellationT /// Delay time to create the wallet /// /// Information about the wallet - public async Task<(dynamic transaction, string launcherId, string p2SingletonHash)> CreatePoolWallet(dynamic initialTargetState, ulong p2SingletonDelayTime, string p2SingletonDelayedPH, CancellationToken cancellationToken = default) + public async Task<(TransactionRecord transaction, string launcherId, string p2SingletonHash)> + CreatePoolWallet(PoolState initialTargetState, ulong p2SingletonDelayTime, string p2SingletonDelayedPH, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.wallet_type = "pool_wallet"; @@ -415,11 +434,13 @@ public async Task CreateColouredCoinForColour(string colour, CancellationT var response = await SendMessage("create_new_wallet", data, cancellationToken); - return (response.transaction, response.launcher_id, response.p2_singleton_puzzle_hash); + return ( + Converters.ToObject(response.transaction), + response.launcher_id, + response.p2_singleton_puzzle_hash + ); } - - /// /// Create an offer file from a set of id's /// @@ -441,15 +462,17 @@ public async Task CreateOfferForIds(IDictionary ids, string filename, /// /// path to the offer file /// - /// The dicrepencies - public async Task GetDiscrepenciesForOffer(string filename, CancellationToken cancellationToken = default) + /// The discrepencies + public async Task> GetDiscrepenciesForOffer(string filename, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.filename = filename; var response = await SendMessage("get_discrepancies_for_offer", data, cancellationToken); - - return response.discrepancies; + // this response is Tuple[bool, Optional[Dict], Optional[Exception]] - the dictionary is the interesting part + return response.discrepancies is not null && response.discrepancies[0] == true + ? Converters.ToObject>(response.discrepancies[1]) + : new Dictionary(); } /// @@ -461,7 +484,6 @@ public async Task GetDiscrepenciesForOffer(string filename, Cancellatio public async Task RespondToOffer(string filename, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); - data.filename = filename; _ = await SendMessage("respond_to_offer", data, cancellationToken); @@ -472,27 +494,23 @@ public async Task RespondToOffer(string filename, CancellationToken cancellation /// /// The id of the trade to find /// - /// The trade - public async Task GetTrade(string tradeId, CancellationToken cancellationToken = default) + /// The + public async Task GetTrade(string tradeId, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.trade_id = tradeId; - var response = await SendMessage("get_trade", data, cancellationToken); - - return response.trade; + return await SendMessage("get_trade", data, "trade", cancellationToken); } /// /// Get all trades /// /// - /// The trades - public async Task> GetAllTrades(CancellationToken cancellationToken = default) + /// The s + public async Task> GetAllTrades(CancellationToken cancellationToken = default) { - var response = await SendMessage("get_all_trades", cancellationToken); - - return response.trades; + return await SendMessage>("get_all_trades", "trades", cancellationToken); } /// @@ -516,7 +534,7 @@ public async Task CancelTrade(string tradeId, bool secure, CancellationToken can /// /// /// The amount farmed - public async Task<(uint FarmedAmount, uint FarmerRewardAmount, uint FeeAmount, uint LastHeightFarmed, uint PoolReqardAmount)> GetFarmedAmount(CancellationToken cancellationToken = default) + public async Task<(uint FarmedAmount, uint FarmerRewardAmount, uint FeeAmount, uint LastHeightFarmed, uint PoolRewardAmount)> GetFarmedAmount(CancellationToken cancellationToken = default) { var response = await SendMessage("get_farmed_amount", cancellationToken); @@ -530,8 +548,8 @@ public async Task CancelTrade(string tradeId, bool secure, CancellationToken can /// Coins to include /// Fee amount (in units of mojos) /// - /// The signed transaction - public async Task CreateSignedTransaction(IEnumerable additions, IEnumerable coins, ulong fee, CancellationToken cancellationToken = default) + /// The signed + public async Task CreateSignedTransaction(IEnumerable additions, IEnumerable coins, ulong fee, CancellationToken cancellationToken = default) { dynamic data = new ExpandoObject(); data.additions = additions.ToList(); @@ -541,9 +559,7 @@ public async Task CreateSignedTransaction(IEnumerable addition data.coins = coins.ToList(); } - var response = await SendMessage("create_signed_transaction", data, cancellationToken); - - return response.signed_tx; + return await SendMessage("create_signed_transaction", data, "signed_tx", cancellationToken); } /// @@ -552,8 +568,8 @@ public async Task CreateSignedTransaction(IEnumerable addition /// Additions to the block chain /// Fee amount (in units of mojos) /// - /// The signed transaction - public async Task CreateSignedTransaction(IEnumerable additions, ulong fee, CancellationToken cancellationToken = default) + /// The signed + public async Task CreateSignedTransaction(IEnumerable additions, ulong fee, CancellationToken cancellationToken = default) { return await CreateSignedTransaction(additions, null, fee, cancellationToken); } diff --git a/src/chia-dotnet/WebSocketRpcClient.cs b/src/chia-dotnet/WebSocketRpcClient.cs index 53f64071..e810ffba 100644 --- a/src/chia-dotnet/WebSocketRpcClient.cs +++ b/src/chia-dotnet/WebSocketRpcClient.cs @@ -3,20 +3,16 @@ using System.IO; using System.Net.Security; using System.Net.WebSockets; -using System.Runtime.CompilerServices; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Diagnostics; -[assembly: InternalsVisibleTo("chia-dotnet.tests")] - namespace chia.dotnet { /// /// Base class that handles core websocket communication with the rpc endpoint - /// and synchronizes request and response messages /// public class WebSocketRpcClient : IDisposable, IRpcClient { @@ -47,7 +43,7 @@ public WebSocketRpcClient(EndpointInfo endpoint) /// Opens the websocket and starts the receive loop /// /// - /// Awaitable Task + /// An awaitable public async Task Connect(CancellationToken cancellationToken = default) { if (disposedValue) @@ -175,8 +171,8 @@ protected virtual void OnBroadcastMessageReceived(Message message) throw new ArgumentNullException(nameof(message)); } - Debug.WriteLine("Broadcast message:"); - Debug.WriteLine(message.ToJson()); + // Debug.WriteLine("Broadcast message:"); + // Debug.WriteLine(message.ToJson()); BroadcastMessageReceived?.Invoke(this, message); } @@ -203,7 +199,7 @@ private async Task ReceiveLoop() _ = ms.Seek(0, SeekOrigin.Begin); using var reader = new StreamReader(ms, Encoding.UTF8); var response = await reader.ReadToEndAsync(); - var message = Message.FromJson(response); + var message = response.ToObject(); // if we have a message pending with this id, capture the response and remove the request from the pending dictionary if (_pendingRequests.TryRemove(message.RequestId, out _)) diff --git a/src/chia-dotnet/chia-dotnet.csproj b/src/chia-dotnet/chia-dotnet.csproj index c11add61..0752502c 100644 --- a/src/chia-dotnet/chia-dotnet.csproj +++ b/src/chia-dotnet/chia-dotnet.csproj @@ -5,7 +5,7 @@ chia.dotnet true true - 0.3.0 + 0.4.0-alpha.3 dkackman dkackman A .net 5 client library for chia™ RPC interfaces that runs on linux and windows. @@ -16,9 +16,11 @@ https://github.com/dkackman/chia-dotnet git chia - 0.3.0 pre-release - support https endpoints -BREAKING CHANGES: https://github.com/dkackman/chia-dotnet/discussions/10 + 0.4.0 BREAKING CHANGES - static typing chia-leaf-logo-384x384.png + + 0.4.0.3 + 0.4.0.3