ETH Price: $2,915.71 (-4.00%)
Gas: 5 Gwei

Transaction Decoder

Block:
5742455 at Jun-06-2018 02:12:06 PM +UTC
Transaction Fee:
0.06015558 ETH $175.40
Gas Used:
3,007,779 Gas / 20 Gwei

Emitted Events:

Account State Difference:

  Address   Before After State Difference Code
(Spark Pool)
3,119.569695091032503907 Eth3,119.629850671032503907 Eth0.06015558
0x5d4ABC77...cbFd46CEc
0 Eth
Nonce: 0
0 Eth
Nonce: 1
From: 0 To: 287833164430583141352322260201002017607876857902413595007772432233108247549083777936478772629636199309374809963295667371443796482111517170334385457166019779113747411533846453899462107546388587723583715980715517564359369906927371387440686651161250724999973409728477158849357268938158495820189762399859550717841383185481166732524129276335313455774890582577824245747392121134731612437052014484338821055000684578716495277640091307328969006527848225635081777165781895198982677381418770827908547442505151829087369683142741606959482569896894136485304940858089775378237797536675335173199334828686801571110716000947180009504106837223932090561357165789669335486548467788197621449928714444237249590405314486764690462588431217121333581355054126565513777180825487469685669793498234093152413342731771770225510636752541964140690280562582033016733400171644085401942352735454659808935950473698561892115855703113667905724515425261654262137789494042584502170450771459210281021531940694356417413593445573522012152573821007489802204869833283233080664956967164810774528845101216836321185618924706349167142199511903189532802648230939827359053971249060475702768131154948150369197688899163308488354408383874358556171130083921132505770218797814158587385484342318961889815183698471837790846056181823714738808900165056870911181080261599864702718995437467251617821343066219541911466072754703953364841121495676296829236172981884107537662938718326922863692846603553343860816964120774388537352538747479605578143475546824009489847954519614467330228001296072772000735639468824661978721011644238375741424930749934609159044677084627787546861467534479194289925160411143379492073908987475361778464760461000552743457377169699040961962381121561828659165087780855715733096653994536882811570045252879652635088255780974872174872085044400454504921491147605733753293198356361520812076213889392015445726527962187033323763324225932920260786627435762054423005845877520049869082054480874189558197889423507878777789473806482951106472242579767408972116177020215019132624917299732285921189529757819288080658392298764976337611691011985508578800058994965778459698868053641196301599537115291189045098673905543102433408015136015131801331895393809114664197825620225042890885775780800842548278035494501206865683648365291278871123702778636832929330772445167736250838713302511629819341516477610369505702959567527453760439926520989511420441923216337857137131187488504399779795672622900035288172814118946711426699084124814103202727449951220314856767812690328670931067530658178302489803846508664038718706019518636780773925657196645965244385784774464920583457097865303865043754524788606008111586498590819962567260141262856927661367993166675558124099494962767471915320921769351132227213545920023326510899672750138654842840112017993886280657004898062991849322549792281169966090319332690285022838654332441028728213506306281739786199939072785427271477894457749875196580415727829591220865877958791383584611511840867266923655934699030414209039460308658348065604326877094073946100208778158135495327291583815275505704116229468018795067659888133564216632037397300992730696703436913203272559969281763681852468394696735632273732736026533776569041676720140905523185241612479249677324959539839438371871375951056031223158336046178259367583663260443788350240741463955449676323647197507074915451136518005705362770447974097106898233088515608094326327543845266119874760847661744459296153095365774843393621731971306538455164604730173158933445992256620410680064253061484545588613963525200361060691051302018586835143727501402382351333205109782014577069338513424901277574987447283308880904685103882563787313472172989047131040601495654933204761320589430331138359613869093909160440988334372192641357002328462138988059757149912128195348870884870932759870231068224743190835250423130177145539691652647692135800174772309059108683259728992265137884955044220787467777348698657536969379389978291093587540808767613481073065833334257526179202706767622615746322597979414483732921453750950665741512881537742380625156745051680776670008590541392560528383025309021060968560504673581248045150449256924882876301553954419505890854711737840108961124943229128055036009929539415863657425352101390768717779970098252635390962776276046028378652128363866451348205482771013416516137156534158239394204884497724384484656150883270688448886270459798606278482386301437044029503250429949455801571466926629564554938666474652038284353611595317704406793199381957404044139669266518373248785677653288446267479068629049127244558435497819555642609622245118368352259850152293101719603850940970853825620536276068093326582444903807449614442986802331248758537294702407337916470594318930624935317511781245192446091168661156748199926641130809485978761470485043086093563258791265935510231454207744726282110767764122970797022945394002932680550742658562482030390520842730932470985727963465331960826084652494090722054064132881616015674137522221191102796531980395758704243847241025402849206150003986594003623488143552367761268479148123457456879940414839108815234392423089064491058997247950555769006169227192400764663294099272068918177071361758772492058203674361988065966911259269662792864195277078709849683417159895354461278534104791365921534429853745043864194088656134937683777675055794771023453172164714034698382548000730862751561123833218984607432044225438981325844456585891674200055412406897386150821403531338396356177533948089765950543463339472016447432245714783667337061511413582228998816928621958707785368792196472786035436448549760450293054823820060981958273989914194932578892670261088221463626212763348309613946364122521837578637607651594203947447805540965938250717439081701422225129589277945023284762625332093562532669812211744304539166420920810019633196345119566776914055240774612735226843870960596646239382282446253295680744901696054997361256206768257033984912898522312978825335884227052994577774624204522417608318128801281603569509012925513424312470464623769142288909611786831076403684241985140376177531858909146832733301939597066086740346431271699424402311973985962176032120014736694737718671185679094220866819871695401116420101288972716828132514081023374207989839913518613043530795204162212689935830420884035573614596340602691601589055620361537991169084647634281237994139885283960516296484279613520431110773707379262160772779258629007594031721942434521858615187446570030816442129640836637831317781497620631469489002080013950095390125730752511662108202610418433477572660327281978499183020843648679759286117768227256076108247866162190970448102960045068553494514492840004103336101987425220509979616484923107990904791752508671871040849936219214104435902788257211982863336391976318381047780615191709260777404593009984446135563595776839009868825402018759729295083795042000224888840111328484092249638435430222741307973879887283286209664109419930257768040201904391452889176551516444225724221060303989642671126306440902992244072190513687509004741528548364768643607686755876965578357692697485643607137517947784694951786837365371676652945618201891743410090618119596229232137710610127812584322307683865229062854445710200791519869600642702783231630399046737318059739811450400990610295109618405382431403019778349236774722875599135968493664067192931010490894548496284121466755726001652930096051272492270087851030394680524683687791489641785321935735631762158856360514780807238354720819317342662847045812828723163866130962215647571706585936145369040530927647002828052171954178529320269482459064775386517240419292851596316665576848673746541669768877506822082948789008899547838395793557533717947064973298104501089287027900892362098681619539806612703198313719504005752144314485983826969339080183509714391397556337597863258646376275002992574589457561427043749027120374187131787661722210482005418526584356152306928764769026059910853844554091760310804980685894022473569508850334824664185408192104921339873282406174597865110172125136366861361714002067173338893926273698677855384364525909874615517954857716565521282882537395406997331530849514425711209261455651386103673111275038195734959352800046683560968459152525867614209226223030193473653909661178867829447626748878543375147481145968511802652918093207103661651465271704326601620622300655488108875523819283489034219919701850170828314878677275854406093129817873280760071475179822622177199118519721124776193466038378127642240765151005027624570782101503357303544137637244211187698272757130367449760649664759956729755930600468845654294500741506698563734780792694015610579115014068668895844430735857841144158745649051642979135067286621801701307092434939214761184712609993676951160545946741425586870081040773912297790185755524902801953349137534323005190570317792540566749594175205343825446816663954883008946275936920258660082066479441239734467264269171064977912885461915018201103338940709399996732876301022558459041302828085928423943445515970308402490870420448574310752486425627660447224247335166296857528330319944301582479929895289887412526395882328907836167080970821063304447705575269378643780627266531385650260869235414300267269357162545093403189707156149518451805266635941622098122539918187440835014856588705513508625522415105625079229476032201878775297583940636344754213068825995880601460840533631137816857698877675000900544996137969096175119176188047026847603376252850094378438369261433458805668845966420298377948256605868055307790585595974791872534107783833231413811059259267749028186948265647286833336371098469552100381665054228590360111160981620757310145320171925577791524394549549844835790016778775949376040019640877552052297914048777168985682373420144673080585291510239921302230717945287048781826297707712252541668006197380390477182191193623667843615875829106737747643061560503713598171337566706443429048548649798731052502495192554513663480481943018875380118157256163265688103083705807474437437336484949741463502874344491531815815608996243744881437046464995989466024333449176398436940975199499471256363186121377906047796967831753348599019112177274492284217590498429844253380398547340934100323666256306650345167914278960207979929529385318513348607478090236038145204725972740111620358150467121970881249575304286231198577172067459055415669953985308694576483521768891519037656357161968770584035863117318957789280001667737556330037697229592444002659669535248627242107580224131035799519409889195534739621689293659133758038759379212722636353732000670710458793359114993156052520332297402403342724642680671719019350046383011076809052539203887767990952433375229519627322629490326631660899212972034237160726099107807294598076773578203193295131466817878887972887849490519010232150677267916230477469263999476788538295280182348960865772915038574589694810031842875650827259460197924571883130402075704143480745516314343653860479310380372579410148564882136091566671561756166450912314433038323774292404474022642320014858514382290857722571081182315085812676604054508476296311019589833899642784930915546946351952390245983168713110952175632337891170286721267696264432863479851230467750818756616281490600025630437377189848088535344354047128568014003281192294189619992908470468797267470203982667546907213108059307253276007661383596805585307370278582618801328692794271115569231683188373961225627003296476575583432751736509727589583625082219877805721717748904882258340349849753177542055499220831646336591769217851964880058037940085937144251145631673272500892097686744612277082711212540248090314237927574532493673422898813915826485521823243321985065330407100750449192041418749464977828828324343774308113058279558732153153408284976917017965017603859455400550017211254308998261495059342633752868146324700042023674561500594590183526394041002369620541311621340297859988804756423486747086438761308258742397065910004997741737435126959543677390818490319722017898546302891781288582273191334993748843882044939218101449389150157731330265086045133623289494815651416831931972745394614201175832693934345722626754520416947672256644359537968060542526079001659436218760325102031035107878166824414693900694146736529716345205970379796077123620724651392291873680411539493029026897182444301044090607306516729749815292784972028807376322297715250478279347698922838961233030630810498808699072772591385854171901293974601140732671888912794506962116655899252512076109455074424323189610817974241377441125246395430226774001224595394352214090906113692250775936181471800202488729459523922220500445538755148868032713756824051368732540938091129875727825970161949966456750575944090319899342365757692491829353232510684610141464155666019121873364183822605572210336265092579568657780998205083426882825309909016804549252339661086527573532328861845389842026575618673505440124454019362118429818866436369902733727802634162951968240075997765633915966462907872438403343397916701580533893896887018534709770759885143116745539789520587587875644420005584755597757916541944020806009938558996879919648868080810690951787543363137925411980897500415967229526601914225399044997726345475141521017191830101141601730930534625201904286866457901466951252784307884429317539885090412223433500157441595848959488095711537710308245514546428461062144110004509433953026911523954071252922777192278864834698512889940439492870964519121885492778399024463911559553513719610653694636850149430434708150680118609632323666480766518530279257654553468575537963063881511718943382687884860472636964791950828390788020129022453340886728152264323258723513624984809871668751051203638421370025379721964886774812075324609630531718806492071780718919047941517387560270147271357238767618341651529591967135774246070092690568249811125642262718877235959155987043512959057073702282353523275221216054961536053208573993452288385573642736719021003789562752949550173470323551977820122591117276057673088917382481067293040351008006897031662230919764811497475977511067829373849954901850253328673267440980605211902313047189959660370073407528978501666008570624939275190114671498118409587459245476322830871781345742087240620100442187504650861059299323280684071821354557356869595417974416747930991182129102493600406926163367695058692837465690584025400343346998161399339463007245015247968087368115933169609887881095699570477623071424463533342950845892470008948933676069090954387307615317070492723886923912386259728443731847148746733810314325795510010994209522800596196589986725834685810421905206045472018732022643389238650579403680699366097322427609641475975802064840071198720644547744541981243942863010487951697250799358681042625241547185833724857783217255086976642779706318460086205776120703835807496098936002387595961710414886786745973882549240185953021651623234718957624030457158702214091222073571388881674504580524906499861009536515066809691265571839114408449561869913892057651156910942040779836849038080065682608764506571070486701560814962583897315748257961085898826578792819914247052845678873972544450129011359867141962151570857857101902920776912495313026040223878475243532538951675857100212900858749208204816908462678149632498449396455618717704330280200955628486299045470295466935213404554390794007760980876453722518380437401631903620427394264591403620151099011148781719804428127100700362633310918647456513502734747214575055866461774426016071217668203842861302825611130982376501866500240907326518632602774036571996832120062233960937380864138461267561985010423793093263839164626382809303524230499325323662780982876161546048816015542269711330128667880660819639770325314068675724902990101365427425493844007925365080707348491721932178013198018561510969494109658736466921298114126932487283171749856247169189516497188955925966891137070861544571096968133445500134676165242420196131611222397440520704158516363960784684468359218037745237003229379124684305752370278050019411001219111694537790926337437670954472030454665039578535027780695547819654808382570967332288613618054807715348669586350844758955221293349816292656127786587315572726846206759520361155318606817465162891092352326945535884970721221927981496318487033527151445094862738325517703612386682114367928947433613808004847605407951324024747865513957621345858738795544832439328939407769739697523617455971283675526991104612264253139160224361160051859569778923981474905715687770321272429252433923332666944526605833821639048448896406476873477053627211953416078664855305682935161146241836511415036268498578702275661406104447855040965537390824009088974535678930483810631398389871406541354040884413397689765664959813050132709145541917927046681953094022619679406043638303161159982407552524171430860208822251732358198990320671005523805577043778106441029156346637799141877574827351747988523986709951055915815199173305433618433330854245164675700572129777647066439225284549863128474820923268233959492318850318982176856728100686541090928458590151175847780402737670880305918288227617545603821259336433346567012478960514050602580234109859590089482341094190926543290028149084107695925790727699733338689640851378006383662365543320921686301658530775814071705357892774662217154315333496836851529940695215917473931669714784281925029436382204788680409866741009118968421872885162080866517825836032744283702147933850854152810950257790202696409921295468383130757538541170725215524567547835199972103596778017020731759225811489849432347882791018580481499816380743982862660291363403319496050914109128300275795416317037584423739592754190122312244095852254690895009236168263399464365588537797093847621472645053242218451650706239937626018864321393284355727579768413461796656291473748857269536125917799818323146397825403174536819974821238631751301542943134813669229867377592481703531893408917161339209040878362237507324647908191081904600049517308607354205913202548037999945068570867995921859295222005606712575534718446624225262760215954843709733300410005875796490459614558616866453614915646845734246131194210663977424933922518016547339161912663071602935678211172556895031697182791426062217024940742341122904478286170741546832871294660386234460822562813009895372045574653146923267997571881223220165887325174108423383731801637973845955178079021357457547141759168621885514768083636166172436696785469116662849627002026243988400539423741607011507109370011075139114416724134244481710156724038405092852099416856922980244692376104738789478909708449371269633580146386004474129335814768873806305006140561549934597801561150874555369918471273867176796383172315638638670923559354643885507986228744041390435240831611232396738342804298994871357335242264125255558188915448477753995487028876472299758810298021860647765417347264766823088437881687891744492512264464788415980774913470510150914269932225104913667659367988517103828130241124636676808142977402619105323240076774089043012627942578914947972772170331632804484558139862885661898215083930567750324533146370409968764572417133281816680381189929713690423975707991739842782063374878312568192278591992601241114888324973548154081558850860438043074834573030638118298715667704263639764730734788713011281013873278019925686053418522482230277955574016753003319362831405311901799139008171135365915689273085141064967464398677446010616489563379840192494320883352766696610097208590868801637466475104353455111490880325793466164693759044843651198311392828925691468667530214998158960099181031053834685557885150362347497754275391663625032296837321604750076479067727166254318687703857417435510281885023849680104342098932826173246143364285461101362356808557899032176986131935208852824545907962270758864197988636570189938974783212756491567634431722210990994267810016975711404256004867060357278118994624437524192561739475351342721466848308823428960986436072336581910384007490772674453852876824269891504031612231899243243644630442351165237409714503552334866060265648159651526229799952264369386989932101732782608869228551399815095777632116435792554778133671159257049875420649446522936545030549035908965284305326620824398508876066790405424598880858658953152550551259505526948557526870030595689202840138217619611199799740624406783620514325157855693466898580567886378204910695231526232414062132731562779184748411501397936051476461637688511726653303417388113320737000915401849336247915091095882243762290888449855945295655169783751076459232877381791566396334591028421410155450505731208493808328394698499529596654441100261324105665501606627156070935019757970594834928536668518907046751280472351811434394129225482053731613100988263450244853046089602164808472026362670781348509529955810715054611894565960037105459810440115418229594380044503017343466879848875219628591293325198494193238944945181150553956598102658587661272959077881399619728574882221961154110554712127391093651380524621528202276848550705560640476268688863461930614827454815047581249108433171862985111620846459118287587808725384452543453769571494886154863057418474655786935509713507135397051621899714959134859806368709933821595288808163235388201250352190481018744784973358569418276515765902004130437450353943420825952546404401449269147032306700227901142796318700565568032817976732119746939610442027814089337192450742404761411961009810247205800259063804315419235821227846925025041188230515296938107659037151057940808953007092702926291153484313929248205577229331828588165473276232934687036163197342897666150379297404808092326712345677493000982709679599487761580319171495344821346617359296074474848984117426236860376062798977838753542129499252150638337104247702037583983906197884333140850828246846822137470992002670786889486687804927261810166119549751097148379855833833299364832347517139412993516098601331189081999157072863909335264038789899674763636092253175721267519381680830661517069627755191032926546341506706805676180821904410340393176968397960818400116293648809359221636344375548721220943992490441664452403156548158630493782226958042255662588043587182800081309348706686900346319884623468976373530536413079261377076292451885654216537812635936057935171688814163640357861065745356891712227611369927857488865507818140545870037494243588718090133625075165073072311813686719735400158366388731281452313333326927404901493820082058628191119005288832844500906142725674496269244038158047109962356049944586780807478840661917754421411614860507186174688458175961544830365837162894782361651032824609281332179638312162248855759638833467425885607618915122986223635476922326606696060685762134177182583086357639757334561050672440202855438667307161081518418625444821417862712903817027895597918770127261283238544510961427851886584907004708134550027191253479508491138397526856863181544708518531272668618147464655975902843770294170078891598396660159966359358823238307617272402085173628247852393031971646764451125152138023795649161548545747772147753337400743304401126577565349776500822711456892570718564767104358606323712818272539512278810637901671826819707361678500618973211351890635119637238454692774373323405228148276514359066699386607334093719210279282324023272920173349226402731222474038394699756754253960302952521991307905190323755144813148513456143643942724829297170314732949198083556251777053750118183832798536783367352174568748705699107543463402075066373830646236231595078785075371079410424605931215435413581712887515691444025700501663269963012315389017967656370330935904707088655667022798806809955441702434400517679148545086274381136414314304665603853259354016943995583156762369483433181119807590026575711456476090716633398223274852441039493723233094085028829930784949109113667636715031313786990748987425308753353402869422758727464468598413862477608150504547991744456040868056489894175053135788257066735310659455387085741177225835244797562840729672170232379736367965867541281168264075921742907953264129836532221466944789456122109169824287584001873727363058543817173774530644018675012056523754482809406457649524109811688248529683403714627003785013507125924443599539167639655294211373980330301585852955612550643804246548067554995797753872371804683243371894637160255984343969931837904756607866450716437944226338366820903063055679584358097322898309749168568847530977963263031776089689263859746537788850426553876039568738174296280572062971860805103549794946564886564981250257432549853368870214512630595891666286039518546411610933034903497093427151013876996500880783921361376426956795405445869199678562292778259845713440278890919469904977348661420043291649527338335365955034317431144044471956637029346534465488428131218288390656982765115709102961676346659588536201751781581391680127456797750993353920914669958691033284412278506280653046651807642582515669817726197034938731905367141292235126187095629880992422359207117105762080821476043471322763672151294120367021128345514056579587938384824230418970707072054245875105211261966448272860781311545126710842884137
0xCD593E2F...CE242CA09
0.127568272 Eth
Nonce: 40
0.067412692 Eth
Nonce: 41
0.06015558

