Transaction

94660348c0241013da85ae83f18b22892e766777e8eda9daa7ed19400af07d88
( - )
156,634
2021-05-01 07:48:59
1
29,659 B

7 Outputs

Total Output:
  • j"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAutM5&‰PNG  IHDR€€ ÍÉ#bKGDÿÿÿ ½§“ IDATxÚíÝw|ݽÿñONvÒ4£{Ð] e”½,­²· ¹àÅ}ñ^DñŠpT@((«b™*È(ÒRFK¡´¥ƒÒA:ә¤ivròû>~÷¡­mš¶9ç<ŸG(–QÞ4=¯|¿çûýf•žycG1&€@ €@ €@  €@ €@ €@  €@ €@ €@ @ €@ €@ €@ @ €@ €@ €@ €@ €@ €@ €@ €@ €@ €@ €@ €@ €@ €@ €@€@ €@ €@ €@€@ €@ €@ €€@ €@ €@ €€@ €@ €@  @šÈ1éªæÉk@JjoOF²£#’ÉŽHvtD{2mmÉhikÖöd´¶µGsk{46·FCsk46·Fcs[Ô56G]CKÔ56ǖúæØRß›ëšbs]ClÞÒ›¶4ÄÆ-Ñ֞42@º“ììDdïÆ~u]C¬«®õÕõ±vs]¬Ú¸%VoØ«6n‰•ëk㽪šhlió? 颼¤(ÊKŠbÿ!}¶ù׬«ÞË×VDzµÕ±xåÆX´rc¼³rcT®«‰d‡ Avú•÷ˆ~å=☱ûüŸïohj‰…+6ÄÛË×ÇÜeëbö’µ1oùºhmsZ i©¨ /ßwP¾ï |_sK[¼ýÞº˜µxM¼:e¼üöŠØPÛ`,èƲJϼÑÁ|Ғ‹@`ïY²zSL›[/Ì^Sç¼u-FnÄ@ºÜ¨A½bÔ ^qù©‡E[[{Ì|gu<5cq<5ãÝX¶¶Ú@°—9HÚrº§E+6Ä#ÓÄ#/-ƒ AB¦™ýÿù¹1yêü¨mh6@€)›[ãÉWÅ]O¾o-­2ìfÀ^W˜Ÿ}ð xñ¶Ëã©ÿ½4Î8fßÈ2 ì6. [9î€!qÜC⽪ê¸ëÉ×ã÷ϾåÉ$ÐÅ [Ö¿<n¾â¤˜óë«âsgy9^²@ú–÷ˆ|ö¤˜ý««âS'Ù '‡Aõî?ùÂiñÆ/>çc€dŠaýËã·×œOÜpqŒXa€dŠ ã†Ç+·&¾óñ£ /Û Èy¹9ñµ Ž‹™?¿2&6 ÈCú–Å#ßýXÜrÅI‘Ÿëh @2ÆgSo»<Þ× ÈûéS~ô©øÒ¹GG„§‚ #äåæÄ÷.›÷^sž D@IÎ?&ž½ù“1¨w‰1@)Ù?þöãËâèý ™¢oyxòû—ÄYÇîg €dŠü¼œø힝x 1€& SäädÇ]_9#.?åPc  c^ø‰¸õªSãêsŽ62É —Ot$™æ‡Wžg³¯!€)²³ñ믟ǎl  dŠÂüÜxè[Ä~ûô22EYIa<ø­ó£¤0Ï@È#öŠ»¾r¦!€IÎ8v?·‡A@¦ùÎ'NŒcƸ(#7';îþÆÙÑ£ ×@ȃû”Æ —O42É'O:$Ž?hˆ!€1/‰Dü싧EA^¶1€)†¨ˆo]2Á@È$Wœ~D íWjÒJVé™7v˜"":"‘•ˆìì¬ÈI$¢¨ 7 ór¢¤(?ÊK £¢¤0ô*‰A½{ƨ±ïà^1jPE$¾Ž‚t÷øô…ñ©[3i#Çð¯‡"ÙÑɶŽhd4¶´ýýûë¶ùwô,ʋ£Çì§=:Î?&ÊzšÒÐ9ãÇďψY‹×ƒôxÅsºFa^N|þ¬#ãë~ Š <OÒ͌…+ãäoÞg҂sWÐE[ÚâÖɯƑŸÿE¼4÷=ƒ@š9zÌ>ñ¡C‡ü³5›¶ÆÙß~(~ý—Yƀ4ó•óŽ5øגñŸ¿|6îî-c@9aÜ°7¢Ÿ!€À¶}鎧ãõE« éôy}Þ1F å¹v³ƒ‡÷¿Ýzydgûzkg•uS7ù™tDVdEVVDVVVd'²";‘ˆìDVäæfG^Nväf'"7'; ós#?7; òr¢¨ /Šós£¨ 7JŠò£¤0/J‹ ¢¬Çû%…Qѳ(z—EïžE~¤ˆ¶¶ö8䊟ǪuÆ e¹ ìfs—¯'^Yç?Ö©ûµrtDDÇßÿО숈äû?ÔÔÚ%ÿ†DVDß²âЫ$÷îƒû”Æðå1|@Yì;¨WìÓ·Ô='»Ë gNv\òáqqó¤éÆ@Û6yê|Èv%;"ªªë£ªº>f/©ú§ÏÏ͎±CûÄÁ#úÇáûŒ#÷c†ö1Ü^rщ @ °}/Í«Œöö¤S|tZsk{Ì^R³—TÅïž}ÿ⢊’ÂøСÃã”#GÇ©GvÿÉ=hÄÀŠ8jÿA1sÑjc ­®±%Þ[W#ö2]fs]cLž¶ &O[Eù9qƱûÅ¥ÇÅ ã†g¸øC @R–ð‡,¬Ühv›†æ¶xøÅùqÖ·Œã®þuÜ÷ì[ÑÒÚf˜Ýèœì‰,; íX±¾Æì *7ÄÕw<G~þ—ñð‹oG2™4ÊnP^RGì7È@`{Xkö¨ÊõµqÅ­OÆÄoÜó–¯3Èn0ñ°F@Û¶±¶Áì³—Tʼn_ým|ÿþ£­­Ý ]€‡ @ °›¶@öžödGüèáWâìo?몷¤‹:j@”çükµõÍF`¯{yþʘð•ßÄü÷Ö£ dg'⸆üku î¡ªº>Nû¯ûâµ+Ñ5À@à_ÛÚØbºÚ†æøèw'Å[KÖcÙÏ@à_knõæ{º—ú¦Ö8ïúI±dõ&cìRö7ØVº)/ÝÏæºÆø'ÇÖFoQè¬þ%Ñ·¬Ø@àŸµ¸ýÝÔâU›âËw<eˆ]°ÿ>½€þY2Ùaº­G^Z¾´À4¸OO# ÖÑ!éÞ®ùÕ³±Ùý*;ePoˆþéî6Ö6čL3D'8ˆ eÝûÌìX¾v³! €Lў숛'M7ÄNêã*` ©lò´±Þó‚wJQ~®€¤®¶ödÜóÌlCì„Bˆ ÕMzažv&órŒ€ µ-¯ª‰9ž¼ãè €tðä«ïaååd@ê›>¯Ò;È£€¤…7Þ] M-†ØÍ­mF@úÚړ1wÙ:C쀖VG€¤‰E+6aÔ;RŠ ],¨\o„°±¶Á@ÒÃÊ µFؑÜ"€¤‰ªÍ ·#69ˆ ]¬¯©7ÂX¹a‹€¤‡úF7ìˆek«€ =4¹¿ÝY.€¤‹æ÷·ÛK×n6€ô›ãeâßY½qKT×5@z(ÌË5¿1gi•€¤¢(€d”þ=Œðo¼þÎj# H*JŒ°-­mñڂ•†@>†ô+5Âv¼ùîÚhhv« iä áýŒ°ÓæV@z9pX_#lÇÓ3@ú(Êω1CûbVoܳ—¬5€ô1þ ¡‘—›cˆmxjÆâˆÈ2€ôñÁC†a;›¾Ð@ÒGVDœ}Üþ†Ø†åk7Ç+óW@úАØ»§!¶áÁ)óÂé_ iåã9ÄÛÐޞŒ‡^˜k éc@E8wüClÃÓ3ߍUë  }|þ¬##7'ÛÛpç3Œ€ } ¨èŸ9ípClÃìw×Ä« V@ú¸îÒ QTgˆm¸mò«F@>ŽÞP\ü¡ƒ ± s—Uœ¯.2€ô—“ˆ;¾tz$^¶å¾ný‚ mÜpùÄ=¸·!¶áÅ«ã©™ï@z8ÿ„±qåGb’Éd|óWÏ@z8ddÿøéO3Äv<<u~ÌZ¼Æ@Rß¾ƒ{Å#ß½(Š]õ»Mu Íqý½/@ê5°"ÿÞÅÑ«´ØÛñÝßý-ÖU×@j;lô€xææÇÀÞ=±ÓçUÆož~ä¥dŽs>°Üùå3œöý7šZâêÛÿnû‚ u³ÏN蟞èjßtíožåU5†@šÆè·éô8xDcì€Ç§/Œ{ŸyË@ROqAn|ócã㪳ŽŠœœlƒì€Êªê¿Ÿú@ ÉNdÅe§ßüØñѧÌU¾;ª¾©%.¹é‘¨kl1€ÔP——LWŸ{t ë_nL&㪟ü9Þ~o½1€tCû–Æ¥—rhôv_¿N¹å/ǯ,2€î«¼¤ N9rtüLJŠ8$ ·uí¬¦Ì‰<4-Üò@·’ÈŠ8pXß8þàaqêQ£ã˜1ƒ]ØÑžž¹8®þÙSâÀÞÖCú–ÆØ¡}ã áý☱ƒãÈýEÏâÓt¡W¬ŒOÝüX$;:Œ`÷KdEô.-Ž¡ýJcXÿòÖ¯,†õ/‹‘+bìÐ>boÄßùߝÍ­íÆ@ðϲ""+++²³³";‘‰¬¬ÈN$"7'; ò²£ /7 ór¢ ?' ór£Ga^”Diq~”DY÷?ú–G¿²Ñ·¼8ú”Gv¶÷íí ¯Ì_çwR44·ÐÝÔ<y­èRSç,‹¿ÿGñ‡4™à‘ióãÊÛþmíIc M@ºûù3ãÚß<®ö@škmkÿ¾û¹¸û©7Å@Ò݆šúøä͏Æ+óW éîÍÅkâã?x$Vo¬3@ÒY{{2n|FÜpߋўtƒg€¤µUjãs·ý)¦¿½Â Hw÷=ûV\÷Û)QÛÐl €¤³%«7ŗïx*^v¡@Ò[CSKüì±që_Ž–67v@ÚJ&“ñÇ©óã~ÿ·X³i«A@Î¦Ï«Œoß3%f/©2@ÒÙk VÆÿ>8-¦Î­4@Òٌ…+ãæIÓã…Ùˍ€tÕޞŒ§g¾·?öZÌX´Ú HWu Íñ‡ߎ;ŸË«j €t5wYUÜû×Ùñ‡ߎú¦Vƒ€ ÕÖ7Å//Šß=;;ÞX¼Ö HG-­mñü›Ëâáߎ§f,vóf€¤{üýòϳbòÔù1wÙºè0 ìuY¥gÞèsöš'¯5mSm}L›W›½<žs©§yÀ^â {L¯Òâ8wüØ8wü؈ˆx{ùºxvÖÒxv֒˜¹hU$’€=Â@؃„m«®kˆgf-'_^Sf/‹æÖv£€™bkcsLysY<ñò¢xzæ»ÑØÒfèBNÐíô(̏³?0&ÎþÀ˜ØÚØOÏ|7þ8u~LysY´;O €ôÁ &L806ÕÖÇ^œ¿ö­X´r£q “œ†=È)`è:¯/Z¿nN<üâÛÞ/ d’Í[âwϾw?õF¬ÞXgØ Ê*zÅWÏ?.æüꪸûëgÇþûô6 @2ANNvœ?á€xåöÏÄýÿýÑ8xx_£€ #^؉8ãØýâÅÛ.»¿~v í[j€dJž?ဘùó+ãÆË'F‚\£€ äçåÄÎ9:^¿ësñÑãÇ ™b@¯’øÍžOÜpqŒXn dŠ ã†ÇK?ùt|öôÃ#Ð€Š òâ‡Wž“¯ÿXô-+62Ň¯Þþ™8鈑Æ@@¦èUZ“®» ¾vþ±Æ@@Ƽ&ñO|0î½æÜ(ÌË12Å9ãÇij?üdô+÷¾@ dŒƒ†÷‹gnþD íç "@ÈÃú—Ç37"ÚÇ@Èý+Jâ/ÿ{i6z€1€)ÊzÆäë/Šý÷ém ҊK€îûâ{ÖMÝû+è¬÷¯ÍNdýýãý?ÏÍɎ¢üÜ(ÌύÂüœ(Ìύ‚¼œ(-Ώò…QÖ£ ÊK £üïߨ(‰þ=¢oYqäädûßÍTô,ŠÇo¸8Ný¯ûbyUA€™,Ù‘lOF[{×eŸ²âØ«$F¬øÇǨ1zp¯()Ê7ú^Ò¿¢$¿á?âäk~UÕõAÐuA¹®º>ÖU×Çì%UÿçDz"bÄÀò8ddÿ7²:z`¹ßÀ(ÈË5Ü2´_YLúö…qò7Í­íA°{uDÄÒ5Õ±tMu<òÒˆˆÈËIÄ1cö‰Æ ‹6"åb…ÝíQâÎ/ŸùñÆ@°çµ´%cڼʘ6¯2¾ÿÔÚ·4Î?&Î?&ƉÁÝæü ĂÊõqëäWAÊr0@š¨\_?}ôµ˜ðµ{âƒ_ûm<0eN46·f7¸îÒ 1ñ°†@Ð}Ì^R_øé_bÌe·Ç~9j뛌ҕ/ž‰DÜõå3¢wi‘1€t/5[›âû÷Oƒ?}gÜ2iz44µ¥‹ô-ï?ÿò†@Ð=Õ64ÇMN‹£®úe<>}¡AºÈIGŒŠ+N?Ü@º¯UëâS·<ç]ÿP¬Ù¸Å ]à>õ¡Þ¿Ì@º·f/c¿øë˜<u¾1vQa~nÜvÕ©†@ÐýÕ64Çg~üDü÷¯Ÿ‹¶676Þ'2<.<ñC H wýéõ8ïúIQ³µÑ»àÆË?eÅׇ EL›Wg}ëØTë9·Õ§¬8®½d‚!€¤Ž¹Ë×Çi×Þë«·£“>uò!1´_©!€¤ŽwVnŠ‹nx8êÝ/°SòrsâºKDbf/©ŠËny,ÚۓÆ脏?6Ö×@R˳³–Əþø²!:óšHÄ·.=Á@RÏͽÓçU¢N>bTŒTa ©%Ùñ¹Ûžô~Àμ¸&qõ¹Ç@êYµ±.n™4ݝpá‰DïÒ"C H=w<>#¯ÜhˆT—Ÿ=ýpC H=íɎ¸yÒK†è„K&Yf@Š}ia,¨\oˆ4¸OiœpðPC H=qÇc3 Ñ O<Ø@RÓ£ÓDM]£!vҙÇ@zšZÚcҋob'äÅ©G6€ÔôèK ŒÐ §)€¤¨×­ŽªÍu†ØI‰,×#HAñôÌw ±“ÊKŠâ˜±ƒ  5½üö #tÂÉGŒ2€Ôôڂ•Fè„cØÇ@RÓªu±fãCì¤q#úGnŽ—] )j‘gï´ü¼œ8ddC HÑ\!;ã¨ý]‚ E½»JvÆáû4€ÔTU½Õ°ïà^F@šÖUסF¬·ƒF’Ö;Ø)…ù¹1¤o©!€¤žúæV#tÒh§€¤¢æ–6#tÒðåF@‚ØÚn„Nê[Vl ©§£Ã@F)ÊÏ1Bg°\"HAù¹Fèl:ˆ æ9ØYe= Œ€ õôêYd„NÊÏÏ@RÐÀ^%Fè¤GO€¤¢A}z¡“DšØ[v>³€ õŒÚǝ”••e ©çàýŒÐIž£Œ Õô-+Žþ.étzŽ2€Tsø¾Œ° šDj&6Ò» ¡Ù@ ©€‡7Â.ð@ )exÿ²> Â» ¦¾É@RÇGOk„]´zÃ# HqÉăͰ‹Vm€@RÄq qú· ¬\_k ©áòS3BXå0€T0¼Yœóý ÑVnp@ øúÇENN¶!vQSKk¬p @w7´_i\x⁆èóß[íÉC èÞnþìI‘—›cˆ.ð֒*# èÞN>bdœrÔhCtU.€@€é²½©(?'n¾â$Cte.Yk Àöäd»è`oúá•'Ç°þå†è"Í-m± rƒ!€Û“›í·¨½å¼ñc⒏3Dš±p• @€ÿ6süµ7ŒP·^uŠ!ºØso,52M– vš+O÷¼²âüxø;FYBc@ °ËŸl ¸³ r½pOÊÉNÄ}מ£õ2F[µ¡6­Üh @þü<G÷دϬˆ_~õÌ8þ ¡ÆØ ¦¼¹Ì@ÈD.hØyEù¹Fز"⮯œ=ácì&ϼ¾Ä@ÈDŽfí¼B¸û_²"îøòéqÑ2Æn²yKC<ëýt3^‘`O`Ž÷³í¬…yF؝—÷\s®'}ìf“§-ˆ¶ö¤!€‰ŠÅÌNëY”o„ݤOiQ<ü ãÐэ±›=8e®€ fØQe= Œ°Œ?pHÜý³£E‰1v³•ë=ÿQQâ^t])‘ñŸk.Ù.JÚ#š2Ï@Èd½K‹Œ°“ú–÷0B7¢_üô‹§Å!£cihj‰œþEBfëÕSî¬Á½{a•çÇ5Wœ~Dä¸iºïù9±¹®Ñ@Èdûô-5ÂNÚw°'RtVqAn\uÖQñÅsŽÒbï¥ÜÓÚÚÚãŽÇf™nh¿2#ì¤Qƒ*¢yqTU×c éÛ3>}êáññŒ‹ G÷šG§/Œ•¶™n¿}za'%‰øìGÄ ÷M5Æv”æÅ)GŽóO>l¤ <ºŸ<òª€é órbä€rCtÂçÎ<2înN,¯ª1Æ?tÄØ¡}ãøƒ†Æ‡y¹~;ï.žž¹8Tn02ÝqñüN*.ȋ¿uAœuݱ¡¶!#7èY”‡Ž‡í;0=0Ž;8z—ûÅÑ µ¶µÇwîyÁ@ â¼ñcŒ° Æ í»õ²¸î·S≗EGþ7f'²bpïž1´_Y ë_ûîûéûéƒû¸€(UÜûÌìxwõfCÐíe•žyc‡`÷Ú¯4fÜyEäå£ l¨© WÅ¢•cźšX»yklÚÒµõMÑÐԍͭÑÜÚ-mí‘LvDGtDDÖnüuD"+ÙÙY‘ÈŠœD"òór¢0/' ós£0/'Š ó¢´¸ ÊzDiqA”—Fß²âèW^ý+zDß²1 ¢‡£Ä)®fkczå]Q]×d º=Ga7ûÁg?"þºPŸ²â8ãØýâŒc÷3Ýʏ~Yü‘2\*»Ñ×Î?6N=j_C@š[¶fsüâO³ „L÷™Ó‹ë.`HsÉd2¾|çSÑ֞4)Ã)`èbyÙqË'Ç'N:ĐîùëìxiÞ C !eEÄùˆë?q¢«6!CT®«‰oß3Å@ȨO ìD2²œtĨ¸ðÄbX7{†LrõÏþ Ím†@B*ˊˆD"+r²ÿ¸GÂ¼(ëñþ­;T”Ä€^%1b@yŒTc†öq…/d¨{þúfL›Wi t'5O^k`·XP¹>®½ûyC²\ ;¡¶¾).½é‘hlqêá ?ýs,[[m d‚Ÿ>òjüùµÅ†@@&xiî{ñ?¿ÿ›!€ ­ØÿÁ£‘ì°ÒÞª µqÞõEÍÖ&c…—ÑÏÞIDAT  ÝmÞÒç]?)ÖlÚj  ¤»ú¦–¸à{ˆÅ«6鮩¥5>ñƒGãÅkAZò$øÿlmlŽKoz$^œóž1€îjêã‚ïý!^g1€îÖWoó®Ÿo¿·Þ@Hw«6ÔÆÙß~0–®ñˆ7 ¤½7¯ŽKnœUÕõÆ@@º{`ʜøêOGK[Ò@HgmmíqÝ=Sâše  ¤»MµõqÙ-Ç´y•Æ@@º{iî{ñ¹Ÿü)Vo¬3ÒYSKkÜpßÔ¸ó‰‘e  Hgs—UÅ?~2­Ü(þ@ÎÚÚÚãŽ'fÆ÷ïŸmí®ò@Z{uÁÊøÆ]ù•Œ€t¶®zk|çžâ/Î §{AÆZÛÚã×™7=0-¶6µŠ?€¤³?¿úNÜpÿ‹ñÎÊMÆ@:ûëÌw㦦ÆÜå덀töÂìeñýû§Æ›ï®5@ÒU{{2ž™µ$~úÈ«1cÑjƒ€ ]m©oŠ¦Ì_ýyV,¯ª1@ÒÕ²5›ã—ž<?çïWõ€´ÓÜÒÏÌZ÷=7'žcit˜ é'™LÆë﬎ÉÓħΏš­MF@ºioOÆÌwVǓ//ŠÇ_^k7o5 @ÒMu]C¼0{y<3kI<;k©#} H7õM-ñڂ•1mneL›û^¼µ¤Ê{ú@NVm¨×ßY3®Š WŜ¥ë"Ù!ù@*×ÕļåëbΒªxkiU¼µdml¨m0 @RY[[{¬Ú¸%–®Ù‹WmŠ…•bAå†X¸bCÔ»/@RSÍÖÆX¹aKT®«‰ëjcÅúšx¯ª&–­­Žek«£­=i$€twÍ-m±¹®16ÔÖÇÆچØPóþ·ëª·ÆÚÍ[cí¦ºX³©.Önª‹Æ–6ƒ «%“ÉH&;¢#"’ÉŽHvtD{2mmÉhmOFk[ûûíÉhikæ–¶hli‹¦–¶hlnýÇ·[›ZckcKlmhŽºÆ–ØÚØ[š¢fëÿýuÀŽÈ*=óF—id„  €@ €@ €@@ €@ €@ €@@ €@ €@ €€@ €@ €@ €€@ €@ €@  €@ €@ €@  €@ €@ €@  €@ €@ €@ @ €@ €@ €@ @ €@ €@ €@ €@ €@ €@ €@ €@ €@ €@ €@€@&þ}a^]ÆtIEND®B`‚ image/pngbinary bplogo.png
    https://whatsonchain.com/tx/94660348c0241013da85ae83f18b22892e766777e8eda9daa7ed19400af07d88
  • j"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAutMƒ /** Copyright 2021. Matter Web Services Inc., Attila Aros. All Rights Reserved. This software code is protected under the laws of the United States and other International Treaty Provisions. This Agreement shall not be construed as transferring any rights other than those expressly permitted herein. Licensor reserves all copyrights. This software code is the exclusive property of the Licensor. */ contract SuperAssetNFT0 { public function transfer(SigHashPreimage txPreimage, Sig senderSig, PubKey unlockKey, Ripemd160 receiverAddress, bool isMelt) { // Allow anyone to fund this operation, commit to all the outputs. // Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_ALL | Signature.SIGHASH_FORKID; // Use the optimized version by setting the MSB require(Tx.checkPreimageOpt_(txPreimage)); // require(Util.checkPreimageSigHashType(txPreimage, SigHash.ANYONECANPAY | SigHash.ALL | SigHash.FORKID)); // Optimization: Get locking script directly instead of using Util.scriptCode bytes preimageSection = txPreimage[ 104 : ]; int scriptLen = unpack(preimageSection[ 1 : 3 ] + b'00'); int dataStartLoc = scriptLen - 57; bytes lockingScript = preimageSection[ 3 : 3 + scriptLen]; bytes dataState = lockingScript[ dataStartLoc : ]; // Validate and authorize the transaction, obtain the hash160 bytes from the locking script and compare against the hash160 of the unlockKey require(hash160(unlockKey) == dataState[ 37 : 57 ]); require(checkSig(senderSig, unlockKey)); int preimageLen = len(txPreimage); bytes buildingOutput = txPreimage[preimageLen - 52 : preimageLen - 44]; // Get input value directly; Conservation of Satoshi quantity. // Whether this asset is being melted back into P2PKH bitcoin or instead it is a transfer update. if (!isMelt) { bytes assetId = dataState[ : 36 ]; // This is a transfer update, enforce the assetId to be set for lifetime. // An NFT is only valid if it can be traced back to a coinbase minting event (36 zeroes at the beginning) if (assetId == num2bin(0, 36)) { // Then the assetId must be equal to the outpoint that this input is spending. assetId = txPreimage[ 68 : 104 ]; } // Hardcode the 'fd' instead of using Util.writeVarint buildingOutput += b'fd' + num2bin(scriptLen, 2) + lockingScript[ : dataStartLoc ] + assetId + b'14' + receiverAddress; } else { // The first output, in the case of a melt, is just a p2pkh to recover the satoshis // Manually hardcode p2pkh to save space buildingOutput += b'1976a914' + receiverAddress + b'88ac'; } require(hash256(buildingOutput) == (txPreimage[preimageLen - 40 : preimageLen - 8])); } } application/octet-streambinarySuperAssetNFT0.scrypt
    https://whatsonchain.com/tx/94660348c0241013da85ae83f18b22892e766777e8eda9daa7ed19400af07d88
  • j"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAutMT/** Copyright 2021. Matter Web Services Inc., Attila Aros. All Rights Reserved. This software code is protected under the laws of the United States and other International Treaty Provisions. This Agreement shall not be construed as transferring any rights other than those expressly permitted herein. Licensor reserves all copyrights. This software code is the exclusive property of the Licensor. */ // ---------------------------------------------------------------------------------------------- // SuperAssetNFT (SA10 for short) (Alpha) // // Non-Fungible-Token (NFT) Smart Contract for Bitcoin. // ---------------------------------------------------------------------------------------------- // // Key Features of SuperAssetNFT: // - Mint, transfer, update, and transform(melt) tokens that retain their identity and satoshi balance until transformed(or melted). // - Supports seperate funding inputs and change outputs with ANYONECANPAY // - Store arbitrary data payloads (HTML, JSON, Protobuf, PDFs, images, XML, etc) // - Infuse satoshis to be locked into the digital asset for entire life cycle // - Replay protection with globally unique ID passed on as an 'identity baton' // - Can destroy the token via "transform(melt)" and retrieve the satoshis // - Identical trust guarantees as a regular UTXO // - Developers can easily verify authenticity and asset history by requesting it in it's entirety from the seller // - Wallets and indexers can proactively index these UTXO's via a blind pattern match for the minting pattern // - Simplfied Payment Verification (SPV) and 0-conf works as expected with all the properties afforded to the native satoshi // - Use of SIGHASH_SINGLE allows token to be composable with other smart contracts // - Polymorphism is made possible because the data state (assetID and ownerAddress) appears at the beginning of the contract layout // // Contract Code and State Layout: // ============================================================================ // // assetID(36B) OP_DROP ownerAddress(20B) OP_DROP | SuperAssetNFT STATIC CODE // // ============================================================================ // // Example transactions: // - Deploy: https://whatsonchain.com/tx/ae48146532577638bf196cf13c79af8fa4302db5c4dce49ed96fc20f41e436a1 // - Transfer (Update with payload): https://whatsonchain.com/tx/9c1064106e5049692507674a7340a29cfb9f86f4de454649ce609086d9e82105 // - Transfer (Update with empty payload): https://whatsonchain.com/tx/c0fe7f10346572766d8dbfb2067bb3fb44239817b0015dfd3521b644ffad3ec3 // - Transform(melt to p2pkh): https://whatsonchain.com/tx/a0184c03552dbe43eb80be098b139f6992b983073aa1c9989c37ce451f312e6f contract SuperAssetNFT { /** * * There is a single method 'transfer' that can be used to transition to token into any state. This is done for optimization reasons. * * To preserve the Satoshi quantity and token identity, set isTransform=false. To transform or melt the token set isTransform=true. * By being able to transform the token we have a new type of polymorphism and the token can change contract code and back to itself! * * @param txPreimage - Preimage used for reflection of the currrent transaction * @param senderSig - The signature of the previous owner to authorize this update * @param unlockKey - The public key that belonged to the previous owner that is beng used to unlock * @param isTransform - Whether to conserve the Satoshi quantity and identity or to transform into another token or melt out the Satoshis * @param receiverAddressOrTransformOutput - The bytes of the Ripemd160 address in the case of a transfer or the arbitary output script to transform to */ public function transfer(SigHashPreimage txPreimage, Sig senderSig, PubKey unlockKey, bool isTransform, bytes receiverAddressOrTransformOutput) { // Allow anyone to fund this operation, commit to SIGHASH_SINGLE // Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_SINGLE | Signature.SIGHASH_FORKID; require(Tx.checkPreimageOpt_(txPreimage)); // Optimization: Get locking script directly bytes preimageSection = txPreimage[ 104 : ]; // Optimization: Get the scriptLen directly int scriptLen = unpack(preimageSection[ 1 : 3 ] + b'00'); // Optimization: Get the lockingScript directly bytes lockingScript = preimageSection[ 3 : 3 + scriptLen]; // Data appears at the beginning of the contract to allow polymorphism and predictable indexing bytes dataState = lockingScript[ 0 : 60 ]; // Validate and authorize the transaction, obtain the hash160 bytes from the locking script and compare against the hash160 of the unlockKey require(hash160(unlockKey) == dataState[ 39 : 59 ]); require(checkSig(senderSig, unlockKey)); int preimageLen = len(txPreimage); // The only output visible to this script is to have the same Satoshis as the input, the buildingOutput contains the resulting output script // Optimization: Get input value directly; Conserve Satoshi quantity from input to the output. bytes buildingOutput = txPreimage[preimageLen - 52 : preimageLen - 44]; // If this is intended to be transformed into another script or melted, then there is no need to check the assetId // The owner is free to transform into any script, the responsibility for correctness is up to them // Polymorphism has arrived! if (isTransform) { buildingOutput += receiverAddressOrTransformOutput; } else { // The assetId is maintained immutably as the first push data bytes assetId = dataState[ 1 : 37 ]; // This is a transfer update, enforce the assetId to be set for lifetime. // An NFT is only valid if it can be traced back to a coinbase minting event (36 zeroes at the beginning) if (assetId == num2bin(0, 36)) { // Then the assetId must be equal to the outpoint that this input is spending. assetId = txPreimage[ 68 : 104 ]; } // Optimization: Hardcode the 'fd' instead of using Util.writeVarint // buildingOutput += b'fd' + num2bin(scriptLen, 2) + b'24' + assetId + b'7514' + Ripemd160(receiverAddressOrTransformOutput) + lockingScript[ 59 : ]; // More Optimization(Optional): Further optimize by changing num2bin to the raw LE hex (requires pre-compile and then manually adding it in here) buildingOutput += b'fd560124' + assetId + b'7514' + Ripemd160(receiverAddressOrTransformOutput) + lockingScript[ 59 : ]; } require(hash256(buildingOutput) == (txPreimage[preimageLen - 40 : preimageLen - 8])); } } application/octet-streambinarySuperAssetNFT.scrypt
    https://whatsonchain.com/tx/94660348c0241013da85ae83f18b22892e766777e8eda9daa7ed19400af07d88
  • j"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAutM /** Copyright 2021. Matter Web Services Inc., Attila Aros. All Rights Reserved. This software code is protected under the laws of the United States and other International Treaty Provisions. This Agreement shall not be construed as transferring any rights other than those expressly permitted herein. Licensor reserves all copyrights. This software code is the exclusive property of the Licensor. */ contract SuperAssetNFT4 { public function transfer(SigHashPreimage txPreimage, Sig senderSig, PubKey unlockKey, bytes receiverAddress, bool isMelt, bytes changeOutput) { // Allow anyone to fund this operation, commit to all the outputs. // Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_ALL | Signature.SIGHASH_FORKID; // Use the optimized version by setting the MSB require(Tx.checkPreimageOpt_(txPreimage)); // require(Util.checkPreimageSigHashType(txPreimage, SigHash.ANYONECANPAY | SigHash.ALL | SigHash.FORKID)); // Optimization: Get locking script directly instead of using Util.scriptCode bytes preimageSection = txPreimage[ 104 : ]; int scriptLen = unpack(preimageSection[ 1 : 3 ] + b'00'); // int dataStartLoc = scriptLen - 57; bytes lockingScript = preimageSection[ 3 : 3 + scriptLen]; bytes dataState = lockingScript[ 0 : 60 ]; // Validate and authorize the transaction, obtain the hash160 bytes from the locking script and compare against the hash160 of the unlockKey require(hash160(unlockKey) == dataState[ 39 : 59 ]); require(checkSig(senderSig, unlockKey)); int preimageLen = len(txPreimage); bytes buildingOutput = txPreimage[preimageLen - 52 : preimageLen - 44]; // Get input value directly; Conservation of Satoshi quantity. // Whether this asset is being melted to arbitrary changeOutput or instead it is a transfer update. bytes assetId = dataState[ 1 : 37 ]; if (!isMelt) { // This is a transfer update, enforce the assetId to be set for lifetime. // An NFT is only valid if it can be traced back to a coinbase minting event (36 zeroes at the beginning) if (assetId == num2bin(0, 36)) { // Then the assetId must be equal to the outpoint that this input is spending. assetId = txPreimage[ 68 : 104 ]; } // Hardcode the 'fd' instead of using Util.writeVarint buildingOutput += b'fd' + num2bin(scriptLen, 2) + b'24' + assetId + b'7514' + Ripemd160(receiverAddress) + lockingScript[ 59 : ]; } else { if (len(changeOutput) >= 40) { require(changeOutput[ : 40 ] != b'fd' + num2bin(scriptLen, 2) + b'24' + assetId); } // The first output, in the case of a melt, is just a p2pkh to recover the satoshis // Manually hardcode p2pkh to save space buildingOutput += changeOutput; } require(hash256(buildingOutput) == (txPreimage[preimageLen - 40 : preimageLen - 8])); } } application/octet-streambinarySuperAssetNFT4.scrypt
    https://whatsonchain.com/tx/94660348c0241013da85ae83f18b22892e766777e8eda9daa7ed19400af07d88
  • j"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAutM /** Copyright 2021. Matter Web Services Inc., Attila Aros. All Rights Reserved. This software code is protected under the laws of the United States and other International Treaty Provisions. This Agreement shall not be construed as transferring any rights other than those expressly permitted herein. Licensor reserves all copyrights. This software code is the exclusive property of the Licensor. */ contract SuperAssetNFT3 { public function transfer(SigHashPreimage txPreimage, Sig senderSig, PubKey unlockKey, Ripemd160 receiverAddress, bool isMelt, bytes changeOutput) { // Allow anyone to fund this operation, commit to all the outputs. // Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_ALL | Signature.SIGHASH_FORKID; // Use the optimized version by setting the MSB require(Tx.checkPreimageOpt_(txPreimage)); // require(Util.checkPreimageSigHashType(txPreimage, SigHash.ANYONECANPAY | SigHash.ALL | SigHash.FORKID)); // Optimization: Get locking script directly instead of using Util.scriptCode bytes preimageSection = txPreimage[ 104 : ]; int scriptLen = unpack(preimageSection[ 1 : 3 ] + b'00'); // int dataStartLoc = scriptLen - 57; bytes lockingScript = preimageSection[ 3 : 3 + scriptLen]; bytes dataState = lockingScript[ 0 : 60 ]; // Validate and authorize the transaction, obtain the hash160 bytes from the locking script and compare against the hash160 of the unlockKey require(hash160(unlockKey) == dataState[ 39 : 59 ]); require(checkSig(senderSig, unlockKey)); int preimageLen = len(txPreimage); bytes buildingOutput = txPreimage[preimageLen - 52 : preimageLen - 44]; // Get input value directly; Conservation of Satoshi quantity. // Whether this asset is being melted to arbitrary changeOutput or instead it is a transfer update. bytes assetId = dataState[ 1 : 37 ]; if (!isMelt) { // This is a transfer update, enforce the assetId to be set for lifetime. // An NFT is only valid if it can be traced back to a coinbase minting event (36 zeroes at the beginning) if (assetId == num2bin(0, 36)) { // Then the assetId must be equal to the outpoint that this input is spending. assetId = txPreimage[ 68 : 104 ]; } // Hardcode the 'fd' instead of using Util.writeVarint buildingOutput += b'fd' + num2bin(scriptLen, 2) + b'24' + assetId + b'7514' + receiverAddress + lockingScript[ 59 : ]; } else { if (len(changeOutput) >= 40) { require(changeOutput[ : 40 ] != b'fd' + num2bin(scriptLen, 2) + b'24' + assetId); } // The first output, in the case of a melt, is just a p2pkh to recover the satoshis // Manually hardcode p2pkh to save space buildingOutput += changeOutput; } require(hash256(buildingOutput) == (txPreimage[preimageLen - 40 : preimageLen - 8])); } } application/octet-streambinarySuperAssetNFT3.scrypt
    https://whatsonchain.com/tx/94660348c0241013da85ae83f18b22892e766777e8eda9daa7ed19400af07d88
  • j"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAutM‚ /** Copyright 2021. Matter Web Services Inc., Attila Aros. All Rights Reserved. This software code is protected under the laws of the United States and other International Treaty Provisions. This Agreement shall not be construed as transferring any rights other than those expressly permitted herein. Licensor reserves all copyrights. This software code is the exclusive property of the Licensor. */ contract SuperAssetNFT2 { public function transfer(SigHashPreimage txPreimage, Sig senderSig, PubKey unlockKey, Ripemd160 receiverAddress, bool isMelt) { // Allow anyone to fund this operation, commit to all the outputs. // Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_ALL | Signature.SIGHASH_FORKID; // Use the optimized version by setting the MSB require(Tx.checkPreimageOpt_(txPreimage)); // require(Util.checkPreimageSigHashType(txPreimage, SigHash.ANYONECANPAY | SigHash.ALL | SigHash.FORKID)); // Optimization: Get locking script directly instead of using Util.scriptCode bytes preimageSection = txPreimage[ 104 : ]; int scriptLen = unpack(preimageSection[ 1 : 3 ] + b'00'); // int dataStartLoc = scriptLen - 57; bytes lockingScript = preimageSection[ 3 : 3 + scriptLen]; bytes dataState = lockingScript[ 0 : 60 ]; // Validate and authorize the transaction, obtain the hash160 bytes from the locking script and compare against the hash160 of the unlockKey require(hash160(unlockKey) == dataState[ 39 : 59 ]); require(checkSig(senderSig, unlockKey)); int preimageLen = len(txPreimage); bytes buildingOutput = txPreimage[preimageLen - 52 : preimageLen - 44]; // Get input value directly; Conservation of Satoshi quantity. // Whether this asset is being melted back into P2PKH bitcoin or instead it is a transfer update. if (!isMelt) { bytes assetId = dataState[ 1 : 37 ]; // This is a transfer update, enforce the assetId to be set for lifetime. // An NFT is only valid if it can be traced back to a coinbase minting event (36 zeroes at the beginning) if (assetId == num2bin(0, 36)) { // Then the assetId must be equal to the outpoint that this input is spending. assetId = txPreimage[ 68 : 104 ]; } // Hardcode the 'fd' instead of using Util.writeVarint buildingOutput += b'fd' + num2bin(scriptLen, 2) + b'24' + assetId + b'7514' + receiverAddress + lockingScript[ 59 : ]; } else { // The first output, in the case of a melt, is just a p2pkh to recover the satoshis // Manually hardcode p2pkh to save space buildingOutput += b'1976a914' + receiverAddress + b'88ac'; } require(hash256(buildingOutput) == (txPreimage[preimageLen - 40 : preimageLen - 8])); } } application/octet-streambinarySuperAssetNFT2.scrypt
    https://whatsonchain.com/tx/94660348c0241013da85ae83f18b22892e766777e8eda9daa7ed19400af07d88
Total Output: