package com.yoghurt.crypto.transactions.client.util.transaction; import java.util.Map.Entry; import org.apache.commons.codec.DecoderException; import org.junit.Assert; import org.junit.Test; import com.googlecode.gwt.crypto.bouncycastle.util.encoders.Hex; import com.yoghurt.crypto.transactions.client.util.crypto.SHA256; import com.yoghurt.crypto.transactions.shared.domain.RawTransactionContainer; import com.yoghurt.crypto.transactions.shared.domain.Transaction; import com.yoghurt.crypto.transactions.shared.domain.TransactionPartType; public class TransactionParseUtilTest { private static final String TX_NORMAL_HEX = "01000000016d5412cdc802cee86b4f939ed7fc77c158193ce744f1117b5c6b67a4d70c046b010000006c493046022100be69797cf5d784412b1258256eb657c191a04893479dfa2ae5c7f2088c7adbe0022100e6b000bd633b286ed1b9bc7682fe753d9fdad61fbe5da2a6e9444198e33a670f012102f0e17f9afb1dca5ab9058b7021ba9fcbedecf4fac0f1c9e0fd96c4fdc200c1c2ffffffff0245a87edb080000001976a9147d4e6d55e1dffb0df85f509343451d170d14755188ac60e31600000000001976a9143bc576e6960a9d45201ba5087e39224d0a05a07988ac00000000"; private static final String TX_PUSHDATA1_HEX = "010000001BC20BE805E6326E0366240E99D50896BEA4786C5D31F792A707CEA4616138D7AE01000000FDFE0000483045022100A85DF5727C8D2D313B64062D68B0EABA6AD3D72566DC521BEE9294E9D66556CA022035A5A59BCFAF0B855E8A8D2AF8C5C48D1AFA19405B9CD04036B64173449A486001483045022100EBCA9E692F6B7536367A8180A642B4C0D2A06AD5CB42E2BB7D81A4E8404D97BB02203188818CCB3343F7175E6380AF2A3F2088F518486A6DB8D3BBD640FBFEB17ABE014C69522102AC37E1CAFD408BFD43F4713B6ACDE6C3751B7FC0CF67477DFE4359411FE5B2E22103B74C70650EF754024DB2BF7075863739A9106E10462C1A89F3DBD0EB83E02D4821022592AEAB55E3D0232AB11D3FDA2E2792268563184FB6F9FEAD38F7DCF33CE0A853AEFFFFFFFFAB3A6131DC0FD56A63D21D7A2C0B12A5ADA3EC9D3B5C14B320E07330BD36696C00000000FDFE0000483045022100EF401690CE93F2EE2EB13C99CE3931BFCC5F3BE79E6D342B34AB5718EBF0C6970220563E1F9E8AC9C23F7CFD8F78ADF13BBBF78F099B6D87E914ABB3233C5496826A014830450221008853185A66676D92422B61CCCD532A3515354418A2F098B385CC10CE8949416F02202D20903D2515BEE17D6591419654A472239B5031E3A3E11E6DB978120E0AC337014C695221023DF2E1284892A9DB530541A3D3B01B76896B7D0AFEB2EECA08B1D32D81B7D8BA21031F579FCDE65989F1A73F52F8F00E6A0EC3B3D0BA002C42D24AACC9048BE0F42C2102DEB66A2713C468C1D9C7F81044C7E6C87380A0F6E56F0ECB52218D839614173B53AEFFFFFFFF1E58A59CEDC82986F74CC77BCF847F8E627E5425334BBAAFECBD7011AEE2198638000000FDFD00004730440220114662D4B4A2B907B8210D9018C1BD4878B7BFB8635F361914060C58F36060DB0220364CEE28C84118712CE4C2EE3183E2E3784E204BF9986A0CC9CC465A2CA9719501483045022100BA7DCDC910BC3D33CB39D5B8EE8863889379380EF999511C91252C562844ADB802204A141FD32F2D597001069A2EA4DA12C0C7B4ABD8C1193F5D9699C9F5E2847BAB014C69522103C66A9CBAE9ED33F66EE01854572B98452BA8638200D81CB391FC9361304FFD4F2102CC63BA828858C3712CCF1D4CEA82AEF4F0BB2A38DDE488A5423516F6BE75AF81210381F27ACDA175D900115BFC7B893029C3C00B884B1D249C20FBF302D2B6F1F20C53AEFFFFFFFF928E274819AE3BC02AA7A9743889BA4A3652EEB948D6C57341D5957403CCECF203000000FC0047304402202727D6F86738F0CA9E53F59C8D7D0EFE6B710CD2E8935AC614D1FAF615E780BB02207395A344819158C5FC4948E6FC6E060C75AB86D7FC00EB09E293DBC4C79A5CFB0147304402201DEA5ADFA33888DFAA081655DF6EBC82F56D76D1BF5436DF17282C555C02450602206D26570170AAD7E30303F637BB5DC30FB45E8E5A67EEF85A5DEC4AD3E8495386014C69522102D70FF18BF9C0F1953A868D8368E2D2BBFDB9C152F37F7CC6C51AAC996B7DA76E2103935742F0632FE41C78B55C21130AA3F52F182AB70CFC570537EBD967C4CCEB7F21035AA98218EB508F7311A6B01B360DB256E35552C50B8C27E454EA334A96FD8F4F53AEFFFFFFFF7A8F70E9573F8EBACD888C7B55180E7F111AA70A166FC60597C8AE4C558E639700000000FDFD000047304402203AD0F3AAD2B483AA253B5D43219D71BDAAA45AA5C15E53F16E060B9955970F47022020370B9A110BD83DE404E648ED4CD2900AA3CAA993C4DC72FD8E33B0BB9F284701483045022100BCC993E4969E65389F5C3B2D10945B9A84E1CF98D85F27323574FF29FBD12D31022025AA86F623441067492745CF00DA0F7538031CE6A3F7692DF0F63BFAE2AFB837014C695221022A852C530B2CD1AF01237CE8473D46D2A20F7D163AC978C7B1FB2C8B0B5D707021025CD79DDBB46D0A6AC80EEDFBBACDF65AF52CE348F15DF669148128B7E945C6602103BBCEE1029DBB98F73C9EAD5E60E6A260B351E4D93AB7F41EAFB8FF7064F1BF4753AEFFFFFFFF2C7076702A3D82C32CE4EDF48C908578DF90D4B14715F3CEA0B1B3AAD41A10FB00000000FDFE0000483045022100AB6187F1E5652A7C3A32EBBEA9C605A71874CE51EB80F9D443A66A427099223802200B1FB46E61EE4E0B64361445BD0F33202C10E5CE4D87F4F44588F74719C1C0D701483045022100BB5F8B370B191D1864096F6296A39EA54F592709F79E3A9CC3EDECA29B5B8BCD0220583344D18D18ED088E964E27F8FB148673F12CDA8840338017DD6C16A54CD308014C695221023DF2E1284892A9DB530541A3D3B01B76896B7D0AFEB2EECA08B1D32D81B7D8BA21031F579FCDE65989F1A73F52F8F00E6A0EC3B3D0BA002C42D24AACC9048BE0F42C2102DEB66A2713C468C1D9C7F81044C7E6C87380A0F6E56F0ECB52218D839614173B53AEFFFFFFFF34D6E44315F8B7A6694B9E501511BC619F08F7933048DABD2F5B099A96E7141100000000FDFD000047304402200F69D616D9F1B140BFC87B9AF4B36D087A054CA705116B9EA9F00C10BB3EF1C802201D1CA65399D0DEC47D1A1981EC6DC7FCF1E2FC73561D2478415B54EA21C16D9701483045022100BABC850CC7A71F3EFB4403452D7D7165245DF089D1AB51D7C1B5F92108E1BA7F02206F37FFE3833909988AE0F6729B8FE9213679E386E04AA02B395156009648FC69014C69522103EB22EDD5E870B6654940DE01DA9CC37C9CCC1360F276FDE70F77A95395BB1EFB21039DB8ABCE8BD77B1E9913BBE6306BEB88914F76CD0A34CD468BB34488A89827B32103F863035FE5012619EA68534EA62CC52EC78AAC868E158D80A6669A54F0FA55E953AEFFFFFFFF5FBD87ADAC41525E91FDAA75C458B792F44307961043603ADCE3D013D3560A4800000000FC0047304402204E9132527C5AA8AF32FE904FB75B9B7DA2B2A37ACEBB171653BD9D98332D38B70220260CA923186BBFFAC9835012B068DD04297934B93B283D3D595FB0BC88D2681401473044022052C2BA2183D21FE193B0C12730329EBE2B2CB62B0B4E240A61FE6CE20C3974CA02200D3CFBB78F1A99E46129610C67A4049761FDA2421E1CD0BA887E7E14E64525E2014C695221023DF2E1284892A9DB530541A3D3B01B76896B7D0AFEB2EECA08B1D32D81B7D8BA21031F579FCDE65989F1A73F52F8F00E6A0EC3B3D0BA002C42D24AACC9048BE0F42C2102DEB66A2713C468C1D9C7F81044C7E6C87380A0F6E56F0ECB52218D839614173B53AEFFFFFFFF92B2183D95516A4F6F182B825760D933C0E18F14AA67CA4ADDB0FBB9D01D0FF100000000FDFE0000483045022100A65DB6AEBA331BEBE155093D8A4344D3C111C6097F206A760D8ECECAB78B6BBA022045BB6239B844529F5D831CA58E4FD2C89C830F4C40CB414444C356C97FF569DA01483045022100944A81F9307DCBC63422B8873716A4EE6D1CC77BE0575B169B3F760B9DB21635022032F593344C4DAAC72AA0DC3E9D5F60D4A75315A89EC75F8C0EC73DEEC86A49EF014C6952210215AA9F23F2B42C07A89159C8892B0965C396349C41EEF2E7518BC072843D29A82102FD32A6B1CF3B54108943C5AC05BE995193335199A8181AD4AB2CF25A728352D721021342598EDC4BCC19E74CEA219ABB3B04670FD9B289C6771F1B8567DB42ABC5E053AEFFFFFFFF00C4CD24A408D95FCB81CCACE9A8EA238FE46339A279C5F9492CB012C47E280F00000000FDFD0000483045022100AA2FB87D60ED78846161FB2E57B19D83FBAF94C0AC449044FF06DE2CDE12818D0220541FC034EC041D483AA2FEBD02E0118F742F19DCFE068E3CD89F5BDC66471CA80147304402201E4A3FD04FAD3447F2A08815C894CA13B2CDDEE6DD2BF958861CFA2642B2B284022067A8E1A60D3053AB00F0A375C47EE06AB7ED7982A5DA0A6F71EE25E982F6D6C9014C695221022702A3CC53152DF55E47C8008D7F0D3A43E2232FD3C02AE8C29B1E77FD4567692103D24126E0C82E44DF800D29D057731C24AD973A5095CDB8F2262067E93FC7F4C62103FE4623504AC7BBEE4938CE8FF5AB4D768693BB5FF5D3D44EDB093113ECECD5D153AEFFFFFFFF75B1C0B7D0DFCA16A8E52A92C918FE94C8F66DBE9F8388B67041C4C257A83D5300000000FC0047304402206D8220D51AF68C318CB9CB865CEDAF2E3DAB3A4227D7E4D07B36219D33753AD102206EDEB6047999A06C8A01F7653580CE115E7F7F407886C819A678A0A593B8849101473044022043D1507EAE364B91453E8EE431FEBD3EECB49A74C089286C70E895D32A30ADE10220472E2AC75D047C22C93FEA1934E0FFB0EB6490E19ABFAF77EF3CA6169CA16994014C695221023DF2E1284892A9DB530541A3D3B01B76896B7D0AFEB2EECA08B1D32D81B7D8BA21031F579FCDE65989F1A73F52F8F00E6A0EC3B3D0BA002C42D24AACC9048BE0F42C2102DEB66A2713C468C1D9C7F81044C7E6C87380A0F6E56F0ECB52218D839614173B53AEFFFFFFFF42F404F9F29A66E3E7DDF6D3BB273F7638F2580A04905E74F1734BC936A5F0AA01000000FDFE0000483045022100DAC9B9A4085697EE5D3E1471C7FD360CF86A849407601169688F18A755808B2A02201DB4B16017644A2C2B18E761EE5A5E0D976BC3786C10A914166CF577FA44796E01483045022100F8EE347E1F92733D45A5A2B007987899D1E0311140028FBD2CDBF77730BD7FC1022035B26D8CC14F6B95BD1EADDEBE0B1036DE5905786005D77D384B1A96711895D5014C69522102C05ED5321C70CAAA3E43190D88EAF8B77CE4F232B2EBD8E69167C2A1423395312103382717794D64050FE4DDB104688C9231FE0114DE14D8D1470D6CF65613757D6A21020DFCC0AAB0C5D42759BC0DF04D8CA6E117E14D7358AB34BE02FD808E767B336053AEFFFFFFFFF251845CB97B1B976450C92A7FD643CACE764514EBE41FC438594903C37A191201000000FC004730440220617FD96308C13007259E35E74B5D9214AD0EB4EBAC59A9389A418BF4BB3BFDA902200E6B0E8423B817CA38796FA6C88DB8967AC2F8680474D1F113E677D51D6A814101473044022011827CB224D9BBEF0B0EB79613A75DF8C0DA6020E457829E04ECCA228678E87902200FFAB8134922F04816F8837500A9FD0C04248D8EF7F2F62B6AD659123A6497B1014C695221022702A3CC53152DF55E47C8008D7F0D3A43E2232FD3C02AE8C29B1E77FD4567692103D24126E0C82E44DF800D29D057731C24AD973A5095CDB8F2262067E93FC7F4C62103FE4623504AC7BBEE4938CE8FF5AB4D768693BB5FF5D3D44EDB093113ECECD5D153AEFFFFFFFFEF981C1942E79C50F8D69CCD91B33CC24AA05A3344BD2B4FB8D11CF5C539071001000000FDFE00004830450221008B18B9C376342817EC67D60D71241305697E03431B35F419611FD4F5359119250220119FA122CC2BFBF50325A3751AAEDC60AC0E3F5EF1ED8FE6511CD820D7F33CC601483045022100F74CF588C574097EFC4D903596D87EB81CCF76AAD9CD6ADB7BE015AFF0ED3F6E022036870AD1866FEEABF909A64D1518739F8D0668D7996EB3E7296B17EF5B643D59014C69522102D8311E9CCCC68A12CF74C38416A9D4EAEEDC64C13B4900F758CCD2A52951663B210349227730D8D970E47CE356303DCF37D5750F451A03AD34B2562C8111D2B802C82103A0C4D78BC8D70FD37D106D638A0B237F902A258A75A5F1B30AF40B47BBBCF89353AEFFFFFFFFE1B87742C9ED22463A710AB40F5B97D549EC9C5784EBAD01A581E13E909A005A01000000FDFD0000483045022100A6879A6CCFCB4806F96938201426D5E00A991CC422C945C299C9660D996CD56802206AEA415BF620E06A0F4BCB17EB58887A7A96555E0EC9601E826637DB81BFF75A0147304402205F14FB4236F800440D9116C72BB7E22D7240AC58A9A8670246ED1316E06AB133022009C1C3A05A7446C842A3AC393E6BF6E3C53CCFE511340F070B552F95AF6ACBF2014C695221022702A3CC53152DF55E47C8008D7F0D3A43E2232FD3C02AE8C29B1E77FD4567692103D24126E0C82E44DF800D29D057731C24AD973A5095CDB8F2262067E93FC7F4C62103FE4623504AC7BBEE4938CE8FF5AB4D768693BB5FF5D3D44EDB093113ECECD5D153AEFFFFFFFF2CC24996052359D41513F65C62663C4B11A430205706A9BF8B1FC520A11D497501000000FC0047304402205052E521C980B734A60DFAC26643D158B93DF0431E074CED7F6F29E612C7AC2902207E7AD8CE2334BCC045DD6EC640D2139F8384740960F62CCBF8A8D870DB229715014730440220275C08CF051D5A2361FE37E562617353CF3C01FB0CA60295D80B7C55E76037D50220353AD019A30420718B7B9B54E4075E2975B01D4F101BC95403C407BAE3FD7C6C014C695221023DF2E1284892A9DB530541A3D3B01B76896B7D0AFEB2EECA08B1D32D81B7D8BA21031F579FCDE65989F1A73F52F8F00E6A0EC3B3D0BA002C42D24AACC9048BE0F42C2102DEB66A2713C468C1D9C7F81044C7E6C87380A0F6E56F0ECB52218D839614173B53AEFFFFFFFF1F5B8D4CB3B59FB11CADB6CFE50D60A1ACEC2B82DFEF2562FE44CB6FBF9F82D700000000FDFE0000483045022100C142D37A1B80C6C9E0E6A997134ECBAF4D36424B4A79B8701C3133011820D9C7022002854CFB8E422F6D25D64D9DB4B6D692A3336C45D2C628CBD996E2450B4F667F01483045022100E148F4251BA248FDF3B7626FB0B0DEF09883BE34268E5AA7D44313ECA92965FB0220020C500AD9CAACFAFA690107CF9DDFACE01C6F92A009BE8ACE2917105B688404014C695221033C3954D2EA045A76403AA0CBEFB1ACDCA00C809555FAE6EF1C088CCCCA0621C621032D6100B671D2E4286151C9CD537095B7827FD1864D71F798903EA51B4C818BA02103628F7592508B1365B3CDDB1AEC6B007BA307138DD4B5E1216FE887FE7949A77653AEFFFFFFFF89AF1B7B89D1197D8A55CAF1BB7AA88B2FF63DA93D8A5BA04239F1EA4D79442100000000FDFD00004730440220124ED92C1FC7B95E914BC2F563874C1CCAEEBABBFF8EDE2ACB30B24EFF49F04B022044154164D964D38ACD6EDE7237FC67BBE4EC0774C78BC35DF43A278CAE32645301483045022100A1EB408873E6AD3C87BB5454D842E50CD1DF37E7F144554E986C1B5E3572EE8602204133714D5B13041B4C283B63CD0248FF9C05361DBE6DF115188D037FE01D2582014C69522102ED0A54976D71C45630D745F09BE097BA79CED86D5E33816C3688458F9D32A2642103DF71CD0C6264B965D87ACE332F89A1CDE6B94D7A7786EADC16E12888A2F0E02E210339F4FC9B6AAABEB60B681D9E2D7303F715F715B44611669099E58484A1CF5A0253AEFFFFFFFFFBA8B32C957C446B7A983E7C825D067C223BDE0F305555DB18396DCAF55C4D2900000000FC0047304402202F6BC8B12F54F8ABF07C2D7FA6AC6223ED1C7DCF9F9262041615538C973CE95102205489A1712615D5F254FC0DE058BB2418E5FB9A36B87C2D0A8F45364C70C126830147304402201EB9F5B94DDBDE650673DA86D142AD11BB5AAF1C33F8E53A954D8884C5D1734C02206DE6E33ADF28C9C8367CD7EAA57569B9B8E052539911E17898455D3B9D21F0C0014C695221026DD057FBFFFBCD2FBA64811EC06BA6B3DCD4DB93D9D842B574C9C845EE2B656F21038B46501A8A7C0B0C7DF37742AB21BC1151213F5DEF449C59A8220B3780CA31502102C9AFCC7FEC7AAD4506C4489BB69D81EB481783D219790E2491296A860027236453AEFFFFFFFFB7FDE2F791BF04F746F6D4D27A97519DF873C7B9C9752E12DFE8876958AF238003000000FC0047304402200AE448A3103AAAE51D93D6B01828A4A715332ACED32CCA7479C79EC49B5153C5022034824C933A69DB18B8C248DEEFC1CA2F0B404724D3D995CDD9EFF62B29DBCDCF01473044022004E54853778F7B55BD6C4A5E0E7F514F544FFF30047161A712735ACFD593D4F4022074BE5AB017F705E539CA93CAFF318E5E789F0817CE5CB73253EFA2DAF01F6512014C69522102872E7A6C6FF589DBEBC06CF8776E8B23B0F0A69E77CB20F624275A2338F34E2D210272E702BC4E17A28947279AE321A473237CD6EE4059C832FFBAEB8A3FAC305D6D210245FA05A47B635BBF99B510FAAC61F786D70A2ACBA7D034179A10C490E81892A153AEFFFFFFFF6328E5C5D67DE1DE8042D905EE4BB1E416C9DE44FE501442A886B8667E53CA8000000000FDFD0000483045022100FC63A004E32AC081A15FE92FE5B52FAA770B22A17012F64FD351D58655892262022020F024A38365F958793D5F0A343ED272EE33112378FCD25BC78A9ACF2542B60D014730440220012B69B593A25E6148B5AA4E7DD879B6A2558D5AC5858AF514EA0ED90FF98F0B0220489DCAD412C102E006E364BC01BC39E12DE946443C46EABAD8BF323E1E926EA7014C69522103248C3F36C4E00B863640D71F53E2A5A63C7CA79E8A5F8CEE57E5DB3B991F8C5121027FCA837FC3FAF9989E3C0567C6019A4C9D9BD0ADBF4159797CD4377D3665CD392102790C3B3C6269A29801C30FA3F176CBC31AE054255CCDCCC30D6FE1A7D60D799553AEFFFFFFFF1BA911CA083F724104714D2D6E81102BBBEF4F3AF84759650D99E25078F488E800000000FDFD000047304402206B53F86C95A67962A4077A733991BF5F20041D7119004677E4122FFE8BAEF94002200533165F03C16019B3A0E7A777A9C3493110265CDE279290E831629183CB22C301483045022100A2726BC9E9F08ECA2A0C46B50984336611325A9C6CA45248C2EB0F8237CAA10302203CE3FB611E2482FAED2B6BC84FDBDF9A692544ECA5A7443550A636A6F6F87BCD014C69522103C6E210FE0D6E9F6B331A768D5D5138BF33F62D5C1D0D765E4997F0A3178DD66C2102D69BAE9F91F82E4AFE29A9A7F195B58A3F9DB0DB000776C500E2A87279C1B5902103A30328F9D2EED5B3AB4C2851591A58BD910546D30E37BB5E209A5FB281C479BA53AEFFFFFFFF448AA8D477047A0916A871BE9180E220CEB68A91E6BE7BE75E338F294B578B9827000000FDFD0000473044022013C73432CD525E44426C7F869E1B624F266E5A4C12BB1E7BC0ADFAB3F49D451A022005FAE2E86D9569BD1CBA5D28796EB9E1FEA58D5371348FAC021D367FB7C8CC0101483045022100B6F4095936B40D74F78D52D3FC9B65D60CB32647D2D5DF17D7C5F6FEEEF7C9420220312DBB6B2BCE7B8FFD4B933144325754746477CB0CDAC6E8A36750E4AFB4ED03014C695221024773C190E40EF75F2FAEC74D2531A7536901E38976DF6C8A1EF697F2A1F742932102687D86D484BAFCB877844272A5C3ACC16B89335A84128EDFFBEE1C68C12E93C52102F6F8847286487528734F54172CD340C4CBD80D8C548A49DC04D3B2E7C7B8615753AEFFFFFFFFED682C4E0662A1EC69FF3EFC709BCA80C065A0C90AF8DE2CA45500C39E9D173600000000FDFD00004730440220468DDDB8A66229F666CB2B83B503F79DC6D199ADCCF54FBA38DCE7A65F8116D102207FCC20DD4012EDFC4D470D5B4729893562F337EF31833649577C856CD0BBBCFA01483045022100C5F6866BCEB17BA6FA7E553B8632BB58C38CE26EA604404A672208A16C855A7802200893E9B5CD43C9255ACD44C5783198EB1D750173384CFAF4CD4B68BB8CB0E6A1014C695221022702A3CC53152DF55E47C8008D7F0D3A43E2232FD3C02AE8C29B1E77FD4567692103D24126E0C82E44DF800D29D057731C24AD973A5095CDB8F2262067E93FC7F4C62103FE4623504AC7BBEE4938CE8FF5AB4D768693BB5FF5D3D44EDB093113ECECD5D153AEFFFFFFFF980CFE0DA66AB1B4BCDA7EAA47DFC064703FC61AB28F7787BC19C67ADE62C4DD01000000FDFD0000483045022100991FC55D2AEE75654609E4177B53896D56A7133BB088AF9A2ECF42D4444B4373022065A45EF3CB1FB379EF47327BFEA143531194DF7882738C5257AAB1F096E50CB501473044022014168F1F3B9865F9193FD8E4ADE8C310AE948F2F3F5F1A855DBDF9E5F6A847E802200FCC61FEE20C42CB23A5A6CB5BD0CCD2040153F8EE11B1904F224760E7F4D057014C695221029DF92158BACA5E112D95A5081A6C2C2AF95D56A3CB0D0AE622AC5BF167BA15142103E537395FEAA57AC89381E1C7E6C42D4619F0EAD14F5021A5D371975A82CFADED2102F15D8716241CBAA30911535772BC70272A416C26ADC6E883A78EC1AAC2B6757753AEFFFFFFFF96D363FC0B2CB23F2D1256D1FF0BCE73241369B4931F3E5A8E7D3B92868CC94529000000FDFE0000483045022100E80E9E80846164BDAFFD1177BC19F7D89247CDF49230D1579484A885ED5F42F3022030659BDA2DBFFD3B5CF43643280D626418D48DA779FFC04DD2B58B081AAC0320014830450221008DEF60528ADA788DAEA13F4ADAC10063004C491F4DBEA5837F674D7CD3EC68CC02207CDF0C2C7E5EEDFA894D62FBB749F20023D195179E4793A5E81FEC48CA4928D6014C695221024773C190E40EF75F2FAEC74D2531A7536901E38976DF6C8A1EF697F2A1F742932102687D86D484BAFCB877844272A5C3ACC16B89335A84128EDFFBEE1C68C12E93C52102F6F8847286487528734F54172CD340C4CBD80D8C548A49DC04D3B2E7C7B8615753AEFFFFFFFFD63668C7A2F3EC893FFFB0FD5BA7F86FBF33BB74F8CB2275D76D28954F31AAD200000000FDFD0000483045022100FA8A1AA9C206F1A977D50349B165C01FE54185EC0ADA63942EEA4295FCFE8043022074BE63EDD6BD832D708AD652499997125C5A84E38415C5AA5DE66A6A9C6A96CC014730440220039951F51E568C8CB5CA1E4885858726886B542CF605BAA9487B27795A79210A02206311C3540E1D74AE603D47B178262FDDA9D10B824B2735FCF72FFF9D91DD6971014C6952210387F85D348EB1AC22780D80E0680BEB5E7C74F06F429725418B1891FB10354B432103B99CD33509DC02AAC58E08E64EFDBA94BA8E28326FEFE414F79E77F00949BAC721035285F9960DFE03CCD0CFECCC7031466E3ACC94A6D89CA909FF8AF91DB817137253AEFFFFFFFF02086D01000000000017A914A6D8A68D2199195FD3E17B9FA943A3E15C75A4D987254E9700000000001976A914C697FC3FCC8AB77ACCC3AD8E0506DF8935C85DB288AC00000000"; private static final String TX_NO_WORKEY = "01000000010000000000000000000000000000000000000000000000000000000000000000FFFFFFFF2A03089B051D4D696E656420627920416E74506F6F6C20626A35200B5B512055B7A9A60B180000274C0000FFFFFFFF0100F90295000000001976A9149524440A5B54CCA9C46EF277C34739E9B521856D88AC00000000"; @Test public void testVersionBytes() throws DecoderException { final Transaction parsedTransaction = TransactionParseUtil.parseTransactionBytes(Hex.decode(TX_NORMAL_HEX)); Assert.assertEquals(1, parsedTransaction.getVersion()); } @Test public void testInputSize() throws DecoderException { final Transaction parsedTransaction = TransactionParseUtil.parseTransactionBytes(Hex.decode(TX_NORMAL_HEX)); Assert.assertEquals(1, parsedTransaction.getInputSize().getValue()); Assert.assertEquals(1, parsedTransaction.getInputs().size()); } @Test public void testScriptSize() throws DecoderException { final Transaction parsedTransaction = TransactionParseUtil.parseTransactionBytes(Hex.decode(TX_NORMAL_HEX)); Assert.assertEquals(108, parsedTransaction.getInputs().get(0).getScriptSize().getValue()); } @Test public void testParseEncodeConsistency() throws DecoderException { final byte[] rawTxNormal = Hex.decode(TX_NORMAL_HEX); final byte[] computeSHA256Normal = ComputeUtil.computeSHA256(rawTxNormal); Assert.assertArrayEquals(computeSHA256Normal, getMorphedTxId(rawTxNormal)); final byte[] rawTxPushData = Hex.decode(TX_PUSHDATA1_HEX); final byte[] computeSHA256PushData = ComputeUtil.computeSHA256(rawTxPushData); Assert.assertArrayEquals(computeSHA256PushData, getMorphedTxId(rawTxPushData)); final byte[] rawTxNoWorkey = Hex.decode(TX_NO_WORKEY); final byte[] computeSHA256NoWorkey = ComputeUtil.computeSHA256(rawTxNoWorkey); Assert.assertArrayEquals(computeSHA256NoWorkey, getMorphedTxId(rawTxNoWorkey)); } /** * Parses the given hex, encodes it, and returns the hash * @param hex */ private byte[] getMorphedTxId(final byte[] hex) { final Transaction parsedTransaction = TransactionParseUtil.parseTransactionBytes(hex); final RawTransactionContainer container = TransactionEncodeUtil.encodeTransaction(parsedTransaction); final SHA256 sha = new SHA256(); for(final Entry<TransactionPartType, byte[]> entry : container) { sha.feed(entry.getValue()); } return sha.finish(); } }