github.com/deroproject/derosuite@v2.1.6-1.0.20200307070847-0f2e589c7a2b+incompatible/transaction/transaction_ringct_test.go (about) 1 // Copyright 2017-2018 DERO Project. All rights reserved. 2 // Use of this source code in any form is governed by RESEARCH license. 3 // license can be found in the LICENSE file. 4 // GPG: 0F39 E425 8C65 3947 702A 8234 08B2 0360 A03A 9DE8 5 // 6 // 7 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 8 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 9 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 10 // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 11 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 12 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 13 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 14 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 15 // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 16 17 package transaction 18 19 //import "fmt" 20 import "bytes" 21 import "testing" 22 import "encoding/hex" 23 24 import "github.com/deroproject/derosuite/crypto" 25 import "github.com/deroproject/derosuite/crypto/ringct" 26 27 // the tests are here because data depends on tx which is currently part of blockchain 28 // once a new Transaction package is created, these test can move directly to ringct package without major modification 29 func Test_RingCT_Full_block_72_2c4738d3856e8e3e8f9fc4818a9197d4911af3010e067ec56d08c264627cb547(t *testing.T) { 30 31 // this tx is from block 72 32 // tx_id 2c4738d3856e8e3e8f9fc4818a9197d4911af3010e067ec56d08c264627cb547 33 // it is a ringct full txt 34 tx_hex := "0200010200050401030301b27b6cf2e0dcfc35f2767608cace34e59b1d507d3ef6c5ad7142a1c3aad0d860020002b9ca87703ad2b72bd3bad724a42d3569ac107c6fa8cae194fbcd560cabc1abd50002d76035fd955ef8b10513f95d11fd7a579bcc1db343be0ddd67d656c505061d0a2101cbd8cdb9b2bd3cc79b720a124c16c5eae988ff2248681dd1db25dc146e8923760180a088b78303b918962e3d710e3fa38942f1b7973d9e5038dd634a1b0013a795ad362dff4c07c8aab3a0983d712894adc5a5ab95e20d27c0a4176b3dfff40abf5914db35ad0372a81534185e2e277d6e97edb519aff7bf15ad5787a69645dbf852243492bc0d23a8c131e046440fe14405725b8c23a4e1b0eaec7599b0e4f95c491f469a7c05dcad515f5c209469702fbd6e5ce3f31a19cf8e357105ab65b041a6b5659fd2e7f43a5705a5c430faa8919a9cac7916a3587b95f90b286fb613c83571164ec345e3ac3fefeba9cb534eb200f1cd414e1ba08b42d572f5683093675c7c7393c30578c243f58df05209153d60ac583c1fec19d34de1c9ac50fc2508ef3a0c101603fe6689822ed4ea38ae22b8ab49b5ce1c1f5f695d79e4fdcd0545b8be5ead280ae4956b38254385d155662b146156ea716003da11facc8069b5b80306394e480c03333d6d8c81464547a3f1554c3b14bc4cab044594ca8f154065f02fd2b91e0d5d1fbd231cad765476bdd145732ebef719000a4547fde18372a06997237a53098f948d034477d034cbb037ce9861dd62994a4c9280e3f6865a9bfb999b2f600e5c2b59b6b576835014b89d095630e2e0bcb2533da55d94459db12e3a6539d70f1159c56d03d32eb7bb692f6ec469987266bd6e700a644b70060b1df9ba1ab405ba58abdcd95d5df5dce80e12c2fb15dbc5fc48d661da51663fec085d4597dd071a17c579d217e1af98b14d5e94ed65255f4ab86b6735749e3e4ff458d930720297ab3d5361646c616999e9d9895b2ecba08802f3df046c81a614483660d4430ff336be4bd999056102feeba4af5caf69e0eb9c8c95ddbba4b77aa1715c10da0e2fdbce23691327c0cf531aa0acbc3c80ca84a242c56200230bb20f39f226650b398515af0eae95bcfa0f5833b45692e00182dec2e4546f49c4e3928273f2790e30da038a905bd4ee0eefc38bb761aa7281ef13b6e664bd9b333c739ed9aeed0783e6987bac3c0f3de463de521ab6f88a50dbbb368f3ce13d463c2f39a674c605f834c4ebb9195626d17c14ed8822abd4946908ebeb097f8f90e4482d12895e0a7308eeddc1efb989d14188abe164ce80a742f1c23621e0f881676e0508a6d10cbf4f40c71c41d47b63705738609fcc6a561899a3a295f91178f61c8f23bc09022fe425b5db9e7191220594cb711b68ec383afdd2073779069ba9d23fe0b53d041a4c95bbed2aedfbc7793189c0f9e1f93d8addc088e9f9c964f8804e383c020513c8ef12e99b90f73b5dbdb6ea82a50e93d74e8e50a07bda15a8fbcdf76e9e09f996d276c9611939cac7b5a3a13c3edec0241b9fcb2c3600146c056519f5ac0473da3a9a4cff0c744b30e18883396822daaf70307c0ee818863f3835a6d9fd0fb6c4cdf98895267a407ae3042d5e422389cac50723a2565724d4de7047d1d703b469bad46b46f9e6ce8e27ef33b00b24570c3560e1443a15d62124b391509f02e85e9c8ebae05ee533c0922b3bd6cc00ccea4167ab7370f615501976553c350b6f7b21f592782476bdf87acab34d53365aa76597ef8db3e4cb2022fa06b75f010ad2d259d139e592bbd52cbe4a9aeb3697c3a5ef726bb86d550c043d2046ef01429ff761fe175632253b7752f2106954c1cb569e513b36452f4d91a93c750001d8e75312c2be5fed07d2dbce8bdf4daa9d5fc161135e83ca61d828565aa3310c4b09004486285c738f7ebc55361f97a05e608e99a2e771c51f559230d264580ee61d8bc4e96ed132ce187be8f069aacc7d72ee216cf311184a1e08daf9a18c0bb07db1ecf5dacdd266ccd4767e2b8ef6c6ad066db45af7d68af29a54ba50cf076ecf21c2e24eef9d27ea635ce0260769c7c76c386a98f2fccda1f52e8495870f2b28149b9f15ef41111c4db005fda31e46625914bab04c5bf293ec0154530f04002bb7fdebc041bcce84ceceb22ee2b3ec7959a32cb6dea38c274b5f6c140009c18f67dbc949f9a4c10b1b3c709335d3991f55bf78613dbb85a9366d52ff7b03468ecc848d2bf68ea3840f40c6621c72c3eda4fdb44261b08bdd8a1ad281e309ca9459d6cb2348ba736b20e55f1c6608c5de6a29523a9575398c9d2bad213304eadc57428c5435cbe8926df2481a31bf0301c69dea0064c18e1ff958e398ec0317d03723cf698698c06403e1f93dea759d801a30f95728db04d3e1a1383feb027da8683e4e5708a5290ff14235d9fda14e9f2c0cae514d058224fd02cdced3067ba2df876ea5f6ba6d2523a53fe33290500c954845fb517173d5ed3b1c86d00fa6066e7dbb523e3c5e61561a003ea95609537eca80b3612ae21c0fe21787f6067a82f20e965062e21403d43d9f4f3dc20a53ed86a72887eb103187ae1ad24504874e565fee47b6679252f35e63fa7ae2521c832f5410fa07ca47bf4a3233ce013ef73d29366c7882a7514d8bb1b6382c587bbd9d4a769fa00f4921afcad9da04d67f8d6795591614b3321a3a45b58c0938102e96ed1ca4c1bbadfb49db33e700b67e84b16e69b6ac24dd5491ef58532abbd513579019df1f9edab7c656686d0df0157db9526307cd81fbfe79a1d3372f4d05946449c88a2a68dfb80522eccb0d661fe7fdd0773fdc67c65839ddb77ff9b3890a52f94e0536620ac3eedfa7940b88d224e7caecbdbc12077d19516f7f3d47625c093d84778a9aff02a8ed4ebe0ad9551ac8f4d59c93bcbd4f5e02686b47f14b48ea8cf15ca4368a946049b6a40b75f28dc053ee8f36a03a51a119c45994b4d7f03422ee437567b1d8269de62104250e6aa8659c6edbf794f60e19c983349ed92edda1fc164f6bd325ba97ab3b02bf83968b74b7c6a9c171ee7798713ccb578ddd7aea14f9215490d98d75ccda03dbd2a38666d7cc8792c80afa931fee64785e1a3156617724f8d7e934fa56c20cc8e9e8965c847794a31b1e5774ac547766ae8603d08022e07bc66f5336139e01eb1b92685611bfd1b907d5d8a72bee15c8f12c2dd685282662860df331a89303c1e2125eeaa08e5bd09ce42b604f6375df5a987080457d0b2d111a82482b030efd2967f096f3e307d114361cf5d88af7d151d573c9800172b7481a95465aff0df8858fa3d4f8c9fc089f90a5766662337e6ab89c37e596917fd92bee8edf430ac71519138f633492c6325aaba4b240cc347479fa26c77138b07fa82b00bc12063710a21290ed2d6d60d9accba8ffc1e4f501c98fb5b4355bc91b0e8788c92f09ce59a51153e0772704212c3d0dc6ec01b9296926e1254acbbff73f25d096e20cd4c86621e609e04df77078e5939aa979be5f2e571b3b422113ddf3b7f11ea704ad61bc954526dfc9bd0ecc339d83446088bebefe1e6dec08709c7dcbd07846069d448776291e202ee003fb51b0c765b10ba7a3c022fce045bd0c04163636b602e06eab18acd86a108bdfd42a8c5ae3314f7726ef35d12d54054402eb32c7740aac15f3a1fd09aaecc13aae4095b03b6fc35a17a62cde59916f07aa5b2abb190d8631490179f472fae6b8ea4b229fe8ed6a8143b5054ccc7b36b7fa0ec6c0110fe064d130b183e70a3ca36927744b8e14dea1d89778601579fb76076b157e2b0515ab0da39da3b2e33d9a153d6006ee8da09b7628066d0f7e1f9207fcf6b68d03085987c906a67c4949e6104444bce8db96481523bb5182e65cefae237c08a80c68fdbba091bbabb038342b330cbfaa62dd3aaac2f39134029c78b368235ff209eb7056b022dc5e6f0bb0e344c310554fd01043a3a0092b446b3dea67f7bde90f6bdfc86a9dd20a83bd0c13f297476b0957fa7b2020bbf258cf0f15ec4af35b0b7fc884c53e1d81e742c73194ee68c47e7d2a17dbcde1599f10cceb75b48f9b0f72fc84d9f359784d69bb0d4f8ff745e6d14421c5b867b69b7468c899cf8e3208673942dcf195da4c7674b4603023cd4e9740fc949a535329144a509084754a09a7d7f93f3930110ea12b1e59936832671ed9c338ed7b12537280db0e3552690625759f2def660f20c30d3b62bca5d10b5a85c2d3a323c428b264f3fca5cda2007f9cc73babbb4113417f195b964e4215e7d06c9f5f2b2984452f5cd0562a660d53b47804be205be45132673a0e87e9b358d188a4bb13f308dfd48e7d3a19cc00cdaee3472b64270d61509025f63d011fea544e4bd406713b3a96189d51926e0a0d4978cac42ac91e75f00af0c556f85c578e9c8cc130a720c8bb691047d4ed0b86a4600f19eeeab92b6c06e3a75f452ce3239f6008db5a20fe95231c9063920d5153d78ba0d47fdfa7b79f6f726bb2161d36bc85136a5f4f4d82b1e6c083b10fded692fe72de12c4984236d1b25bda589712b8d3c66edaed40e94469fdbe700013f834241a6cfb42eaf841d6c4db5b8349b1fd2e56e36b30ea16c56bc5f9bf0e72ffbc2726568acb459f285ce90eca77e2f74bd88cbc6c8d74ed76ea35031d02fd1f129c63e7b2c0b2cfaa223c07321759658ae50360e3e775f0fe71fbeaf405b2a0f552b73d6790869f3436c2f3c736c6a67e6c6dd5a2761e83b88b3399bd02a8103b4b3656b947f2b713dfc453290f0c9bb4d2064e7f51ccf14169d80c0a064f22df85734e06e3055b00d2034e5a5e2cbacb0dc2cc663dad72a638581ea1090ed7a972cfd74e693887a43ba97bdd895109387f530ccf78e1aa4a19a110150f79710c93fe6e630732a6ebc88e0592f042a1bd56f4d8f6ce39e6c1fb2b348e087434bfa3778d205f3058f621711a41681962cdc9d0afe3973714ad80df48960968859d1f47f2366f3d7fb2b62f89715f603475d84e70ee690485dbe579b6300929711cbc966646400f2e6cfc62e370b614427648349634d0bd2ee6149637d3072d2b67859ace2ac967008fd5265aa2b1487a2057ece59e31482ea7b8df517404c2c92f59f55013b79b111b6d193855e5d4eb10e23b816b95644a1e61c7bcc00fda604315d9b884472f051ac13aa7546dfc784b72d7be2dadbdfe7900acc884057becad608b1d379e920f129c5f3a40af6a9d032fc45746f95236dd294efa0c0206fef604277f428f91e15f729a4b073ce12253f9d71c8b528c650c68dab076064b7ec6b0bda314dcb5602b6e892b5f31f032626ea6daebcf00e3f065153afd0c9c107cb4575d14cd35a72dbe72926e1b1986f528344b48b6c6bf817ae0bc9e0fdd9609461fc8cd76c972f028fb462db6c45bceb305812c54788f78602e5e1c01d4b11d6a580e93fab23495e9196eab78e4ff6ebf503e2d9414e8b8e1e5467d02fc1485ff7770e55656b9dcad13e91977379d670246e930d2d1661ec6ef31fd07479c8a9e42533c3328fc9e06bb09daf0e4383ed01394f4ce141c348998f8ec0e232848dd1612e5a8e29c1e50388a52fed2dc454d69ee3feae06d5ed44260530d8b918cc3a38ab589c58f7d855b3b93e5308491b56c6db8459ef7689f6b65d4084948a2c640b270a532d9b9310f600f0e5344d036a62d8f8d070f2c2a581b9a0414ddebe3a2d7afca247a7620ceb4970ec165ea7f0f4b65921ad5b72fdd0e7309b0c5bbc5409047e4a69214c213f6de201fd9705910c271e00d68731e28452604d40e5745098f04af5101d4fcb82351d763b2932807a07910afe31e09f6a199041305c50e8a5ff91464a19da5c06595e4a9398f692cb63dd920cde0a561f618067fa96a1c8aa1bb12012648fda97b16d1f6afe278af426458422c8198ac701f0212b1d43e6fb11c8ada3b3f79c16a6121c9d6fc51125223fc1c2929dea48dc60331d265346fadd531c2a1f7e78fae8c090e8b2353b0f79b58b1974428f7ba2908c6ed42728cfd69ef902800104eae20745161c3b1d07e2313ce4f3f281093c60ff0a47bf7f2006666bbdb4ce7a6e620a546ea61cebef87828d5dfa167b5e509013b9bef499c3e926ca9c0c961920639caa0e630a3b24c8a524f3e64289778030d425399eaba73c14af22f91017982fdfbe0dc118ade0257dfcd4e40643fd9a702c4b72a3044df7b9d0a8cd098e443b62cb6dc7926064a1375c464b372102f050c873d95d1de2d084d97a8ac1fe73f4530caba213c790e3170a7c50b2a460c0602c4a32a44ca512ca7f3edb4f808118cd0af067741985d59dc693ed15383add649552c8c4737e649bc357445a0ac85e38433cac3e9cc45046108d008c04cc3b83b55d04c6434c011f6133d71e109fd088081368f694831e0687530ab7112d0287f20ddf2df27f5646e0cdc2f7a7bfb5d65202dc53a3d735856c895a1d340b64f22638ae26368f32040d627402784993690e829c763ab4d4896f1159f5b2c7d4ffc5461952c57eeeac0d54170000f1eee31452a5c356a32e90af93211322c1c6a617ec29da1d685edbe5322bea3d041c2d8237e47ae977c48199a06e601dee206ec9fb45ea5ea69b6c29deb597e8e848f35d4096e84d0e3cedbb6fce1ad6894b5866acb5eb6bef69833b9bd4328f36becdd1ae503305889f40bf1af3d06eac1517b6ff7ec977b1831efed15da93500e1852eeefc1c99ea82e74f26c5dfb109304738bfe8b667e9ead0df23d1c3536d0afe1b22a907dfd4099aa071ca78a35cdcf0bb61973c8050aa6c1d668207a4c7439ac71110673bc4d2a4f79e87e45b287cf7a156430e07c4669947d47ba861ae2bc77942c25304947021a3efbc120062d9f4466dc59acadab8542c2aa3784d6b92511caa3a16318220beb872d44193e2fd2b8afa174700aba3f9842e621cbd955d4e33c05b2b9a0693fd2dee7c6ff832734926fdac894e6e7fad4602063f502748863f50110a4577d850fc5146b5292bfb1ec4444d51ae9d8f83b7029cf31b763874b3784c4f7a5cc3d40b05223cae404a854cb5cbb4061678c951b20b786709ab5b36add00f2e0bbe6c37c0fa197c805ff50961d7c9a3c30d994b4a489d82dfcf167c7613c57b3197aaf3a3629b4e7fd4759f7d74ce715c908b1dfaf3c13afd7f767b2aa4650bf5cb463ef8b732686a84f14e78e320d77639d72630bf7a7d5c2bba545033b7dfcca089e486977068a6c80017ecf71cb223d8b6eae99b2f857cb600a02fc1487366813199307bcac1ddcace3da6d788ffd94db9a9d674828ae0b900425020531f0bf7ddb470e75568cee0e54f5b875cbadac758f248d07bc98a3a6361c0da6fe4dae978467e59cabf672d5aa56c7005d4b1bf6049069197d4214bea2911966add2467b746569c17e909e2b93f574f1c03f1b2d2ac595cc88e2f839b852e07b53d712b9a028b7405d2dff33adf172be9ad6853c3244b985a49793657d2b4ecf97f5b7aa7c2621379f02f8e7fc2e72dd6df35881f3b8864b06ac00077ff8caf90998858025059398fb9985c9c63632249d006c4aeeae760b7c040174a35334cdef63e8913534091f0f1bdb9cfcbfd7d634e8cc87eb2932ba23de5dd611b538e33b1883bcbfa00b4c228736a632d5eea04fd519daa4be4adb45e17675def3d5dffca0bba0ca8d1293e42087b1c75c90c36f288244a6c99c5d42cb5c9bd02b6999e01321a3ddc2f30e6c2827a63232a5e684e7e2d15c2ed821317f586c89774031a975dd6dc2be0ffdab2476b8e39a087b703cf7013c59a8a9e49a08527622d55336d0442a2fc76fd199be6886aed11e34f55df9abe5e72177bb74bca8d8200c5ad800b7e485c2cf04ff513974f7a67d9df7b79dd2d6a0bb72dcd7d449e7c8a4415a5b18f6a071cccbbe084b97bc5413b9e3b1e629d083859ef560d18dd4a1731f4ba26808a6fc7b6920ce128068181e22566260de418a93d7fc144e5366bd640fcb08b47286a20525fc17a50a1d4f8f01cf31e1ac5930f233e11f16f7cfc0d75c22a26e1b928e1f690677a820990f0d8f0cb725fe6f142179caa96c59c1f7bc7ff92c975a5cba9fb24d388a41aedebe54408b221e9fde3beffc35a65117ce070fb59dad7746bbf6410c990dea68c20697569a770cb11869b15bb0c46bd4c4fde912d54e84f483ac4e13e238c05005ab69e308dcb4e6f5006041b86ea63bc21281f465b3576d5cf62155ade0d535e099dadaf10570b5f2b0389223310bba2a6bc021bbf2e4c741df1644a2405f39e89dc74877738bc74c1216e23f26a4db66d490f67e5cdd9761e0ddb5b47b199ff8c7e4373e1a21502852bbed7de6f06eb3a4bb28f517638d1409d461b7a9ba5dc3e5939e8d828b11f0ee5cb23fae7d06d19e88a7f8584d557a4b0326197ae51ee4a96bcecd79a1151627e53907a77766bda2727ad3fc280049ef5537fbbe96d951a7d34e1f61e9b00942a79ec4645d2f47edb95b1e4182e57a3fd0631118dc78fe901e37604c0042b6bcf23c503cb6867e377230f2790fb38e42bae1e397b655ff56dbaf7b1571ebc1d77a9cc960a87a5ad0bbfc77e7629290d3d4e7c6183296d342a18337353495979ad55cd7d349896fd7e411f147521034dcfde8d0ffec3bd16c31e887909a6a293d74fb3b9e6ade460416dd18e3d55e16d7882323bcdc5b49c835cc7cb50f993bac540c89d96aca7d5ea94dd107de5125e7f9162a9aab9c84c39eb8430952eb971510dc58e81ad25ccacac867a69db300e8098a54fa7b4dbf41a7f251d8263999d29c6a16e4f3fc728db5480db9e10f9ac7109156de29517737f8bdf4af7cc572ee8b9f6994815860af6cafc6c3b67d340513b85d832eab12c13cc50322f687553e945ed00d26f97411b5dc718659f8b8e6b57b93a4a94e51c9b84ba9548047e28999864f9fe8d5c618aefdb06c0e6ccb3db46e17f95d58f45c8db3e26ebec1d73cc6cc4e3e5f177321807896a2cbb98ad30dc16780b1c5de57f7983c869aabe4b46ee3ee6ba03fb72851da3a0e21e1cd1b15f9a09c84f886f5d7468d264b73a716985d82cbda02177562b0256e06f8c1f00310311429ac36d0ec0cfd9e36e929ac1523d79172a192bdca6cb18470f9258d491fde622521bf8975e49123447bc61659bb1433be06de61f02df57a063a40c3e457b62884c02df073e59fd02e2b44d9e33eaeb994c7b626389334577fde5ab351eee0148900c489ffcf80d72c7173ae76747f77b53f9d145b57eea48da0a69572f01fc38c02cbfd13df7a1697e0355b01fe431d090382569401c4a1830451ac205afe2d160a7bdbe44bcbc5161525453e95d4eae803706677a52f0ca98f58f400bb6c23de0aa61bfc621442d39c44178c848a1329e062a95518551ede4b2a29f2275f8eef0e453b1496fe920a2cf8a473fc11e1b83151ab5da3d98ed4f78196276ee4c27f06239c31e080d5efd0a5feebd3543a650075e764fc317ad207e46ac1580841c90744ab4f05958708589f5ead9e13279c87786603ced9091ffef53d038b25480b0061843f35a5305d1bd6b878c475206ba922993859df33da1fe4fef10cfb96cd0083f6b370825d46c691e179373ac82e77c8d888eee9ae96a4a4898a377c57750da0a5b4d3b3763e1a9c588e6de5965aa7f61df595f301e5f993f9a8fa6ecaa70dff59f6f78822a41b276d7f55c6a08558cd5c6d146b2dc64457c7bc1a2a1e360525a55c31c828c031f0f8eb25b6212e2c589abd1ef88b6b39f56387c80a138708040e0bb75781ddf8dced1e3ba2fb1f8dfe49c68d7f81f9a84fdc54c8d95cc406f93f0e772494900d79c52be3cd04fb5022bd5fe467da594ce6450c77cf9b850237b996f03c4568e28422526d30a612d7bdc02864c8134b38d36993295c129403663a763a8e2e540d6eab3dafe641f0a184d3b23c2e6276ebaefc4e2773fedd029a3815b8d6a1129d4f46c74d772d9c279caa4289f53469e34a49a473f6542407f9e0ed855140ee74cd5758d3ae47cc7d713026650c06a11634e0c71415d535063162faa5532b8e23debe40853ee95d08b9f3a855594253a4e1deebcb3b0606005978d410e825b60b19e57c20bbcfb6d0983a49e372afa9d9e713cbd04912850667d75dc98ffee297a102dd5e5dfbc5797fbb8ca078f6a350b16b3b8f6044970b1462b5321e89f97760cd7d98e2e3531df99f460969f9b66e3f10486ff19f6e08d6793e5c0d182a1ac60460ec50b007b79e2c13290f51baef5048c7e081af620f12819aa103bbd1daa7636bfeb494aa6de5d2db1e50115306c9d6aafd8cd5c500b59408c23b5c75b28a5c2148af9f23cb94e0be1d02588bb05346154544a1ed0a5d7ede9fad303a03a8d977cfa25d194d1843d1ad5a33b7efd9d52def5360f300bbea37904625de0b26d918e16e2ad1c8837776190990fba72717fd357b627a04a2fbceff9453d81ee533d45820d1b9ff3b8ed7b0fd23659c69fe901eb7c4d20b849a2c31a937fe6978cf0389a723669814dfd320f33f510b977c07accb0f6a049e29cff30a9cf9684fbc37050463c062b914ac2e390241ec827b05f7d9e28d02924d679292b5b53ffa43cb8f4fc33b05eaf981917c959ffb3d76b4028fa11a0479faf4cb330a46722844a6e36dea14fa4e5229a9ae01f04380febd11ae2af603e449eb841f57746151e3185cb5b2494d959867a4bf80c721c6bd20debac3a1041a29e706e165881e8384a1583b600441d8bf2d36a3d0f1e9bda28187534c6c0f4b90631fdf44a7b647ae39da9285ab494e4fe92132817345bebab4c0aa8ad60e1010fea588648eb15b0fe20c039127ea94f36315a91bfc637f827f2f3b46790c06ab1348bc56d7eaa5563c6f104727fa9a134d988df57d750944e38c6ae3bc0a4be12d4e8c20685cc30808bc5a66a14094d733fe08be61c1335b8f8fbb4190098ed697ed1e0896434add7281ddb1d95a0a266741e630058a61b549c44d6efd0fd9833113e2d0ac4fbe427e41239a61417009bd0992b46e9c30d1431f91d43a0f9fdeaf969185decab082287fd4d69ee1d0fbf3aec85b10bddf09944f6dd5bc09eb2f4e9a1e4c13a71296d21d33729b95beb6d145ed886da6e47d63baa6f20f0287f2c6860911d519025bf9cc5156d6a0909c156479967b2d9dd337337c0986072491d5552264cbdb310c75be84dd7684017d3b2edc4c98b3ed2414b5b5f5580d8be9a913347391c26abebfb67da10ef4fcbe89f1a8535e0dab21b869f72cd40530cc936e0c83d23e240a651ce2f09724f06e190b402ea51609c3a0b83473100b7fd2bbdfd9c6b069185d73d124284cb776c02a748bc6ae70204c3fe8822d5d02086ad8f175f86afca8ebeef8d86fad9abad7019e76b9445008ea8db19e5e1d070abb6a9f3d8db85db66a7f6ced71fa87eed80522a1dd524c1c10c324ad53fc0bbc9846e43408f73408bc14c1322af232702012a6b2a321541785449639362e0891b557e580ed7c9d1a42985bb7e0739bea47b1b554ea562930d9828e68d4c90b2414f7eb8a7dd49c9be8e4f692ce071940bea5d8edd7ed0f2bef20322d0a2b07f621761f5e04b57dc6a3c6bede60d2409be0b1cad4b562e9adb74a2aaada8b0f57f5959cd2711ce263b9900dace4adbbae4f0fa8d1a1d8a5caadeae31da54e042369ebff41cc410a0d2e9f97138b04a310dcf5b2687125b96c579be73dae1f060d07c3283b6c5c6330d395fe50c762ea8fa50150a981543c78afab5ef52d260a6e8a92840e40884f5c96d850dc8f9ba0942b283a330632751bb836fd41c95e0d0c9f53e8a3c08b4a78d028064bad31e6527b06d5191f4c90c380c18b28bb720e81fffaf20e673560bc4b52512e53466a6345e69a1cfe20c420489252e9347a0dc0d74a5dbc4cddd40744dc665f68d046ec32460d727b4303d2d238c91324e7063d08c5cf208787191fae274bb5282cd2a35c9ebc901f86cfd6c75f8e64c6fe01ea3fb9304afdae3d400e9e5f743abba658e997ed7690abcf9ea91af217e8c70f34b15dcd3465d01a66d4ff083d2cd31bc48941ec822b42abcb2029fb91a5c40affb45cc508799039b7cce1cf1da9deb4d05d0596951870d1e25d9df7ae0a47014febcb7d8372ac26edd2b5c22b30bcae9ac062cb13510a36be13173d584ca905131a357a61b1014f4345b151b8e5e92f35b373d550099ce609f85509f34d8c00283c310a6672c3c991cb7be339f3758bc068af8421af960d4e6fe046f9479d063631fb228a2118659cfa11a40e6f1ff14c2dce6398348e99d9abc95e9b33aa058e5f4520a74e7f90a14383a38d224c6e2e25f26ba6a20331ff779cb3351c770fcb9217428693637dc94f5b7174a0a6ad9f15779f089c7215c276d909c644b00814443f24840c9cafde250ee9ed9babae6d54348f1077835666162c16b94a8b045ae832dd4533114673d07c6c1050529948d1ae2c11b11b313bc532475027f10bdadb56cf435e7d7971d2e8f3e753aba45a73b6165351c527aa82dafb5bc96e0de711fbe97c882304d0d0b60d1e016154edbf025b27a9758d3c0714b98547d60c9fdcb582ee35b47ecc8dc7181331c9b1d86dde991731a3ad26a42b053422e105f5b403e6ddadf58066eac7f69e6f0bee96de29cd67960179bf46167685aa95062c044ac38550605635e61a30040803bc5de228fd3c75df292adae7f96e97b50d942f974f84e4261aeb67dd37ca2800a4cae6ac6f89aa687c36462388d06aa808a12d75a3ba0185dc02c41853c470f049f10c166c135603f8dc0cf11b90552c07be245135fb0f2dee11a10d68bcaafd2e5a7b9b0ed419265b9e69c8f8cf67a2074dee2f5387e3678c88511f792cf5003097b849c4cb26c247924dc9ddda75b00cf474ef873af79bb9eb95a01a484aec6e5297f39389f2942a66e1d406c02fd6063d546a1508d383fd6972bbd415e8a2bfce04fd1588a6a4be1a5a32368ddbd80ca86d256374ab90ab120a39c97932242d55745c7e50a8480183a3421228d7050acbfc3075cc333284b2cb108618382e27ded11635054e4325f34f22ad965d040f6efefcb52894245a25111e0d9242acba77866606d21a142853ae684029bd6c0a6f4c1736dffbe610b469f94fa279af7d998fd8d2dd2a15e16b8b9030bdba4502b40505d49b280257cc2617b1cf4119da6363a4737f368eaea3afcd4f26524e086ff827d85dbbc296cd29aec76c4fd16a1ef7dabda71165c44ea7c01ce79e400b00c94e6fc70b250c80a0021e084b63b1e819b1e424e410d290437cda1075eb0ce37b2b7ef24e21850d9b54a19febdd3a3bef5fa338039c7881d0cbeab251e9013b1126d5e4e28d07452ee914de825d797636b4eef0e6d189e10b57eadea8d9007c155340a560c16aa19d167dd6fd040f4331c26f212fa855186bdb3ba7118f0f31f46a3500e59ad379ee9b0f672b0d14c70f796225efcf4c3aa7976b4d55c30d2aa07dce2adbdc8e6086ad23d1c7128f7234e1663bcf8beb3b11dd92802aef050b84617870a2e9273b255c132ca15daabed0a8e5519e533c04e19c43f6ebf30bfee5457e8715563c8cda0908c5f34719952f73f0f47f7365eac3c141c952f40203b51cf3fe5b4a31fe3e277a672d62ac9fa7a959025ab53484202b99a3376d0c8cb1d731f175a32935b2d8132fe5732b6826d808a47da7fcaf26786afb890d0d1016807405fe83a6c66cc32b30e6b9d4dc009f99e2ae2b5f63e8e275c2cd020d5b41d607563f55ffe73814759edc4d9101aa329ecaa072bf7f7bbc49877a5b0e83ef4e00bdb30d25d05879456c23ec567c1da0ef446bd44adfc3e6b0d63fb80c970a123ffada559fdd01ab5f414d08738992f579cb8e2bf26e58f5b3b542700d334c18b84a13de3ebeafeb3d323cccf26b25881cad6f295556eb7c987ee7e20e21be221543f126ef2534bc9377adf19e0e089902fbe1ffb85b61adbf3a1e8b0bf4466b858b5890d8a7cb24e8d08371dfdae2bf938bb38ee6970c8197e8b617049f051268d811cf603d60c627bf62b3ac2b75607d7a5d32ded4d0efd356d3290c183be51fe8013eafda7d1cd7190ffeee31452d5cacbd4450183fac431bfd1d01d91851a8c004a835a2a94d84507f1a780d4c1eb8113273354659557ca09d95054a43d530059137ec28e634a5047f3ce418278541e403e3d7608cc31d9894f50de25b72a4ff702bd76cdb2ed882bcea950d46a0a8682840505b200cbe8311bd0ae16f88984ed477eedf14255cd2d97f33480394aed917f4fe28ce071d5297dc091a0d140e3f99fe443234ed576ae72d350f4d38e67366128a71abe82154fc790b5763d884e9c6b9af192b478729d9f9916962f9c19587026a7395e08a5cb63e0155f894972c6ffa01472bff97ec0caca6fabf87bc28e9e1ffd9462869993a9d078611549c92308373020c9ecb9a3b86944e7b4f199c2dcee420156194be699a06987497eea31cbaadaaec42236ba0d80b6804c78ccbfd971ee496d584d7d3c507f9af01d265d76789df6bbb417a283612e6f178bdfbb5c4ff07bd46f98d2d30001b3dce937b3b13bba358c0c49ac67bc566e6b1126a223d0af1252af3c902450affb12da52b40dc4eb6c593ec6e8dc92210913aa919e2e5662d4bde6d1fd42b0205ee7d7fdc67acfdf2cd67692e4f62cda107e810652f4c97745f556bae6ac3093b1e3d9752ef7e984eaa6372343d29b70dd25bd4f3ea5c08b4d0f31d346e5a0c0445dfc0d41e7955db1eeceec7ff44f06fb84dcb1cf361e512874cad985a9901da3b2f67204f0165e589ebd4e3739df173a7cc8ed08107c4d442121b15b85c0bc0727f6e8073877654aacb4e393a868d6054f413cd899cf4176899facef4ac052cdea604386937c07e4a086ed6be26a7423f9a32c1d7e915426dd8b2083f5004b26d99ad716e7eb55c6d191513e7ecab08c82cd7b29dba583f4f59aa4cabe20242db63f15cfbddb908e643c5e1a99a5d155597968018c643672d05250dd0ab0db36c1cb3060b06c4fdc4ec21623f4fcd1105177dd44afd797dea3d155aa07f91e6cacadc6a2a85d57d6ddc143d46273bf30e6b5158c46d2c4c01ec0e2c4d51b9f09294a9e68bf753060797cce8f2ae2ffb0b793bf3e4bc4c8c88a6061e2a05fac39ce719ff929cee369b09241a16d41ffa091e31e5652467c8e829ae8475e48710fa40065d128314c5bbbcb38431eb468e9f2bf4f706525bb745c47d54c661a1aa371fcce5adbef14daef7a38e64d1cf64d9954df0f9bd9437f347e63888a7586f87b64e8ec576239731707c8f8d8cb93ee931b967b8fd7c8c7e1a320914f63f60bf64f0200b5249d53c47ab22428b1a839b3bb8f0e025781629bf5a388e0b78214d44b81df02cd678fbe17eb5ca68970487d89fccfa4e94e2f7a83cee2d90e9c71f8d270f7b6b562504728f191c782848893be3f1397a68e2206ed3deb2e489555a5db07077175a6f89689f18f62333565824b29fdaef57a8a0d2c44520fd9bfd13d13aa03b342b1224f6ee540c45dc7ea243915d952f4e1334a98543474019650199807f28e9eaa2a2dab2d93a4c84d46e7261a499e923876acd07c834d768e8f6b5b7eb68990b034ebc9cb51e6aaa5edc747b9529b47ce258433a49c6c4754f139521780ef0657f1c32171c6334dfaf1f009c472383878620e2d5c2a61274c2c913dd7d5cfe470c1578088de9c13376da463984e6b3b3d56f1db3b1f5b059dad3d4b663dfeecdf84566d7745b4465a753085e335312ef4f119ba5f54560b8aadfa7b95b370ac5a4ddd55cbb5fdf233043f6af938692e1a634a5a29f190499f4a4914f144ec98fbdf2580564f759771420950ec81f78b486b11fd853f3b014743f2d5b518ceed7b842302b59b6ad313c88c113efeafc91c7291fd56b22507816ef31942e4b575b6f7552a0f3d5fdecf62fd17ced74da69c4c0a81f058b0f70fcd0c5beed103cea702f1f773b72cf20f146281d0d6213632c76f9fdad1123aa61430523a63b212e907056dce796e05886723ef12f16eb546402ce75cbca06c466ed98661551a5cd7b8dd0ed690de21d5dd14fa07914d81fdc662ef00fde7b48a62585895b563a0d350ebc6f574505a136e17888f07955c1889f3a145ebeef02d5d41386357ecdae636c218271b03f5a9f3836c600239870310c77138cda8380697d130866a8bb5f703c83c7fedb0164c0379942990f00c44e6c450388a7bbc3367e7e7adf64cf47d939a02a2498bc6c4a7026746a93f17585b7b72e9832011508e9b1e05c7e98793b96c8274e0df40b7513093841d6d6c019990bd5e38d0512ade72de29e5ca600aef169dc559acbcc3dd61262189ddc33f3684d95e808aa442b5361a798dc93855be1d4c6e79f34ccefca0e4175b2cd9010149cd85331533f5909f188958b3171dd7871f9a9433a22046d73d85f1670d0824ac4bf5867d40d40049d934922d251934a1956e5dc9a91d621f74edacc340d2a1f410998f800756e3f73fbe7f9c63cd2d997bcb5dcdf0b83189be20e0fb0ccfe592c07410b13d725067aa5a86e85b6f8e9abcc5cc95cb309ea83ee90073fa641ed8802a0c69286cd3ce6f1d7962f7d22e1d1888acf0b89e957598cf10054b9fa56da95f4485a308b4ce449ce0d3f95713ad846aa1c0aad321a6d0758e1ba379bd7ea2d6c9b88e3c8f77d53c67d62f16367ab1414175cd4553145db1c18430a0b57892954893fa7eb08d59c010de9895e551c6a0124013a6e275502560c387393d003e119fc31a5390977e87c248caa76fdaf4fb96d95d31808c18887d1034eeb50c2048df01d3e12210806788f8aa4bd3888ff2c197a5126a0006a1a144bab24a8fc847b279e53b0564657cff91610a1dd32f823d508d13d7acdf27fc52a12755aeb3d42243c0aa22c00c062d12548bc4a0c3dbfe2bc8e809775b05393c051e7c738118b92573f0bacae19d83bf9834f1588285725b68fc35d9d41645d114aab9b6b4f1fd90e19975de1bc503d658416bb1e49b64777d53a74053b9b96d266cbb8c39d0a69ac95a83b81dcd1cde3b96df6683e98bfd8f11a49b48f64c91dd4b12387cd7799d330459edff38c0acbb3754848d6a07cd14fd646cab8c1dcf0f0b4c542c6a771d72aca6f0c29bc3606d9f5207fa257217df2e60cdc77a9e85af532d54eab6dd1aaddf585c46c3a903941d6fc063038c3a5c9486f944eb49dce4a3e002e553884522b6b151f7c1c1f37d91a15bb41c8320aa51f597744d2ca7e3ce9c90639de83d6b880fff4f1d56cd0e9480992a37827e4b6464bc38b4dce268287fc9f1f2b6efed4cbd11f32e52a8d40e3284170203e30c88b8483aadf99c299cd4e0865cb227166df1443b7d52870edc2587e0db66616cfc35e38029d741f02253c82dab5e1bbd25c5e029e582c0c71c507a1daa591057072f704a26bea31f72801b5029dfd9d9566c724cd5591ab305621d55ba94daea5b1712725963c58e196e68049108c80a95f7193bfe3b7f1dfdcc1de72eead76074dee6868bab6a32b7dd0758a85799628cd5c7f3be18459ca6f9537693df592af4e1f825d42392559089e8b42f3953e96a964f9c4fd5fa85f677cddc254f9a876cc2730bef01f02befe5d84a66ca46af751975579a6629f4e74c42927e5e2bff00c9b000ae5dd482efbd9717a7b79a183ca219a65477a1e2bde3386a8669d1bb149ffcc38b60b47108971d90cea564971f219816b99f592f2f230b5b86b9198a98abe982d2c0b0e5f40dd3697c23c6431b60088b2dc2a95f0c70214983d7a0015048e22fc3801b26119d38d435aafba92bb3b62b24d7fdfebac496e4e5f080b4e1f16ac2f4e0116ac7d9f16e2c945e7ce729f3e26612bcf37ce4c5bc34a553a5606e5f0624a61c0209bfa0a4c7ae3aa541b1ad71d9bf3fad478ca04bb53f3e7495b64c4951ffa530f4ccb1442fd5e350d581edcb9719cf3fc319fd9bca34a99c64d3f3ccda3f039522b459a7b95944e03dd3184611f82a88779a8c370390dd1039ecfa280d715ca8aa3dc5eacfbdbcc08ab4a579f62d6f2f9a7a67d96362c5a30245a6f412ba53ca6a276f632e765560e9e801949bf806f7557942a39700bd0dab24eecc510702a5f7fcfc7af70f37e040cbcb3d0bc6a2aa6107a2466685787ea9454e98d4b48789791017a6f3db37305e606dc12adabfc8d4f9d0651806e1ac2aafdad4762ec81487da70b2871eb8206b51abfb0b4694d563007fa000213182cea6ab976672f980300536258a409830a5f705537b93277250e1dddd77db1167cfdadea4ed4e6d0760b7aac94091b610aece5247b34c5ed042ca09a1a352014aad17a2141ac4c821ba4c8371d49cfd0008c3ef6c307e54f6decd2f6ee99d8de36a0a50d2f257919f30b48c8d22ac9ad0c" 35 36 tx_raw, _ := hex.DecodeString(tx_hex) 37 38 var tx Transaction 39 40 err := tx.DeserializeHeader(tx_raw) 41 42 if err != nil { 43 t.Errorf("Tx Deserialisation failed") 44 } 45 46 tx.RctSignature.Message = crypto.Key(tx.GetPrefixHash()) 47 48 key_image := crypto.HexToKey("b27b6cf2e0dcfc35f2767608cace34e59b1d507d3ef6c5ad7142a1c3aad0d860") 49 50 tx.RctSignature.MlsagSigs[0].II = make([]crypto.Key, 1, 1) 51 tx.RctSignature.MlsagSigs[0].II[0] = key_image 52 53 // the mixin information is pulled from the chain live 54 mixin := 5 // we know the mixin is 5 55 tx.RctSignature.MixRing = make([][]ringct.CtKey, mixin, mixin) 56 tx.RctSignature.MixRing[0] = make([]ringct.CtKey, 1, 1) 57 tx.RctSignature.MixRing[1] = make([]ringct.CtKey, 1, 1) 58 tx.RctSignature.MixRing[2] = make([]ringct.CtKey, 1, 1) 59 tx.RctSignature.MixRing[3] = make([]ringct.CtKey, 1, 1) 60 tx.RctSignature.MixRing[4] = make([]ringct.CtKey, 1, 1) 61 62 tx.RctSignature.MixRing[0][0].Destination = crypto.HexToKey("06959bb285aaa009e04546528c7f9b413d30f3ffb4627e27588a5c23a2adf932") 63 tx.RctSignature.MixRing[0][0].Mask = crypto.HexToKey("c46cd7c3e779b4c99f2d265946f4f543f0f3b46d9f2c2a24c3ae8d830d4a1c50") 64 tx.RctSignature.MixRing[1][0].Destination = crypto.HexToKey("6ecee25c56cc30f6f65ac4d96424d4bf51f4843bb167f4f17187e621d8270d0a") 65 tx.RctSignature.MixRing[1][0].Mask = crypto.HexToKey("7264c8f0aa30dee999466bd024cacd39a1119eb8f7bc8230ee0147e7757394c3") 66 tx.RctSignature.MixRing[2][0].Destination = crypto.HexToKey("8f1c86cd47647d011ea3c5ac2e66e86f73341a6117027c94e6c63f3ad1f11b97") 67 tx.RctSignature.MixRing[2][0].Mask = crypto.HexToKey("1b8e9d569763c19ce311b99f23ecfd766b2b23ac857712b387cfb58a94bbc268") 68 tx.RctSignature.MixRing[3][0].Destination = crypto.HexToKey("5dafd55ff112a0a77d22af7f09a6c8c2129ff89cfe7b11fb4b5a22f038a6dc3a") 69 tx.RctSignature.MixRing[3][0].Mask = crypto.HexToKey("1ed903c01169c6fcd78b7a37dbb91670eb1df711bcb02377dcbfe4ebcdab6bcf") 70 tx.RctSignature.MixRing[4][0].Destination = crypto.HexToKey("4a306eaef4a690694f39803b145ca55e34562a1eb11af68af75486cf5f0e4570") 71 tx.RctSignature.MixRing[4][0].Mask = crypto.HexToKey("cb6f92e45dd8a2422cdfc8f2f6ced10998c5804b3dda148b62593f9a8b5c662f") 72 73 // test whether it passes range proof 74 if tx.RctSignature.VerifyRctFull() != true || tx.RctSignature.Verify() != true { 75 t.Fatalf("Tx Ringct full test failed") 76 } 77 78 // check whether key image test fails 79 { 80 //backup_byte := key_image[0] 81 tx.RctSignature.MlsagSigs[0].II[0][0] = 0 // patch keyimage byte 82 if tx.RctSignature.VerifyRctFull() == true || tx.RctSignature.Verify() == true { 83 t.Fatalf("Tx Ringct should have failed but it passed") 84 } 85 tx.RctSignature.MlsagSigs[0].II[0] = key_image // restore for another test 86 } 87 88 { 89 tx.RctSignature.MixRing[0][0].Destination[0] = 0 // patch Destination byte 90 if tx.RctSignature.VerifyRctFull() == true || tx.RctSignature.Verify() == true { 91 t.Fatalf("Tx Ringct should have failed but it passed") 92 } 93 tx.RctSignature.MixRing[0][0].Destination[0] = 6 94 } 95 { 96 tx.RctSignature.MixRing[0][0].Mask[0] = 0 // patch Mask byte 97 if tx.RctSignature.VerifyRctFull() == true || tx.RctSignature.Verify() == true { 98 t.Fatalf("Tx Ringct should have failed but it passed") 99 } 100 tx.RctSignature.MixRing[0][0].Mask[0] = 0xc4 101 } 102 103 // check dependency of prefix hash 104 105 { 106 tx.RctSignature.Message[0]= 0 107 if tx.RctSignature.VerifyRctFull() == true || tx.RctSignature.Verify() == true { 108 t.Fatalf("Tx Ringct should have failed but it passed") 109 } 110 tx.RctSignature.Message = crypto.Key(tx.GetPrefixHash()) 111 112 } 113 114 if tx.RctSignature.VerifyRctFull() != true || tx.RctSignature.Verify() != true { 115 t.Fatalf("Tx Ringct full test failed") 116 } 117 118 } 119 120 func Test_RingCT_simple_block_726_2649e0eac5b836ed36b3f4e512824855e222cff7b84652452c769bbed9d06b73(t *testing.T) { 121 122 // this tx is from block 726 123 // tx_id 2649e0eac5b836ed36b3f4e512824855e222cff7b84652452c769bbed9d06b73 124 // it is a ringct simple type TX 125 tx_hex := "020002020005098e0178a201b901ea57543450b2b743e729af2daf02c07d65928d25965fec14be1b70464ec2ebf10200054c20b601d302247beed79270b09d389e28307c0360971d0bbc946e16e453d32178ba0c398b88ec020002ad00e3246f39a133b4200aad5a282da042b35d1882bfed68876187621fdfbd62000257a50356a0c27dd5b916f8850abb6d559051513fa66d2f5b0cddedad0e4125a52101ea3881b1c46e415db7223b596f7cafa34589ba01ce0146ba407ea1fca5cddc840280f6a7b48502841a8e93587ba92028de21dda0ede1e8ff4b371021a3637b02aa83d23b5f7af39578053192e8412f81975706bc36e84d0a6a4ee3b37edba70be5968ce4e04fdb049e6838e9c1e6e8cb8aad4c8cb7394b6f179b6b01453e1ce30feb5d5376e808ea3a7ebb7ccead06cc1740a5e0318c6d65fb573025b9a6928addb8265474e50451ab1917dfbde37fe7b40c307bbd0968997e77d0c2f10cfb1c9dcf18eea2810d67ea074e3a07c983658e857d3bd7f945f883a95af577552f76c5b81c39c4c306589ee909095855b26ec9264554bd6d61cca132a61bd2996cd7dcef5b9372429633e54d60b037c1720e10075c4be2432bab398fed87eeb85913bd0c44fc2121f134473d7a9b00f9cfcfff7b0027f595547ed1bf695fd7b0defd8bc394c07f37098499e30dcffc85f79df6d8ee5169ab3c074dad7818211f25bff13b870cf02c0ba62d2124e3a33b28c5d292575fd1802c918941491a3b590e87168d989e21ed08421ae138d70c244cbdcbaa87ab962368880425e8e649c9e65682b230d9cf2a08309861de615972770630dd84d2c2fcbb64426b5f02062994613252dab13cf205a9a9f260a67b12525efe5632e4c41b527da4e655ffa4a95a75c25c8f07c4520d2e4983b9b036df1ebfa001787c5ee0f376f6f34cd987011b1dd39b4b71dc350d01710b18d6225a616e3f62381f60ad1113c7ae493889e073204d3d3967a7840de9b55aee29d4d4b0dc5eb3899e774f4b415c3212208fc6e8e4199fd9ec7b9a018c77034574d388e7317e48492c7bdf3f1f4f3dbcf1a4851a16c46e8a8b313309979d168e9b8bbe6779368680a732adecf82c9d0fbfee1ce2c3e37c3a760e990aeaf7aa9608680add4de4b8d250d15dd92d029d9c2f7dbdfbee6a5fccde1f6709dbc1060057ddfd9d581d8b87dd89a6256337140fd59aed7fe699f30f7c2c450a8f8d5972c9f39af524e4b39976b8b88c1bfe9e2131f24f3d631c6452a199680fcec538779f2d043762ec468993201567bfbc17e1132b0bad4cb797d3a2322808e7dbcf1d2dc55dd795184565b5d43a36d0b348c62d93434ae7d6d6ed8e0bfc0640e3d8ff7924d62b2a7d1c67089eb1bbe9d01fc811d8ca3ead2f7954b31af50409072246ff67b970cdc7a767f552caf581f1eb7ff5ac84a16a5876b4ab0bfe02233e591ab8d7a484817ce1289aea4383c356ef2de31e5bedb006aa53d498c40b78a56b67f3f8671fc0ee28d32672cf5b8c6f74589c204603fab3ebabca86310b3205f718cbfac39453e70d23f2288b490533ab82fbe207f8251c5dfc8ac2fc01ee38d4bdba4e936c88b813a05252dcefa40509ce599ccee49271298522457b047a886c24eb9fb465f1e156300915d7b67b19d1e653fa463b1725b728f9dd7b04ac1781d0dac1e825a17a08026769e01c3d098054be8a3aa248165eb30df2d7042a8703d4487667184445f37d6c604c20757da6834d0d1ca2cda258f7fd870a01ec3aaad4ebc0e9d082c718c17702cf8a380237ed4de57c322b521347c2256b01d74ae31196913f8e246330b6816c1b1ad6b9117037b6673a1446dbb43f27c30e920779499d62286028a9fd86751d37c8b868ce390ede7cb28faf99aae085300caa358a87478afc21a920b007515a9b3de67ef869336285bd6f1c485d4b73d70c756936b71ba3f11b051e780421fba2675b93a05368ac6fcf47f65d4f9006c6092f2bff91426309eb640502fccfba4ae41b831b07f2b6264be97e3df738111c09c8468b0b18b1827f65faa9022bb9b71189be0da19dc06209249a05072489b20274a5bffed30730638699159c92763b89e6addd40b6b6deb2526129a3fda54a09d3a52cc0e72fd23f2f4c8f07a75544ac45421240656aa2b7476eb0ae644e430f367aa0eeefc6dd88664bd4e604dd354a997103540b1211755dd127ceba13f10d4708340ab276b37a4604322c2ffc6e1c75fa4f7a269e7211e9125ee1f8c33f0da7a76783df38b7a97bb3b690689aad5bbda4f8870d3b8e37cb5fcf557d90200983527f96855d880129509097c7887bb68bd6fed252ecbc2aac1caa4314abfa027bc704afc2e932baf64df21a9a2f1b5122af0eed56f3e91e99934500fc64f10df527275fae7cfe96c37d5cc0e2790852cb02c591ec8d6b200996563c84ebbd08b1747bcbb687f2fa942129f0c214d986ae3ce6a7f43a4b5696fefab7333ec70163092514503aae6e50da0a4894c4b9accf396fc3404177c862e4a184da2ee504025be5073804234edc086d59d8e864624307978be8a135f6d02f6fff98d177095dd57f11fa9e99921b7c28de6deb2a869cd02aa4cbb7235889ea550c73ae96006b2230099f9863bdc6798d5581c705a3d509f7abcf2432768e01151c90161903d785c6b6985aa0c9d01ac38f71e7849fb602bf7e94c382da5f19b551a3d6f703ead04cc1799b7f143f012ec819753fcd29236558885d1c875574af72fbe6020f7d6b1c6dc9641c27b2d8b0bb1b457db8b44efeb68d9d95c7cec5559a57f8e104e41327a810d0411b0f95917990ed7a9c7b75aa7c720338cc716b511037242c0beaf0424bdf61be9c1eb8ec7f189251db203f366f1bb993ae068bd34f63d0020a5cde88b140fa5dcc1d920e7a265374d8b6bbe86d84b8b92761e6c5e514a9f701006c04a59d4c9b8e2b2c3ca93a04883a67969b2c9be4405e2ac366f6750ea8052a99478fe7a8dbb2c4a9096fc94f02e032b75d2154cdab2a4d7cfc19183f0f0d71b6fa1993b32a46aaa8e3709ad081836e0a5a52e93adc28672ff10b537fa7053692dc6831c056ee153a76a307dbffa04d8ce911e395230a7ef20ae884728105f7639a17b02d6e9278627116f2480ffd9f654055d9e5aa7873f56dd0770de30d7f97ab6a18d25f7501970f0b77d126b829327693cb487ebb7792753629771e0fe0182c370f545b355e12164395c80cde580c12bed9163eae126d15afe936920d5e5650665cc29ccfd0496ba5e3c29938f18a788c50b30cf54f68929207c4de0a23ac43aa30bd4009ded612f93c96614247f75f4a13fad90b57fe362eb561070184ac25f3225f51facc68b04fbff2d776bfe804311ae61c6028c2a536e150dc071d7cf6142b15684093cfb345ea22b8526adfbf7177694a9f62fd2031256d990afe874566f498e9b9f676033812d3f5443c6b3e6bbfbd4353efff2a5098e6770e9a1a4f70def6a85dab2afc12b948b7b7a2156c81a8ba3ab86625d4d00d62e80aa8865996447ffaf3ca3d2cd313438e0e41e243d2bbfeae4222059dd67c73c1051d8e9a128df49564e8a6f251ce86f039fb12c1ec21d4b1ee6654c32e699fbd0c5a029d017d935a15d46cf2e1b64cac6921f94e8fcda66614d302a841b2e8fc00fdcae8222a4411e8017fd1eefc21e4a0ad01635704b7ac3628a227981f9fa0094c77c3cb38f8ee471db3c85735bc1a90ea1b9bf045bd4fd5b5d2525874a9160eba3305433f222c7a539b7ad183c35fa58ae8fbd85e2c9999848df48cd865a80a0b46204a0cc406ba74eca22fca04d77a2cd87067f172031d29094e32f2c6ee06d9c3a51ba06b914b01556ffb5601cfd05aa1adf3e439ceaaaf21ed6352a0660c9e8cc16288249b9c7920077f5d4531d55c7cb7cc960bfb8b86367be0efe30d09c18e81a0b4316853730c29d16dd817718f6ec7e8b4734d620f2db0086906f80149c490590bef70db7e152dc557685ed977f4b08a5f710301c6aa0900b53026024ac513ffb7b8421801d455267ab433b06e3d0da1b912a04f4efe0401d27dd403db915a1c313c685f7afcfbe88040380f4180442cd367c8a1a88fa74694acfa086dc7e205597a80776caa9a51dbfc0fdfd999fd24a9886be5e45b0681fce11a0f94bc42fe8f5186157a8cede291acd10cb29b221903baed878d378791210a760e0af7fbcf97977e88276954f7d72fbb9aceb02ecba33d80fda9339e9e02945e07b71d8399311b7f24c24845f4b1ee6867a58091bef4132440ec68c18483f75b03562fbcbb3234cd45c68175d9eeb5a698881d48309d6c7d7b58959783c074cd0de565afcbe0eb530474dce9dfa03a24018be90b3f20510c16be2e856a89264b0e9bbf137585c341dfded0adcd7925dcc65be96802d67838b5cd023683adca7f08f8268c54b1cc3b535c2b71e8bfd8729a87df0cf042a025e059e9e8a5b95b350788cc46496b230e9a460236cbef153f938a7abfd3331308f9d1f6ed0acc82f30ef7d5772e7b99441a896b0e05372692d3ab32640fa78f46f0bc36dcefd53ca9098fc067352c7e873b9f0d19a4f27453c9b62700262700a3b4c0a351c8a29d8406ac7daa5e44af140c3c8b1f3d2ebb4b845097cfa9782a4715b2768de4dfe73d0d79ad67c345674538d7ec75b835f6a701ab95d304935185a3ef906f0b1c19a70206e6b03af99b833a00be005eb80de223fa640e14013d0fd7052b0cf7b43578023a598090ec0b5d08e3f9b3d81ad148a49ee319f91069a681c545742fe4970500e9ce4c9b6858d18246bf958ff7211ebca07a1b30dfcda9bba99fd66134357806500d3d820a7ab3c3ad35226efa2d2712fa0edbf87966fd625de6e9184f240d0a650a5455d49368a3f7677554ec87dff121ef1ddaf16ccfd1c703b032a3f8d006bc61e558d0364cf6f867ac76dafa66b059710c7f9147e3e07190bd63bf9c73060a2b51a4fc0e057611f57c6d1d6089433ec896edf5372fd993bff5b5d8b8960e972119e09b6d84b955181a02499f98a6eaa8b97cc044ab993f4b4e7f0fd2680866b9613c7336e45fd3076d0fd428819c2efdd76db297d7c240a52d54c0a0850c2cab511b8144321c234c11fe1decb78448c684367309ba1cf5a4d22ea1cf2b067ad7b2d81c0fc5ef96ac80d5ed35ddc29222d5f89b3ffb0aee7a310dc82a890b2b957ebfa95747a86137a8a662fc1aeb78732d57e16d6850797970945f80c40de6cded7477fdd2008998328d1bf49e0506ea87ac8e54d884b9ccf90eab320404478221f419e7ad162d0566613d9eb894d250efd4c15a9a26ba3e2a48137add02bee1f44bd8077358fe028675883966fbe3b09e2b46344440688d187f5b3967051d3db7085c5ce0c47884b1b433c9aa71de17b8ed48525de4502db1c47b3e2f05801007c868e0b823dbfeb25ebaec26214e03630c8b101f5145b989500099bd06ce5a44d7f18f7848acf7d2592b1dd53918aab2ea5c93f7c7887bafb25d77bb0a89ea20d51986e3bc847022f4bb6ca12ecc6e3f2ab1e780813b57df5bc84b53079324e81ab53187453065758f279601dd1a852db0c95c68bbe388445923d65609f9bb51fdd2f4ad2ab8a2c97ee338ca86a3d45462c8f1f9345d9a073694b0960e57a547d670956249f34770e62b945aa337f722059b4a6d59b7093495416e230d16cac7e498ee2ed399411f0f48f500aebe96934f514e1a08b73e591447cb850db6a000715dbb9541d0c32a286c391fcae23a2145c1ae48f75cc5c0c532709a01457926de113a42ec274157936e10f2d48d6c235d7245cab78588c2c4f6baec061952ab08e2a09619e106d0295094fef72d719e04f8ab73c8ee18a5ac3e71200478ddf20439885849561f098d7e81e8f00517d7657ec37ee72c950e4e8a9402072b072660e5a2cc8f138ab2c91d38c0c2846324171b97381f04682e4cbb6e6e06e492bc18d8b807772514bed262104b835e718d608b0c052f492fd9988e23d607dd9a9539bfb38661321f27bffaa6b64624d80d8f0481d6e11def4f279fdd3605e73ecf3205365fa548caf48be95491df36fc89392f3f0463146d61accf1d0d045f262c3b586ca2d8206fb54121f864bfd3a369ac30b3c5d4e54128991cd24b00a320e442c46d54a6206ed75fe136566e2e9a5f6d15eddbd5adb1cfa02d3d9902c175a03c50529aaca0379f98759e228f813d1faadead687116e9d7cce019ee0b2657fa7117b29361dbd849e8aa8c9bbaf9663179b92028059f76149dcc5dfc04dda34b17ffec9e7284fc2835e1596366cdec13dd7f711b5cd07a9a5f67bbef056afe2c73cc23e31b08028fb949fe10823cb325d8acbe078e0187a5fb0c860c00aa84c32c57739e719884d14139f2e67ad1f330be3a17d37180d208091b521f05ee083c237e317741cfabaa7ca46372951d944062158aba3482cbda4b4fa0d4094e287845e3fb0443086a7249612230e68c34de2b72526fd6bbb2ee6ca493d24ea2f5e02d985931abb3ea2325ede77d55de400cb7ac21f35a8bf4f4229a662443d68dd15bc1054fbe581518de734da565f0eeb8085cc3fb6df9acb0385d6a5d6df6b5c68c139e1d8ad931c74679c511582765d894312e3d1177cd7e00b6094fd3bf78699ee5c4bf285b8e535c4dacaf13d20bd96ce90c2c56e97e458b6f95528f2a08068d8de84b2ef50466984e78cc62fff47f54e9ba1037a8c4f295eeb3f6b98f903664e5d2fa7035c4a9398caf475f2ea3047318ad48e4cee730e8315d08d2d75f43e65153d3623f2464c2c8656cdc71a58b35cbe51536133c0b283310aff55ad9018230fdc8cc8d189dc3d6411a3663ebbf52560ad94325cb7b1b9638a90b669bc0ae3436cea9fef783f6cc58eb6604ada97febd35910482dcc0db31cf5632057a5603cc3ffc57212424529ea1bafde40ece5baf40cf3f93ceed623a528eaa348195d48181d2796f2741dcd2621a85de40acc3595c0b3a685d72c9acf8117b863490f6ef8da0b32e55a476e5b075fb668a515b5875dec4fc74c784420fe337196907cc0a05374f8ae479b5fd9c33fa3ffe564552c24584fe9d4b5fd4d1c1b3f49837d185d01805bb8e68366d1b92eef3ec9bc52c0b6754cb1f17ed3e66fc1508a0a429d23da1fff5ee9a072b7c9200e42691f0a1862667f2dc0adf227f8ab883fd26540bab532106a202963c1d6454381f1a57345e3ed92483d819ab4761b081a81d76fdbe62c63a35120f610d272aae8ef1223c4b5127d43fdf765923be61eca6d7470ec98449ff6d4238c3be8de62f50ac76749db2372390204462713b977ccda8f3918ec489eaeb322c099f9748a030911699da51d257c435b444cee789d53d22ae0b8ddedd2ef658aac38f2fb0da37b2be48a421f0f05a5591274fde71d7b998628611adf0d5d5df4e5a7bd95826715da9d02fef6805bd9b74a4cac3c04c785edb414200ef501e78a9df73db42e2f262d525988b4b640cfbd5add9ee8086482fcde0a6c533f407fe54fe63ed5e4dadcca181531421f354c48ab2675abf240e85f18ff6e5e8204d8ba65f3d97889307859ff145da746b799f4f43708f95d0370e62bc1f612180c888c7d8f95f93c9bb7953af56004606d97f7078fb12efb39612659f6068b357a11831a78cf73559bcfb27db229d179a177284f04560275137d0712489df2907b7093eb61f2ca9f4a903a9734de567f6671e6b9047d6aab50f75496a625de59c9d05b4b87eaea473e302f521f77a98c595d985fb1c7ada6cd278ff78bd517ef7fd096afdb9d19fbc0741a145418c58bff551da37d75fcb2ae3200cd8e68dce8483a825b21b985eca6f05c95e06cf54a2dac431a8ec8b3c851218b584a00136c83bb3e3d0d9faa43bf780b2b7467cbf3e5ae31d090944b0a63bea115c8ffdd9c82b9eb6a1db53c5fb74358f8cc876e66d8682788625b457aeed9af1c58c472dae24d41caf4ea3274d7be1c36dba647a1d6fefc6d87b0305f93bfc94fdaf97ca1cfad8758491a2ddae54056e89ad11f3c9bda51bc425dad52ff4938793a9e69d738a0a8f774834e776e57c87ef92f2c25dc7dbc7525e5617d9336fa3a484aa7315a971e8026c228e25a0048919086dee53c692dd394519313879b7c498821ce857e4ef98a1807c2d5bad64b2b06ba5a73d538b76968457a018fbfbf928232becea93dd67b13da7b0f9af55d4f2eb744d99a930431bbddf2110756c9d3a5cb4e0f1ad60f24b91f0a90d9eb75ada68f855d46c0616d97ecbf80e7cbbc94f7988eb43f95d87afe6dc75762085a01520159d8407f3371b3eb9f467efbe340ace9f325055bf14f9131e701c3dcec50336bd21b9d736fa60aee60ef9fe6d3822c2406b7da3574ac141b3e24ecdc27c29160805d5acd8996e953a79d8760f7c65f2def129bb03ed560a155bc3e1d3ebaedbff33657991c9c68834aafbef28771831a8ebf8e44dee70a329b697d7a3d822d85738625431b9ec786aa198389379b73552ed0c030872f3a8a1e8f67d27c686ddbad7c24608d44c9bfa1e6e5ffe3aedb597669fba50b18218535504f256531c356d677ad79acff96c5a8aae86614429dfcd27b25a142ecf871b03956c4f3cf4443a54613c598a4668aa210fc354e0f44726a8315bae4988ffff858e2a9eb65301730ff7c32536fefb0fa28b5ea29e165f009dfcca3d9e8a0f44a4e4d5a5566aa973b891b6dd98e2160b6cb0961f1c53cfe75423660efd74cfd9c26850d67a0264de4c0b1b418f22777cae593a48d9e7248910364b359d7e32ece97ad40c35b5de5566627d2d2688dc8fec0066c29c59bebc326c1573f690ffc67d7078d2f147d4e48d1a751ab9a157be67169cb38d2aa28603ea8ce797f8d6c79353989bd2837d55fbe4187edc73f4da1c47c7408068791c6336abe9f26e42893f19c953e195b7694389da03485720c4dd16ffd506796886804ce40ce977a2ab54684152fe30d3a35b2aba5b5d8ccf424329aaa5105291ca7ffb54329789c0b97b690b83f88fedf4e7daf91e51c4e7cff1b50092e17328909c911c452dd41c62990706dfaea588b943086ef76d8512a713974256f9a7b5159953e946c9c32e263c218902cbafb84150aa73448cc5b8cccba681e72cdf2d4d95ae762e24b6712e26bd4552f721a324978b7e7e2a539049db092994b439a3bc796bc722fd2191b2955fb10993c702cbe19738aa4011b6c6de09c0c10a13ce66cc0dd533a12ee54177bd5d5f69ccf2d365115a69481f59f0e2c2eef133fa246a08a6e3c7e807a441e2b1bf7b4842f1e7e8cd4bf16dba58bd378cbdb6d77acc2cd2832f3d5865562835b37634737b4aa0f973d13c4ce9cf8288d8b825d7b39c9cec5c413ef31345a4cfd9d142c9328a2487705c6081de8b40f263c4d63743e121780fdb160230d48f62986dd528e6fa58720538c9687aa0f0b1f2ff49a6fed0b96b309a1c1619c4a845e00141d0c26ff9756800e8b98de3b0d0c832d99298254d3453690d869df8bbf5e83d442c031f6c58017f7c0e5d5a303360fd32cb05bc147d69071ec969721adbd606165f7f3b4ecaee9431306c60e06ed0826acb1d491c3f2eee24e9956696b92574f7089041643dc3d081ae51379035d8688681eaa74282648f969afc98adf719a505d2e4cc461e9e505fae094b6090ad44ad9f10de2cadb596558d0975e1ae52db69add177addc906b78ff0a83e0fcf54140723cbc7c7fecfe37374cc4eeee4a08fd4db026200f123f9cdf9842c0933ad6f97bfbbb7303603666200b7126687d199e224334866b1d2b19e82266100943c180f934cfb97f65d2db529573d075eabd31dff0bca9af76b96e33c3a4e01ddf7ce8c8ca6fae6ca1c85782454cc2d23c353956b623e8193bd323ba9ec550f9c62b663a5510c818c7e0555c8605841bda70c347f0ff3c37bb34d21095c620ba6995ece411c4ddfdbf03bd08a614a5de9c13bb2bce63a6dfe5288ff409f9f00516116114e795057ec8dbdf61ac4b877b9afd99ea484e5c59dcfb03b6534360bc81c7658c0d4de5d84d7bf9d6df3c64bc5fef8cd9d429f8fa1db19f5e33218049a7fe536a1ab0932de6eeabb2b60f9b7b5432c7fe56dff9100c7c8296bee360a2143dc1ade2f92f4ab1c585f77f5cfc53323944b07ab026d8dd439265c38560d29eb98d26fe032ab233beabafba2e1525da3bb0e632bbac598efba0b38b8b504ebfe4fac3b5f51807579948978d1af50a4c5df66b35894505cdb7a679ff2e5090a6536d98549a27ced11b634a9dd379b0d7791dcce11c268eae8ebaf29e6cd01e4f7f00407bfa1dc790415756436ac46b077eb6a10364b9450a07811231a3f014cf777c0eebab8900a2478d9cb7be11f72827e7715cfe72a9b26aa9acc07e508980dedb34727aa180e323158835e962da2c5d046e546a7b35d3a71ae2573e10f05acf0f5caf8aa6dabfc9a1574a1eef15fc34a478c572b1eaff4cf901f63fb070b1d3f7d5f525b8aa8d34023f92cb309f137415b96054f9e57f0a46635ca9702303dc9dd7cbdc24b46c59841aa809bd373dbdf32488a3e3f356b41c501a5f90b94a1e1b8cf3e61009e18e94210b83b32e0e1812efe43210b5f384ba4c15de30e934d31bdbe9cff3ed4975b0c4da0d3d674f751e309c96ff38c49bf202e2cb60269651b9404a62420c374b988ca006612303b4debbd4595f6d0637e69237561017173ecba76aa843d7e876070f73941359b46c65cb4983932c01587a5d2c2f7081172b9e20652ff73a81733710e017b2b50707f2a6fbab6cefdbc9e5129a5ae04049b53ba7382a2d5c78fdce9938b246b6882cad116811d8c0c7be87a4ed12707820afc236cecbe4c553c4bf6f4a518d58b59a3a697bcd5f878ab303d200ffb00049d00586fac0882e21960c383683ac3f2c86aca0ff581197ee5c56b12fbb3060d40d9f450a5c5a5007ac922559a234d41f9298ce40667723865c4f1ff0b1b096913451d7b343174902a52751b80c923b427d41913042e0ce4eaf0fea0642200235e199eff66432bf4d53a26012ea8a8d619927f7c9f0a9c9990772c19e3cf04217f8883fc8061b694cbd30caf1afe91301961183a24bad7a53fbdf2b437850b17e6236a2beb861f840f6ef0076f07c831dbd9d895303b9a699fef7a118eee085a08bb61d83b4e641a869dc6615a9b626c2016af3c8f4107ce3771dfa1f9920b3842e0f4f130c456113060a4c3e071928ebd90ce3775d56336afb8b1eb03a1077e60786b75109abe273b959e443983deffb0f930f143f0153e85e0598bfdf80e09907fbb27ad08b7db046b19be630822bab48310030dac904d7a999c5e1a32056611b334d75164789a73a75bea1d5d6f2c7cef0756a5ea621bf02eaa950e9d06d47f6dd9af33920c33e488ec6e739aade25b860a0060f7b540672d39f46e64092507f8d758787b2bb16a7ec2bf7b65a70b05fb68bfa6c6b6decf3d777e6b5b0b9253e0ba20c199bbc3cf60fc24ca4ed71694836652ee6e7a8a5935c64e696d06ee72fa3696a46d2078c2128da007c1fad57417f1c2cb626f34a2dc393b08c70fff8668ee0cd9c3f08a205a80e20eac5437670628c9413bb68ad8a89f442bb70b92ac0c9b962d0f330e0de2b2f82fbd3730e95bbd4e50a8ff4f792862351c1c07d15b7f3e0ce0bd8fe013e3760701f8178a2ee86110e2be9afce91419efc8620551af717ce387b72a9ba83bd068bfcc21f55401c4a6dc80fde44351831423de0795090005e22520888519b57e83e600fcd360ec7fa9885b465caa820e05880708ba4217d2fc831f2d1d101c03f05b010975236bb93fda29b8129ce717a895ca016f4af15553dcacc7afbf2f64e6bb666d23f7e783b6539e48bccaeddbe83aa70c813c787581a64bb55b75a1cabe5033c7b9fa0e388c0b8de7ffecc2b23ee87601f2dc5d192da223feea7de3cba76edc3f57536a70b025e815e4c9af7fc4f5ec0d691b106d040d9a93c04e223858d95e2abadb53cd420d29eaac89962275e58b09b0462ff94e6f3ca4fdc2a0045ecdbda8218f0c04c8aad23dc82725923c98350c15d2470aa170e9ac3984ec62df285b05969aa32eecfe8b4e6fd5b38a1abf0803e2130716f0df48f381d56bb573d623858658c768207bb127975d70028cb8470e21f370b46de84ec1dfcfbf66addc9406a7ac86b5ed1096607b7562ffb3010f0ea7d0fa3de904a95f10720a28a2293ac57594b0bd91aa1a008c9e3be0b0c09c0dd0fc3d2361be613b0cb06c84f994018b963256d07d21985256e22d754e61d301970fed0781cf931aed808938f5103c84cd2e34ad4fb23d5470a1e8bd69c2d400c52b634d8061b2539473df8bb474e477abfd39f76b7e1126aee80def49427f036c50a7d37e2d6b56131248df2b8397d8f7c9847b1b5b93f9fd48c4f997ea320af4c274198cf3b466f315a3735a233461edbfc4ffca6478ba4fa32dbf4e2ef70904fbffe6d13466be5d0152d371cacb061198366ab7b43985f49871c2f41f1304d7a4517e8e300f75b71a655e405ec41d3b1994c57ef495983fc5e30c5557dc07dbd78b7e8c582c129a5d77204dea70692456c0e7bd811833a9afc9c42ab4fb0814bc9bd6087228f6cced657636114944f46e85bd3df766ab0feb726b72faf1025b418edf15550b96158b173c37158e0ba93679ee1af43a836e758b949ca843024ca0d3fb770f7104dc4c98446fb4e77ad1992a21dead6c704aca432c8f4cfb0740f9e3c744916b3024121c5928ee44906e87e944d40ac116fc894ae0786c620d6c45797e5d7371e7b1c64f90de11e3e7dc49cdb5d687f7ef99ae94b93482d707a6c8ffacc60966a3d37d6f412c461145d1725a83739db41dc0cce75c4f773703a9f5388a7eb647ed154ff718546958c22609269b155d5e9bbafa6e716c43e103b7118ca730ec5a650d36df4395c4b9c861d928a6f82da228aa1012416948150024a35084a2c836862051381acc687a49723ec84f6df2bca37473d59c7c5f0906d7edf633bb57f49d4a36cfb18cb139a46c72ece777a6c3f4d0c0c8ac652aab0440150deabd873b586c10ef5526fb5c2a6d96b0f25514afc9a004a075197d39085d6a951c68fe5955d800dba3f3db300121e61b227ce0b978b04fd0f3d2fa2c0f38146b0da08833f7fb7bf3276e37e7160d270bc5b52817a34e4a0b148facd301176df44eaf05cbb714f18fb105b5e84ee679486583caf9a34f54c0694cbd36080e410f48e9b523cb0d8aef317d4f689bc9fd0ff02f3cc5740f9aaac0c5b8cd0cbbf70ff6227fbd9a767b87ff182c1ddc94133fa4cb1bc82297dc7d3b1585d20e7f4035f9e5f26a9918dc7fa5aeb29bc0790b426f4cd2a79a39f6adef69b465066a93fd3f2552ab7a750138dc8655d49c0fb4e6684b858397efb4803260733501e1711ffe566cb10d779a0a3649f859844704ea73227b46c5eb365f8864a4b1055e87653c51dc879ad534572de7f8a502ef9fb4bb4e896b3eaefde2456dc3b1028b1f3ed93463514d9ec29491a9ab11cfe6505161fd614f32db12a65418ebca0c0e0cb34b43b1c2b4359e3340b5d2b7ef1cf2a904a5e255f7c78922cd33982e080e16931503175fdbfa43da6c83a47857c3340d2b374acaab85cfe9fe27d9eb09c436f9813f05315aa6671da45cabe411b2cddfff2365e001f6020d462ab32909abcaff0beb63a79539ea4ff10246a222229b2ddf74c299de70d3acbdf97c7f07d2537e2767a5b4455f081a40b766f7ad5d4bab427fa0bae2ddcf564b19e824006f1b0f34ee9a746b0c358cd5104859cdeb32d3332545accbf090d42f094c4c05767e2ad7642ef5d6e1d6343e94fba005b39922465cbde5baa7b65e77c36a4307c80e088c889c2a19fb3ada925ea15d62aa54f89a0438cc6f905a5246e8dcf80ab3c40dce9d3b8f50b11f1a2d60088a53ac8fa39d96a873c7dea0b4246ccee10b5b1db80ccfced77f9275837ff8a0f743bd1990d25f8b7e353027a497705d300ceea2faa499b5a7fbed813a88f0a9308d77c78148c5f9cc88f4437b9961cfd70868afef596604b63efb7033843fd7d245917c4bc18eee1a35229d032684c59207e726e9ad9fe16d1c0c1e51e6052581a1b9b80673080c0568f6969a647786a80379843ff035f44cc3cb46462f897ca8069ffd921e56872fc84a33a4fdb7093c0c890bc177227452130009dc5b87660785776ae083144387555351380db554820ecd9b4b33b3ef394c26d56116cde8688f67339d058c912c88f0e8a7de0084250ef7c686ffdf7ef5ad1829af39acd8c0cf14015398ce192d2dd93fc53b23092700d0a8edbe919297c62efcf00e48f64153c2018a65cc80c3fb6d5252807471650552904c49cbd7de01527c62a97639f0162ba2011b8366fa3433fe7bc454f4c90a92b70852e3573c230def6a75a231277ef73e9f337cfc3f2952d0c9795e8d4806c5e627f0cf24f760d4572826731a496c3b323d6ab98c870efde5c3fe9c690d04edc4027d69f69ebe1656c04e06a3c5265926256cbcb5343df7ca80ad6aa3fc0ac3fc5e2ba29a942202c077282309d3f305b25f81e13d4baa2d16d383bf57080740bc3625b96fe1393f9edd8d956f0339758d0e1746445a3cae301d95b9ecd90b97a9112ca9d52167814e782fa4d7640231ca86086ad40bb9760856fde692bb013fe9672057403055fd91b19f2cc44d7f008a4a573c72c26067e92a40b7ddf50ae5dadefa0a665b216a84160d58aafcd4e345c0ae0f92164b292d1e4754302d0fd277d31d355a6e8106d84868fb83ec62fe323030b189fe671dc9caea869e640cc400673893c99f88e0505da49dc5a0f90eddaf84a66cf4f2f3c6e11ee591d602cc030c63d59bf266c4bebe7c1b66c1bf246143164b4de54744f00f444778af05fa108ef427129339eae3340ec1d43dce8a14d99e83aefab957424e5238e77f031f644990aad3bd17f2b3fb9a816dae7a3c9f2e7fc9dc25d7665ada90adafe50c9cdbad79137a4541e89510778e85926d2d91744b8c090ccfb92efea599ed370e134d775566463bc4d30d163d906d6d19b47bd7bd44eecb89f75b91a9d86cf101caad3fd46b8470e434d96280ffcd670efe57a85cd853bcf5b5598e4ff1ba0f0dfb9450310dcd4774a0009f2b91f0a0603017ba0d32142b0826275d2939379305212767fd00bdbba49e70c1c3c58c5984dcc118e539c4d49740f03e477ef250498fd109944e1b59081b7e839888369fc7a2de206473217683eecb3f51184577bd924cf06d48d02e7e0632894097607a60a21ad87b9e89c1c2aaf38f06098fb28c8e850c1bc78239cb7686ada793b16274f5d8c05cbbfc49104cfca9da730f789ee047d041787bf07e5509301463ea42f520ed3b0bdb5e52e5892cbbe4060cdcf4757ec48c5654b08407de6a25d17b3138af5278ed61076927944aff8516444a1358ad64de92af03560ce5fcae3db166d478c07d407731f850de5ea7209ebece485989433595e9e9c22b11f892135571ad7f43bb92a8a2f68d6d65d182f7178edd25c725eb44437afc971d2ce9720e58658162b6ebc9abc5be81fde2b1e82cd031a8ff3cb624b2bdf17f1da7ceca80b9738a0022a5a325cfa85d77c431f11bf68dc296672989f2ba29a05f5798861835e79dafac3d272815372824aef5d39274b7381da6a3ecc6a09b21deac347694174a0f42a62fcd4df53e51419c42263b3d323185d46ea956321969751357cd53b383e0c3235800c10ef6dc294731eeaca48ec2b88b39728860dd5074cea83f111555dc07ae1257e76b7412f9492ce7923c1eb54cec26cc8c06f64b7e7831960c25d448d886065256d839d503388650c3a18c40c496c5468569ec0d4957c308e85c12d99add9a70979ee48cded650dc39a52e77e980cd6be46c474222b107984cd277417bddb692602e4ba925eaffaec6889c66867b82e5c3484061cd1337e2e245bf5c4a6e5ac2e01316f23d1526ea9b7ce97a720c7e67e276a18a16e11eace58c83edc490f371255568f2c8daac02301648169128c6b492519c5ecaa4f37b48232a811373a804cf23b93c07631a0041989b31021bf77f9cd14a20342d44616790eb85f8337ece742364c6af9f4c604033647ec5d7064ae072487454a1e21ccab8bb948d4fc95493cefdf46f794ad9bad3847487128d932f736dda564703224a1e7fcbeea5f569aa198f84545efc5c6017e4451d4fd65c6241ec7fca593d39ce7853d763ac5cc99be856df039841f8ba6782041153013527db153b5adea418d1b8c32b0fd5a82fc1e6e3bbf6601e520f2750b0eef33047a1a81ecffc658b6032c75d07db9af4e405d7a5841b79851aa6ac7de073c37ffdc44151f486de5982c32be8417e9a4b450df0a5822489dc1fafc506ca39cd6dd86fe83bee7683458171cf0d97be990c49af3bfe4937337f444e940e03f6e244ef3a43f1e6c0523b855df03ffa12b9b0ec34a1c7f17a2bd73870ac7780c0cfe17a0752c195707b139824ab8e5b1643395303e7614e307ff881529df9b5d7d7d99c2e5cc833c56adea2618ab528ef19eaffe08bb0cc07e621ab6c3e8c800e6270b48c1e05dad74733a7579428cf7e76b2f1f16171deab5e4c3b51954c0d18f7eb5c626fc4fa4e70fb7595cfe9261befcc7656dd1bd7acba7416aa1185e6da1ca9570b886ec85a66321608f8ac10596ab5ad948974f851ea7a897d4ea42f375fc5e967c8fd3997411f6bf392e9e9641b59db3bb356de5a34f2ba6a34888c7a9aafde60350f384583d76d55ceb8d6771f986624b0d859959b4a5a74ba85b2ba53ead6d80a44e078ab7fb0c6bdafa07943105ee7d273be9bed14d6127a7164925a78f703001f6a2a7eb11c54f7a342ff0d253e24a6235d06f97061a42a3b68db2d84328df6eee8dc94624292adf942b0183d5f67c44c88800fb1771a08482c32edc510564d6acfcbaa1d7d405a20c4e47f37288398a18b2dae47e9cbcc8c95e5fbd2c070dbb963d0558c3ea844d8c6cba6c84f9e9eeff93dbb72dafffa2a8fed6c4cdeb2ecd6524f54ca31ef4228b560ebe6cf1712597547febe9d5da2eb7017adfaf70e09624fdbf81da5ad7d6298574d311bd900ceb189452277334540a13616cc4a5f1ed14f140715d0047b6df396aa3824e6ea01ef308b1c0760f1423cc1e09eb4b63dda71a1c1f80cc1e191eecf789485b4e89940cb5dd35f4a16c8ec25cbfd1fe50068e8d9c91949cf65ba679784a5d39cc9c6805867afb90f4b76c2d956821752d00d68a16c7f11984e1f54570773936167ddda9add1c8dcd105903ec6315a4e5a28ec3d0f196bec7bf77a0c086285768dad76d3e812921cafb579f5e0c42dcba829a8e3c8f4467ce892b626d32602fd48e6da95ee3e2d923dbab4779664a472b7e42657be27b40f14c3568c56d0ebcc15a5a8ede4b3f43fc057e60f8f4d1ca802d518929734645bab8069016172120970ba2365248d697c5cc768b1107cf015f4528391820a16ba6a2429a0c89a495a45de09f8cb876ef0d6266cae9d50ad0c8ead39152ca425f3dc0712dcb6886e006f5048febcc503d1ce2880e925bcd6e90fe23de7341a12a4bdd253e251412629bbe5f927de264c5efd99a70e098ba05e11c0f0c8aa612b38d42a0944bc4fdeeea518a599aa3526d992d80f4d9574775693bc9ae4ddc5095c176e57fcb74306bdb353fc778c9581f68af828d4b1cff1d0b9f7146b7f1aeef8e55828364c51ded8c4295963baa8331b56a2580115ddce6659f4fc608bf3b44a588342108c33d6d39e0e88d6e3bd52b0d1388794d1b5263000e610122cf5cd3ffa42205053924edda90a4b623da2adebe3ffa3135866a19b7b551a904860d97b2cbcd74adbf1a8cf705bbe6b6601587bf3a4b66a164893793c76f677b79ad5ec9e400362b3d2b1916b16c7193cee13f6541b36a80e45745d2e6a99853e8c74221df7caf1beeaee59087d46c4bb120e2bc70a3f8937236ddf5797de940f9f83c1fdb1c7a6adcb7be1b49eeb2aeee75ecec53576a2984be7d1ba494736d0eb132d1c713ba75a33ce0dc77639aa1eb9c444d0c5f96072d45d391549ef96ce71191797fd1c059886c2110d2386484d43f7a311e062a9406a20c392cc4b3cb193864c9c9b28ff512b6e9300cc210acd00c05a53905f677b862956018b5b4d7507c98cb231cccaa3f1a718665cd353d1cfa36f3d10690bafd53e01275a626fa4ee7afd34d421dc8a545e343bd95a12c192ccff140097fa5a33b21a6f6058065127625574f9ea06a44c8dccf3cf7cca3fdc09766260d2c3e8c7a8d53f90e01d2c1cdd6d22a2e091e8471ecc1f294cc93de807ea7ca0f11f47b293eb24324a0537699bd3a0dfa409eab66833b33cfd4720ca24e86490161662cc5c2554e02b44c7b62c59e1d767b8b0e1438b64ca9ee8fbd9026ba3407177d143dbbc16ee08abce96dfae4f3b8680c5e0e17f17a887e7cff2364348d0505f2a3e05aae4e19ace2ac744fed130264c06c8ab29fbf2ce01870e3be68740858a2fe71c0ca57320b594bab089a5c9610d3d47d556c11e60ed39962e0d78e04092a4687c4eea07de9dcf29185fcce2ca54f755650a6521a163d922686b6e70dfc5617d9a8355692f2940c27b2e387815f17f971131c9f885ab384708739e605620deabb528409495f3241c601bae632054b0fcd96a78305ffe1caa49fecca07ce0cb5560266a06fc3c01bd730f44176a4d40d2b26ddfbfef2a9f6ab0e137805eda7fbda81af8a82723efe5aaabe17b31c963fdf6b8254a944a625ea0348910e4d9109141f6fe01d5fcb471197e55143ce55854412878930add65c69423c6e0f6174d2e5dffaa0504b43ce09ac320d1040fbc06ee5d93cb750e9e547397a8c048fed5e5bae73d4a86b843289e9821148a4aba4fb25b2ed12edd4701894a9430f1a88d25a7fd67dcff77d507f5c07f77fe40e2a941776b455681f9a05e238c904f4615976c47f2bdee35592c6db210452d7ba57091100dbe2b7c3061cbfcc970aa06c954b641b1183765b84d6ecb3e3ff0a901699bd9874869b10266e8c58e409" 126 127 tx_raw, _ := hex.DecodeString(tx_hex) 128 129 var tx Transaction 130 131 err := tx.DeserializeHeader(tx_raw) 132 133 if err != nil { 134 t.Errorf("Tx Deserialisation failed") 135 } 136 137 tx_bytes := tx.Serialize() 138 139 if !bytes.Equal(tx_raw, tx_bytes) { 140 t.Errorf("Tx SerDes failed for rct simple tx") 141 } 142 143 if tx.GetHash().String() != "2649e0eac5b836ed36b3f4e512824855e222cff7b84652452c769bbed9d06b73" { 144 t.Errorf("TX hash match failed") 145 146 } 147 148 tx.RctSignature.Message = crypto.Key(tx.GetPrefixHash()) 149 150 key_image1 := crypto.HexToKey("ea57543450b2b743e729af2daf02c07d65928d25965fec14be1b70464ec2ebf1") 151 key_image2 := crypto.HexToKey("7beed79270b09d389e28307c0360971d0bbc946e16e453d32178ba0c398b88ec") 152 153 tx.RctSignature.MlsagSigs[0].II = make([]crypto.Key, 1, 1) 154 tx.RctSignature.MlsagSigs[0].II[0] = key_image1 155 156 tx.RctSignature.MlsagSigs[1].II = make([]crypto.Key, 1, 1) 157 tx.RctSignature.MlsagSigs[1].II[0] = key_image2 158 159 // the mixin information is pulled from the chain live 160 mixin := 5 // we know the mixin is 5 161 tx.RctSignature.MixRing = make([][]ringct.CtKey, 2, 2) // we have 2 inputs for this 162 tx.RctSignature.MixRing[0] = make([]ringct.CtKey, mixin, mixin) 163 tx.RctSignature.MixRing[1] = make([]ringct.CtKey, mixin, mixin) 164 165 // mixin ring members data for the first input 166 tx.RctSignature.MixRing[0][0].Destination = crypto.HexToKey("1b49d3d98e6b4e806b98aa914835cd8a289cc2e095133ae70d3c6f3cc7d853da") 167 tx.RctSignature.MixRing[0][0].Mask = crypto.HexToKey("40a31aebb78704dfd3863ac70a9f41875e901dc5b47304d391cecaddc98b9d85") 168 tx.RctSignature.MixRing[0][1].Destination = crypto.HexToKey("2585cdb08b46f1379c0667bb65ef1b378018e73056ebab6de61925f2f92ac757") 169 tx.RctSignature.MixRing[0][1].Mask = crypto.HexToKey("087ff2bad0fb9b04558e411d37995021bc6905c8524b09a126d16cb06ea64ccd") 170 tx.RctSignature.MixRing[0][2].Destination = crypto.HexToKey("33d1d1c361ba2389c8962bc5ca343d98d3b12356f40cec28ce58a3074e0bf17e") 171 tx.RctSignature.MixRing[0][2].Mask = crypto.HexToKey("e91b5819282e26d342ba5be35db49382f3c0d5e9b87a4db22587f8bdff7c9fd4") 172 tx.RctSignature.MixRing[0][3].Destination = crypto.HexToKey("1fe98b07454eb16345aa029242d1fc0a038729ede9f5d6972244ea5de35a8994") 173 tx.RctSignature.MixRing[0][3].Mask = crypto.HexToKey("b4318aed49e2d144dc51dacd1e64ab634b4516ae0c029e5943ee03021ebd0d29") 174 tx.RctSignature.MixRing[0][4].Destination = crypto.HexToKey("f5f5b71901d11518a63a164ec7bfdb0114e7fd9f24f30c559ebb7267e9c132a0") 175 tx.RctSignature.MixRing[0][4].Mask = crypto.HexToKey("481a7708cc2dabc885b94fe2383221e6725a4e0e1c80235d9320cf9a621d2d9e") 176 177 // mixin ring members data for the second input 178 tx.RctSignature.MixRing[1][0].Destination = crypto.HexToKey("8fd92c715604eaa7364e91b6e6d7a556a3acd8faccacdfeee03bb509a6219d93") 179 tx.RctSignature.MixRing[1][0].Mask = crypto.HexToKey("2aa50f825dda8a698b2c72d45af0013fabc6427d5d7404745d68fcc4371ad51d") 180 tx.RctSignature.MixRing[1][1].Destination = crypto.HexToKey("3966afd77d1e1e544832cbae29bb4ba8585baebc8f840339aef436af8cadfc9c") 181 tx.RctSignature.MixRing[1][1].Mask = crypto.HexToKey("b1f74dd419401716a734d8a5bf5c0ce602ccaf52e1e477cb5231f584f43387c0") 182 tx.RctSignature.MixRing[1][2].Destination = crypto.HexToKey("8123e2329679674f066f0b4fa49d0ba9652f93e394ec072ad4ea2671723bf4c2") 183 tx.RctSignature.MixRing[1][2].Mask = crypto.HexToKey("6a1ecd9721faa6e3ede1f443ba47f62bd34c8dfccfb245d03d979870cae167e6") 184 tx.RctSignature.MixRing[1][3].Destination = crypto.HexToKey("48068b173a0051d21d8d0e1d70cbab043b3391f9c1daefa7d7e7ce93ac90be27") 185 tx.RctSignature.MixRing[1][3].Mask = crypto.HexToKey("48677f0f2e0e1243ecd22ba2038691545fda58742c5a851fcda05999b5d31b67") 186 tx.RctSignature.MixRing[1][4].Destination = crypto.HexToKey("e1594fdb28baa22571fdf487f20c1439c4ddf34952d3a405d8bdfa366aa9d86e") 187 tx.RctSignature.MixRing[1][4].Mask = crypto.HexToKey("210e5eb6fce6d6c161ff27eabb7c8fb498f8c3cbb26726dab0f59537694592a2") 188 189 // test whether it passes range proof 190 if tx.RctSignature.VerifyRctSimple() != true || tx.RctSignature.Verify() != true { 191 t.Errorf("Tx Verification failed for rct simple tx") 192 } 193 194 }