Execution Trace

PrimasToken.60806040( )
pragma solidity ^0.4.23;

library Roles {
    struct Role {
        mapping(address => bool) bearer;
    }

    function add(Role storage role, address addr) internal {
        role.bearer[addr] = true;
    }

    function remove(Role storage role, address addr) internal {
        role.bearer[addr] = false;
    }

    function check(Role storage role, address addr) view internal {
        require(has(role, addr));
    }

    function has(Role storage role, address addr) view internal returns (bool) {
        return role.bearer[addr];
    }
}

contract RBAC {

    address initialOwner;

    using Roles for Roles.Role;

    mapping(string => Roles.Role) private roles;

    event RoleAdded(address addr, string roleName);
    event RoleRemoved(address addr, string roleName);

    modifier onlyOwner() {
        require(msg.sender == initialOwner);
        _;
    }

    function checkRole(address addr, string roleName) view public {
        roles[roleName].check(addr);
    }

    function hasRole(address addr, string roleName) view public returns (bool) {
        return roles[roleName].has(addr);
    }

    function addRole(address addr, string roleName) public onlyOwner {
        roles[roleName].add(addr);
        emit RoleAdded(addr, roleName);
    }

    function removeRole(address addr, string roleName) public onlyOwner {
        roles[roleName].remove(addr);
        emit RoleRemoved(addr, roleName);
    }

    modifier onlyRole(string roleName) {
        checkRole(msg.sender, roleName);
        _;
    }
}

library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b > 0);
        // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        assert(a == b * c);
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a - b;
        assert(b <= a);
        assert(a == c + b);
        return c;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        assert(a == c - b);
        return c;
    }
}

contract PrimasToken is RBAC {

    using SafeMath for uint256;

    string public name;
    uint256 public decimals;
    string public symbol;
    string public version;
    uint256 public totalSupply;
    uint256 initialAmount;
    uint256 deployTime;
    uint256 lastInflationDayStart;
    uint256 incentivesPool;

    mapping(address => uint256) private userLockedTokens;
    mapping(address => uint256) balances;
    mapping(address => mapping(address => uint256)) allowed;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
    event Lock(address userAddress, uint256 amount);
    event Unlock(address userAddress,uint256 amount);
    event Inflate (uint256 incentivesPoolValue);

    constructor(uint256 _previouslyInflatedAmount) public {
        name = "Primas Token";
        decimals = 18;
        symbol = "PST";
        version = "V2.0";
        initialAmount = 100000000 * 10 ** decimals;
        initialOwner = msg.sender;
        deployTime = block.timestamp;
        lastInflationDayStart = 0;
        incentivesPool = 0;

        // Primas token is deployed at 2018/06/01
        // When upgrading after new deployment of the contract
        // we need to add the inflated tokens back
        // for system consistency.

        totalSupply = initialAmount.add(_previouslyInflatedAmount);
        balances[msg.sender] = totalSupply;

        emit Transfer(address(0), msg.sender, totalSupply);
    }

    function inflate() public onlyRole("InflationOperator") returns (uint256)  {
        uint256 currentTime = block.timestamp;
        uint256 currentDayStart = currentTime / 1 days;
        uint256 inflationAmount;
        require(lastInflationDayStart != currentDayStart);
        lastInflationDayStart = currentDayStart;
        uint256 createDurationYears = (currentTime - deployTime) / 1 years;
        if (createDurationYears < 1) {
            inflationAmount = initialAmount / 10 / 365;
        } else if (createDurationYears >= 20) {
            inflationAmount = 0;
        } else {
            inflationAmount = initialAmount * (100 - (5 * createDurationYears)) / 365 / 1000;
        }
        incentivesPool = incentivesPool.add(inflationAmount);
        totalSupply = totalSupply.add(inflationAmount);
        emit Inflate(incentivesPool);
        return incentivesPool;
    }

    function getIncentivesPool() view public returns (uint256) {
        return incentivesPool;
    }

    function incentivesIn(address[] _users, uint256[] _values) public onlyRole("IncentivesCollector") returns (bool success) {
        require(_users.length == _values.length);
        for (uint256 i = 0; i < _users.length; i++) {
            userLockedTokens[_users[i]] = userLockedTokens[_users[i]].sub(_values[i]);
            balances[_users[i]] = balances[_users[i]].sub(_values[i]);
            incentivesPool = incentivesPool.add(_values[i]);
            emit Transfer(_users[i], address(0), _values[i]);
        }
        return true;
    }

    function incentivesOut(address[] _users, uint256[] _values) public onlyRole("IncentivesDistributor") returns (bool success) {
        require(_users.length == _values.length);
        for (uint256 i = 0; i < _users.length; i++) {
            incentivesPool = incentivesPool.sub(_values[i]);
            balances[_users[i]] = balances[_users[i]].add(_values[i]);
            emit Transfer(address(0), _users[i], _values[i]);
        }
        return true;
    }

    function tokenLock(address _userAddress, uint256 _amount) public onlyRole("Locker") {
        require(balanceOf(_userAddress) >= _amount);
        userLockedTokens[_userAddress] = userLockedTokens[_userAddress].add(_amount);
        emit Lock(_userAddress, _amount);
    }

    function tokenUnlock(address _userAddress, uint256 _amount, address _to, uint256 _toAmount) public onlyRole("Unlocker") {
        require(_amount >= _toAmount);
        require(userLockedTokens[_userAddress] >= _amount);
        userLockedTokens[_userAddress] = userLockedTokens[_userAddress].sub(_amount);
        emit Unlock(_userAddress, _amount);
        if (_to != address(0) && _toAmount != 0) {
            balances[_userAddress] = balances[_userAddress].sub(_toAmount);
            balances[_to] = balances[_to].add(_toAmount);
            emit Transfer(_userAddress, _to, _toAmount);
        }
    }

    function transferAndLock(address _userAddress, address _to, uint256 _amount) public onlyRole("Locker")  {
        require(balanceOf(_userAddress) >= _amount);
        balances[_userAddress] = balances[_userAddress].sub(_amount);
        balances[_to] = balances[_to].add(_amount);
        userLockedTokens[_to] = userLockedTokens[_to].add(_amount);
        emit Transfer(_userAddress, _to, _amount);
        emit Lock(_to, _amount);
    }

    function balanceOf(address _owner) view public returns (uint256 balance) {
        return balances[_owner] - userLockedTokens[_owner];
    }

    function transfer(address _to, uint256 _value) public returns (bool success) {
        require(balanceOf(msg.sender) >= _value);
        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(msg.sender, _to, _value);
        return true;
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        require(balanceOf(_from) >= _value && allowed[_from][msg.sender] >= _value);
        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        emit Transfer(_from, _to, _value);
        return true;
    }

    function approve(address _spender, uint256 _value) public returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

    function allowance(address _owner, address _spender) constant public returns (uint256 remaining) {
        return allowed[_owner][_spender];
    }
}