ETH Price: $2,557.90 (-0.38%)

Transaction Decoder

Block:
8207012 at Jul-23-2019 12:45:35 PM +UTC
Transaction Fee:
0.00071990694 ETH $1.84
Gas Used:
1,436,940 Gas / 0.501 Gwei

Emitted Events:

5 CoinMmc.TokenGiven( sender=0x28CbB1E06a913FeAe3d0913Aa220E0908a41E4e7, beneficiary=0x28CbB1E06a913FeAe3d0913Aa220E0908a41E4e7, value=0, amount=88888 )
6 CoinMmc.Transfer( from=0x28CbB1E06a913FeAe3d0913Aa220E0908a41E4e7, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
7 CoinMmc.TokenGiven( sender=0xE5d09A300386c47f21Dde151A3B11cC0bD234D44, beneficiary=0xE5d09A300386c47f21Dde151A3B11cC0bD234D44, value=0, amount=88888 )
8 CoinMmc.Transfer( from=0xE5d09A300386c47f21Dde151A3B11cC0bD234D44, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
9 CoinMmc.TokenGiven( sender=0xe45978fdfB1C1f8b213eEAE9c40F71c7718871b3, beneficiary=0xe45978fdfB1C1f8b213eEAE9c40F71c7718871b3, value=0, amount=88888 )
10 CoinMmc.Transfer( from=0xe45978fdfB1C1f8b213eEAE9c40F71c7718871b3, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
11 CoinMmc.TokenGiven( sender=0x4450598D5B3c8d6d37F114E01498340fE6E72ce6, beneficiary=0x4450598D5B3c8d6d37F114E01498340fE6E72ce6, value=0, amount=88888 )
12 CoinMmc.Transfer( from=0x4450598D5B3c8d6d37F114E01498340fE6E72ce6, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
13 CoinMmc.TokenGiven( sender=0x42983F9576d3E6d7de8C5E06f8a84F05c613D17b, beneficiary=0x42983F9576d3E6d7de8C5E06f8a84F05c613D17b, value=0, amount=88888 )
14 CoinMmc.Transfer( from=0x42983F9576d3E6d7de8C5E06f8a84F05c613D17b, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
15 CoinMmc.TokenGiven( sender=0xCD4f38991d67E377F396B88bf09507464928D0eE, beneficiary=0xCD4f38991d67E377F396B88bf09507464928D0eE, value=0, amount=88888 )
16 CoinMmc.Transfer( from=0xCD4f38991d67E377F396B88bf09507464928D0eE, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
17 CoinMmc.TokenGiven( sender=0x5864bc3bf816E42511ae388362D6279Ead18ebDC, beneficiary=0x5864bc3bf816E42511ae388362D6279Ead18ebDC, value=0, amount=88888 )
18 CoinMmc.Transfer( from=0x5864bc3bf816E42511ae388362D6279Ead18ebDC, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
19 CoinMmc.TokenGiven( sender=0x5A65a4DA30CC73E540C9c6f7290d0EBFce215cD8, beneficiary=0x5A65a4DA30CC73E540C9c6f7290d0EBFce215cD8, value=0, amount=88888 )
20 CoinMmc.Transfer( from=0x5A65a4DA30CC73E540C9c6f7290d0EBFce215cD8, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
21 CoinMmc.TokenGiven( sender=0xF7C6f98Fb5Adf9F661C8D627E44e6d1550844Fa6, beneficiary=0xF7C6f98Fb5Adf9F661C8D627E44e6d1550844Fa6, value=0, amount=88888 )
22 CoinMmc.Transfer( from=0xF7C6f98Fb5Adf9F661C8D627E44e6d1550844Fa6, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
23 CoinMmc.TokenGiven( sender=0x4588C6d4EB3fEc53F8bA5B2c27a5f0E768974df3, beneficiary=0x4588C6d4EB3fEc53F8bA5B2c27a5f0E768974df3, value=0, amount=88888 )
24 CoinMmc.Transfer( from=0x4588C6d4EB3fEc53F8bA5B2c27a5f0E768974df3, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
25 CoinMmc.TokenGiven( sender=0xB0C2B08386E00c519Fb335819CDAF5407d677719, beneficiary=0xB0C2B08386E00c519Fb335819CDAF5407d677719, value=0, amount=88888 )
26 CoinMmc.Transfer( from=0xB0C2B08386E00c519Fb335819CDAF5407d677719, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
27 CoinMmc.TokenGiven( sender=0x934d33d5dCf69171BB945F5E0b5962Be5b266057, beneficiary=0x934d33d5dCf69171BB945F5E0b5962Be5b266057, value=0, amount=88888 )
28 CoinMmc.Transfer( from=0x934d33d5dCf69171BB945F5E0b5962Be5b266057, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
29 CoinMmc.TokenGiven( sender=0x65d36488891d0215Ed77a56dAA12bCe951CdbeD2, beneficiary=0x65d36488891d0215Ed77a56dAA12bCe951CdbeD2, value=0, amount=88888 )
30 CoinMmc.Transfer( from=0x65d36488891d0215Ed77a56dAA12bCe951CdbeD2, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
31 CoinMmc.TokenGiven( sender=0x0B5a62B329ab7bc97a329eA6025F0c6c5e7ae53e, beneficiary=0x0B5a62B329ab7bc97a329eA6025F0c6c5e7ae53e, value=0, amount=88888 )
32 CoinMmc.Transfer( from=0x0B5a62B329ab7bc97a329eA6025F0c6c5e7ae53e, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
33 CoinMmc.TokenGiven( sender=0xA9b1F1556e8Ea1B206bB1F0c63c0d715A5caE408, beneficiary=0xA9b1F1556e8Ea1B206bB1F0c63c0d715A5caE408, value=0, amount=88888 )
34 CoinMmc.Transfer( from=0xA9b1F1556e8Ea1B206bB1F0c63c0d715A5caE408, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
35 CoinMmc.TokenGiven( sender=0x5B7f4acE1A0E9902C55E9b3bD33c86A5BeC1a684, beneficiary=0x5B7f4acE1A0E9902C55E9b3bD33c86A5BeC1a684, value=0, amount=88888 )
36 CoinMmc.Transfer( from=0x5B7f4acE1A0E9902C55E9b3bD33c86A5BeC1a684, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
37 CoinMmc.TokenGiven( sender=0x76f6Ef1AD5DC3ec93190174C0f5CfFDD6b53eeD0, beneficiary=0x76f6Ef1AD5DC3ec93190174C0f5CfFDD6b53eeD0, value=0, amount=88888 )
38 CoinMmc.Transfer( from=0x76f6Ef1AD5DC3ec93190174C0f5CfFDD6b53eeD0, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
39 CoinMmc.TokenGiven( sender=0x42dBC314b593857f707B28fd362dF4c014E31AED, beneficiary=0x42dBC314b593857f707B28fd362dF4c014E31AED, value=0, amount=88888 )
40 CoinMmc.Transfer( from=0x42dBC314b593857f707B28fd362dF4c014E31AED, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
41 CoinMmc.TokenGiven( sender=0xf167f242338644c2508CF1BBc4D0707a941a905C, beneficiary=0xf167f242338644c2508CF1BBc4D0707a941a905C, value=0, amount=88888 )
42 CoinMmc.Transfer( from=0xf167f242338644c2508CF1BBc4D0707a941a905C, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
43 CoinMmc.TokenGiven( sender=0x5F87a9E9a7A88EB03d7fD98c2f83b183c86Cf1F7, beneficiary=0x5F87a9E9a7A88EB03d7fD98c2f83b183c86Cf1F7, value=0, amount=88888 )
44 CoinMmc.Transfer( from=0x5F87a9E9a7A88EB03d7fD98c2f83b183c86Cf1F7, to=[Sender] 0xaf9365a8c8c1c0b03438b8b1d43251d00aaf5d95, value=8888799 )
45 CoinMmc.TokenGiven( sender=0xB39498b527FE90C3978f1E68A2f3Ed3B405EBe19, beneficiary=0xB39498b527FE90C3978f1E68A2f3Ed3B405EBe19, value=0, amount=88888 )
46 CoinMmc.Transfer( from=0xB39498b527FE90C3978f1E68A2f3Ed3B405EBe19, to=0x06221Dcca4C7ec37A9A0aF90EEee8f2fE1C5B47a, value=8888799 )

Account State Difference:

  Address   Before After State Difference Code
(Nanopool)
5,019.616414355464829985 Eth5,019.617134262404829985 Eth0.00071990694
0xAf9365a8...00Aaf5d95
0.003903941015224714 Eth
Nonce: 34
0.003184034075224714 Eth
Nonce: 35
0.00071990694
0xdcB5410E...A981f5e2d
0xf331FF3d...62FE82757

Execution Trace

0xf331ff3d2eaf9a2009dc935816665c962fe82757.f5dd50d2( )
  • 0x28cbb1e06a913feae3d0913aa220e0908a41e4e7.60806040( )
    • CoinMmc.CALL( )
    • CoinMmc.balanceOf( _addr=0x28CbB1E06a913FeAe3d0913Aa220E0908a41E4e7 ) => ( 8888800 )
    • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
    • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
    • 0xe5d09a300386c47f21dde151a3b11cc0bd234d44.60806040( )
      • CoinMmc.CALL( )
      • CoinMmc.balanceOf( _addr=0xE5d09A300386c47f21Dde151A3B11cC0bD234D44 ) => ( 8888800 )
      • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
      • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
      • 0xe45978fdfb1c1f8b213eeae9c40f71c7718871b3.60806040( )
        • CoinMmc.CALL( )
        • CoinMmc.balanceOf( _addr=0xe45978fdfB1C1f8b213eEAE9c40F71c7718871b3 ) => ( 8888800 )
        • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
        • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
        • 0x4450598d5b3c8d6d37f114e01498340fe6e72ce6.60806040( )
          • CoinMmc.CALL( )
          • CoinMmc.balanceOf( _addr=0x4450598D5B3c8d6d37F114E01498340fE6E72ce6 ) => ( 8888800 )
          • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
          • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
          • 0x42983f9576d3e6d7de8c5e06f8a84f05c613d17b.60806040( )
            • CoinMmc.CALL( )
            • CoinMmc.balanceOf( _addr=0x42983F9576d3E6d7de8C5E06f8a84F05c613D17b ) => ( 8888800 )
            • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
            • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
            • 0xcd4f38991d67e377f396b88bf09507464928d0ee.60806040( )
              • CoinMmc.CALL( )
              • CoinMmc.balanceOf( _addr=0xCD4f38991d67E377F396B88bf09507464928D0eE ) => ( 8888800 )
              • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
              • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
              • 0x5864bc3bf816e42511ae388362d6279ead18ebdc.60806040( )
                • CoinMmc.CALL( )
                • CoinMmc.balanceOf( _addr=0x5864bc3bf816E42511ae388362D6279Ead18ebDC ) => ( 8888800 )
                • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
                • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                • 0x5a65a4da30cc73e540c9c6f7290d0ebfce215cd8.60806040( )
                  • CoinMmc.CALL( )
                  • CoinMmc.balanceOf( _addr=0x5A65a4DA30CC73E540C9c6f7290d0EBFce215cD8 ) => ( 8888800 )
                  • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
                  • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                  • 0xf7c6f98fb5adf9f661c8d627e44e6d1550844fa6.60806040( )
                    • CoinMmc.CALL( )
                    • CoinMmc.balanceOf( _addr=0xF7C6f98Fb5Adf9F661C8D627E44e6d1550844Fa6 ) => ( 8888800 )
                    • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
                    • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                    • 0x4588c6d4eb3fec53f8ba5b2c27a5f0e768974df3.60806040( )
                      • CoinMmc.CALL( )
                      • CoinMmc.balanceOf( _addr=0x4588C6d4EB3fEc53F8bA5B2c27a5f0E768974df3 ) => ( 8888800 )
                      • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
                      • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                      • 0xb0c2b08386e00c519fb335819cdaf5407d677719.60806040( )
                        • CoinMmc.CALL( )
                        • CoinMmc.balanceOf( _addr=0xB0C2B08386E00c519Fb335819CDAF5407d677719 ) => ( 8888800 )
                        • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
                        • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                        • 0x934d33d5dcf69171bb945f5e0b5962be5b266057.60806040( )
                          • CoinMmc.CALL( )
                          • CoinMmc.balanceOf( _addr=0x934d33d5dCf69171BB945F5E0b5962Be5b266057 ) => ( 8888800 )
                          • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
                          • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                          • 0x65d36488891d0215ed77a56daa12bce951cdbed2.60806040( )
                            • CoinMmc.CALL( )
                            • CoinMmc.balanceOf( _addr=0x65d36488891d0215Ed77a56dAA12bCe951CdbeD2 ) => ( 8888800 )
                            • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
                            • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                            • 0x0b5a62b329ab7bc97a329ea6025f0c6c5e7ae53e.60806040( )
                              • CoinMmc.CALL( )
                              • CoinMmc.balanceOf( _addr=0x0B5a62B329ab7bc97a329eA6025F0c6c5e7ae53e ) => ( 8888800 )
                              • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
                              • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                              • 0xa9b1f1556e8ea1b206bb1f0c63c0d715a5cae408.60806040( )
                                • CoinMmc.CALL( )
                                • CoinMmc.balanceOf( _addr=0xA9b1F1556e8Ea1B206bB1F0c63c0d715A5caE408 ) => ( 8888800 )
                                • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
                                • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                                • 0x5b7f4ace1a0e9902c55e9b3bd33c86a5bec1a684.60806040( )
                                  • CoinMmc.CALL( )
                                  • CoinMmc.balanceOf( _addr=0x5B7f4acE1A0E9902C55E9b3bD33c86A5BeC1a684 ) => ( 8888800 )
                                  • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
                                  • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                                  • 0x76f6ef1ad5dc3ec93190174c0f5cffdd6b53eed0.60806040( )
                                    • CoinMmc.CALL( )
                                    • CoinMmc.balanceOf( _addr=0x76f6Ef1AD5DC3ec93190174C0f5CfFDD6b53eeD0 ) => ( 8888800 )
                                    • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
                                    • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                                    • 0x42dbc314b593857f707b28fd362df4c014e31aed.60806040( )
                                      • CoinMmc.CALL( )
                                      • CoinMmc.balanceOf( _addr=0x42dBC314b593857f707B28fd362dF4c014E31AED ) => ( 8888800 )
                                      • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
                                      • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                                      • 0xf167f242338644c2508cf1bbc4d0707a941a905c.60806040( )
                                        • CoinMmc.CALL( )
                                        • CoinMmc.balanceOf( _addr=0xf167f242338644c2508CF1BBc4D0707a941a905C ) => ( 8888800 )
                                        • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
                                        • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                                        • 0x5f87a9e9a7a88eb03d7fd98c2f83b183c86cf1f7.60806040( )
                                          • CoinMmc.CALL( )
                                          • CoinMmc.balanceOf( _addr=0x5F87a9E9a7A88EB03d7fD98c2f83b183c86Cf1F7 ) => ( 8888800 )
                                          • CoinMmc.transfer( _to=0xAf9365a8c8c1c0B03438B8b1d43251D00Aaf5d95, _value=8888799 ) => ( True )
                                          • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                                          • 0xb39498b527fe90c3978f1e68a2f3ed3b405ebe19.60806040( )
                                            • CoinMmc.CALL( )
                                            • CoinMmc.balanceOf( _addr=0xB39498b527FE90C3978f1E68A2f3Ed3B405EBe19 ) => ( 8888800 )
                                            • CoinMmc.transfer( _to=0x06221Dcca4C7ec37A9A0aF90EEee8f2fE1C5B47a, _value=8888799 ) => ( True )
                                            • 0x175e8ca2a7ad4f205688a6896daa572733e0b6e1.SELFDESTRUCT( )
                                              pragma solidity ^0.4.23;
                                              
                                              contract CoinMmc // @eachvar
                                              {
                                                  // ======== 初始化代币相关逻辑 ==============
                                                  // 地址信息
                                                  address public admin_address = 0x64b33dB1Cc804e7CA51D9c21F132567923D7BA00; // @eachvar
                                                  address public account_address = 0x64b33dB1Cc804e7CA51D9c21F132567923D7BA00; // @eachvar 初始化后转入代币的地址
                                                  
                                                  // 定义账户余额
                                                  mapping(address => uint256) balances;
                                                  
                                                  // solidity 会自动为 public 变量添加方法,有了下边这些变量,就能获得代币的基本信息了
                                                  string public name = "MaiMiChain"; // @eachvar
                                                  string public symbol = "MMC"; // @eachvar
                                                  uint8 public decimals = 2; // @eachvar
                                                  uint256 initSupply = 1000000000000; // @eachvar
                                                  uint256 public totalSupply = 0; // @eachvar
                                              
                                                  // 生成代币,并转入到 account_address 地址
                                                  constructor() 
                                                  payable 
                                                  public
                                                  {
                                                      totalSupply = mul(initSupply, 10**uint256(decimals));
                                                      balances[account_address] = totalSupply;
                                              
                                                      // @lock
                                                      // 锁仓相关信息 
                                                      _add_lock_account(0x6efB62605A66E32582c37b835F81Bc91A6a8fb2e, mul(80000000000,10**uint256(decimals)), 1596815160);
                                                      _add_lock_account(0x0ba46c0fC6a5C206855cEf215222e347E1559eDf, mul(120000000000,10**uint256(decimals)), 1596815160);
                                                      _add_lock_account(0xE269695D497387DfEAFE12b0b3B54441683F63C8, mul(100000000000,10**uint256(decimals)), 1628351160);
                                                      
                                                      
                                                  }
                                              
                                                  function balanceOf( address _addr ) public view returns ( uint )
                                                  {
                                                      return balances[_addr];
                                                  }
                                              
                                                  // ========== 转账相关逻辑 ====================
                                                  event Transfer(
                                                      address indexed from, 
                                                      address indexed to, 
                                                      uint256 value
                                                  ); 
                                              
                                                  function transfer(
                                                      address _to, 
                                                      uint256 _value
                                                  ) 
                                                  public 
                                                  returns (bool) 
                                                  {
                                                      require(_to != address(0));
                                                      require(_value <= balances[msg.sender]);
                                              
                                                      balances[msg.sender] = sub(balances[msg.sender],_value);
                                              
                                                      // @lock
                                                      // 添加锁仓相关检查
                                                      // solium-disable-next-line security/no-block-members
                                                      if(lockInfo[msg.sender].amount > 0 && block.timestamp < lockInfo[msg.sender].release_time)
                                                          require(balances[msg.sender] >= lockInfo[msg.sender].amount);
                                              
                                                          
                                              
                                                      balances[_to] = add(balances[_to], _value);
                                                      emit Transfer(msg.sender, _to, _value);
                                                      return true;
                                                  }
                                              
                                                  // ========= 授权转账相关逻辑 =============
                                                  
                                                  mapping (address => mapping (address => uint256)) internal allowed;
                                                  event Approval(
                                                      address indexed owner,
                                                      address indexed spender,
                                                      uint256 value
                                                  );
                                              
                                                  function transferFrom(
                                                      address _from,
                                                      address _to,
                                                      uint256 _value
                                                  )
                                                  public
                                                  returns (bool)
                                                  {
                                                      require(_to != address(0));
                                                      require(_value <= balances[_from]);
                                                      require(_value <= allowed[_from][msg.sender]);
                                              
                                                      balances[_from] = sub(balances[_from], _value);
                                                      
                                                      // @lock
                                                      // 添加锁仓相关检查 
                                                      // solium-disable-next-line security/no-block-members
                                                      if(lockInfo[_from].amount > 0 && block.timestamp < lockInfo[_from].release_time)
                                                          require(balances[_from] >= lockInfo[_from].amount);
                                                      
                                                      
                                                      balances[_to] = add(balances[_to], _value);
                                                      allowed[_from][msg.sender] = sub(allowed[_from][msg.sender], _value);
                                                      emit Transfer(_from, _to, _value);
                                                      return true;
                                                  }
                                              
                                                  function approve(
                                                      address _spender, 
                                                      uint256 _value
                                                  ) 
                                                  public 
                                                  returns (bool) 
                                                  {
                                                      allowed[msg.sender][_spender] = _value;
                                                      emit Approval(msg.sender, _spender, _value);
                                                      return true;
                                                  }
                                              
                                                  function allowance(
                                                      address _owner,
                                                      address _spender
                                                  )
                                                  public
                                                  view
                                                  returns (uint256)
                                                  {
                                                      return allowed[_owner][_spender];
                                                  }
                                              
                                                  function increaseApproval(
                                                      address _spender,
                                                      uint256 _addedValue
                                                  )
                                                  public
                                                  returns (bool)
                                                  {
                                                      allowed[msg.sender][_spender] = add(allowed[msg.sender][_spender], _addedValue);
                                                      emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
                                                      return true;
                                                  }
                                              
                                                  function decreaseApproval(
                                                      address _spender,
                                                      uint256 _subtractedValue
                                                  )
                                                  public
                                                  returns (bool)
                                                  {
                                                      uint256 oldValue = allowed[msg.sender][_spender];
                                              
                                                      if (_subtractedValue > oldValue) {
                                                          allowed[msg.sender][_spender] = 0;
                                                      } 
                                                      else 
                                                      {
                                                          allowed[msg.sender][_spender] = sub(oldValue, _subtractedValue);
                                                      }
                                                      
                                                      emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
                                                      return true;
                                                  }
                                              
                                                  
                                                  // ========= 直投相关逻辑 ===============
                                                  bool public direct_drop_switch = true; // 是否开启直投 @eachvar
                                                  uint256 public direct_drop_rate = 200000000; // 兑换比例,注意这里是eth为单位,需要换算到wei @eachvar
                                                  address public direct_drop_address = 0xBe60a6e39Bd058198C8E56e6c708A9C70190f83b; // 用于发放直投代币的账户 @eachvar
                                                  address public direct_drop_withdraw_address = 0x64b33dB1Cc804e7CA51D9c21F132567923D7BA00; // 直投提现地址 @eachvar
                                              
                                                  bool public direct_drop_range = true; // 是否启用直投有效期 @eachvar
                                                  uint256 public direct_drop_range_start = 1562921160; // 有效期开始 @eachvar
                                                  uint256 public direct_drop_range_end = 3803445960; // 有效期结束 @eachvar
                                              
                                                  event TokenPurchase
                                                  (
                                                      address indexed purchaser,
                                                      address indexed beneficiary,
                                                      uint256 value,
                                                      uint256 amount
                                                  );
                                              
                                                  // 支持为别人购买
                                                  function buyTokens( address _beneficiary ) 
                                                  public 
                                                  payable // 接收支付
                                                  returns (bool)
                                                  {
                                                      require(direct_drop_switch);
                                                      require(_beneficiary != address(0));
                                              
                                                      // 检查有效期开关
                                                      if( direct_drop_range )
                                                      {
                                                          // 当前时间必须在有效期内
                                                          // solium-disable-next-line security/no-block-members
                                                          require(block.timestamp >= direct_drop_range_start && block.timestamp <= direct_drop_range_end);
                                              
                                                      }
                                                      
                                                      // 计算根据兑换比例,应该转移的代币数量
                                                      // uint256 tokenAmount = mul(div(msg.value, 10**18), direct_drop_rate);
                                                      
                                                      uint256 tokenAmount = div(mul(msg.value,direct_drop_rate ), 10**18); //此处用 18次方,这是 wei to  ether 的换算,不是代币的,所以不用 decimals,先乘后除,否则可能为零
                                                      uint256 decimalsAmount = mul( 10**uint256(decimals), tokenAmount);
                                                      
                                                      // 首先检查代币发放账户余额
                                                      require
                                                      (
                                                          balances[direct_drop_address] >= decimalsAmount
                                                      );
                                              
                                                      assert
                                                      (
                                                          decimalsAmount > 0
                                                      );
                                              
                                                      
                                                      // 然后开始转账
                                                      uint256 all = add(balances[direct_drop_address], balances[_beneficiary]);
                                              
                                                      balances[direct_drop_address] = sub(balances[direct_drop_address], decimalsAmount);
                                              
                                                      // @lock
                                                      // 添加锁仓相关检查 
                                                      // solium-disable-next-line security/no-block-members
                                                      if(lockInfo[direct_drop_address].amount > 0 && block.timestamp < lockInfo[direct_drop_address].release_time)
                                                          require(balances[direct_drop_address] >= lockInfo[direct_drop_address].amount);
                                              
                                                          
                                              
                                                      balances[_beneficiary] = add(balances[_beneficiary], decimalsAmount);
                                                      
                                                      assert
                                                      (
                                                          all == add(balances[direct_drop_address], balances[_beneficiary])
                                                      );
                                              
                                                      // 发送事件
                                                      emit TokenPurchase
                                                      (
                                                          msg.sender,
                                                          _beneficiary,
                                                          msg.value,
                                                          tokenAmount
                                                      );
                                              
                                                      return true;
                                              
                                                  } 
                                                  
                                              
                                                   // ========= 空投相关逻辑 ===============
                                                  bool public air_drop_switch = true; // 是否开启空投 @eachvar
                                                  uint256 public air_drop_rate = 88888; // 赠送的代币枚数,这个其实不是rate,直接是数量 @eachvar
                                                  address public air_drop_address = 0xeCA9eEea4B0542514e35833Df15830dC0108Ea20; // 用于发放空投代币的账户 @eachvar
                                                  uint256 public air_drop_count = 0; // 每个账户可以参加的次数 @eachvar
                                              
                                                  mapping(address => uint256) airdrop_times; // 用于记录参加次数的mapping
                                              
                                                  bool public air_drop_range = true; // 是否启用空投有效期 @eachvar
                                                  uint256 public air_drop_range_start = 1562921160; // 有效期开始 @eachvar
                                                  uint256 public air_drop_range_end = 3803445960; // 有效期结束 @eachvar
                                              
                                                  event TokenGiven
                                                  (
                                                      address indexed sender,
                                                      address indexed beneficiary,
                                                      uint256 value,
                                                      uint256 amount
                                                  );
                                              
                                                  // 也可以帮别人领取
                                                  function airDrop( address _beneficiary ) 
                                                  public 
                                                  payable // 接收支付
                                                  returns (bool)
                                                  {
                                                      require(air_drop_switch);
                                                      require(_beneficiary != address(0));
                                                      // 检查有效期开关
                                                      if( air_drop_range )
                                                      {
                                                          // 当前时间必须在有效期内
                                                          // solium-disable-next-line security/no-block-members
                                                          require(block.timestamp >= air_drop_range_start && block.timestamp <= air_drop_range_end);
                                              
                                                      }
                                              
                                                      // 检查受益账户参与空投的次数
                                                      if( air_drop_count > 0 )
                                                      {
                                                          require
                                                          ( 
                                                              airdrop_times[_beneficiary] <= air_drop_count 
                                                          );
                                                      }
                                                      
                                                      // 计算根据兑换比例,应该转移的代币数量
                                                      uint256 tokenAmount = air_drop_rate;
                                                      uint256 decimalsAmount = mul(10**uint256(decimals), tokenAmount);// 转移代币时还要乘以小数位
                                                      
                                                      // 首先检查代币发放账户余额
                                                      require
                                                      (
                                                          balances[air_drop_address] >= decimalsAmount
                                                      );
                                              
                                                      assert
                                                      (
                                                          decimalsAmount > 0
                                                      );
                                              
                                                      
                                                      
                                                      // 然后开始转账
                                                      uint256 all = add(balances[air_drop_address], balances[_beneficiary]);
                                              
                                                      balances[air_drop_address] = sub(balances[air_drop_address], decimalsAmount);
                                              
                                                      // @lock
                                                      // 添加锁仓相关检查 
                                                      // solium-disable-next-line security/no-block-members
                                                      if(lockInfo[air_drop_address].amount > 0 && block.timestamp < lockInfo[air_drop_address].release_time)
                                                          require(balances[air_drop_address] >= lockInfo[air_drop_address].amount);
                                                      
                                                      balances[_beneficiary] = add(balances[_beneficiary], decimalsAmount);
                                                      
                                                      assert
                                                      (
                                                          all == add(balances[air_drop_address], balances[_beneficiary])
                                                      );
                                              
                                                      // 发送事件
                                                      emit TokenGiven
                                                      (
                                                          msg.sender,
                                                          _beneficiary,
                                                          msg.value,
                                                          tokenAmount
                                                      );
                                              
                                                      return true;
                                              
                                                  }
                                                  
                                                  // ========== 代码销毁相关逻辑 ================
                                                  event Burn(address indexed burner, uint256 value);
                                              
                                                  function burn(uint256 _value) public 
                                                  {
                                                      _burn(msg.sender, _value);
                                                  }
                                              
                                                  function _burn(address _who, uint256 _value) internal 
                                                  {
                                                      require(_value <= balances[_who]);
                                                      
                                                      balances[_who] = sub(balances[_who], _value);
                                              
                                                      //@lock
                                                      // 添加锁仓相关检查 
                                                      // solium-disable-next-line security/no-block-members
                                                      if(lockInfo[_who].amount > 0 && block.timestamp < lockInfo[_who].release_time)
                                                          require(balances[_who] >= lockInfo[_who].amount);
                                                          
                                              
                                                      totalSupply = sub(totalSupply, _value);
                                                      emit Burn(_who, _value);
                                                      emit Transfer(_who, address(0), _value);
                                                  }
                                                  
                                                  //@lock
                                                  // ========== 锁仓相关逻辑 ================
                                                  // 定义锁仓信息
                                                  struct LockAccount 
                                                  {
                                                      // address account ; // 锁仓地址
                                                      uint256 amount ; // 锁定数额
                                                      uint256 release_time ; // 释放时间
                                                  }
                                              
                                                  mapping(address => LockAccount) public lockInfo;
                                              
                                                  // 这是一个内部函数,供构造函数添加锁仓账户用
                                                  function _add_lock_account(address _lock_address, uint256 _amount, uint256 _release_time) internal
                                                  {
                                                      // 添加锁仓账户
                                                      // 只在该地址的锁定额度为0时进行添加,确保锁仓地址不能被修改(即使是管理员也不能)
                                                      if( lockInfo[_lock_address].amount == 0 )
                                                          lockInfo[_lock_address] = LockAccount( _amount , _release_time);
                                                  }
                                                  
                                                  // ============== admin 相关函数 ==================
                                                  modifier admin_only()
                                                  {
                                                      require(msg.sender==admin_address);
                                                      _;
                                                  }
                                              
                                                  function setAdmin( address new_admin_address ) 
                                                  public 
                                                  admin_only 
                                                  returns (bool)
                                                  {
                                                      require(new_admin_address != address(0));
                                                      admin_address = new_admin_address;
                                                      return true;
                                                  }
                                              
                                                  // 空投管理
                                                  function setAirDrop( bool status )
                                                  public
                                                  admin_only
                                                  returns (bool)
                                                  {
                                                      air_drop_switch = status;
                                                      return true;
                                                  }
                                                  
                                                  // 直投管理
                                                  function setDirectDrop( bool status )
                                                  public
                                                  admin_only
                                                  returns (bool)
                                                  {
                                                      direct_drop_switch = status;
                                                      return true;
                                                  }
                                                  
                                                  // ETH提现
                                                  function withDraw()
                                                  public
                                                  {
                                                      // 管理员和之前设定的提现账号可以发起提现,但钱一定是进提现账号
                                                      require(msg.sender == admin_address || msg.sender == direct_drop_withdraw_address);
                                                      require(address(this).balance > 0);
                                                      // 全部转到直投提现中
                                                      direct_drop_withdraw_address.transfer(address(this).balance);
                                                  }
                                                      // ======================================
                                                  /// 默认函数
                                                  function () external payable
                                                  {
                                                                      if( msg.value > 0 )
                                                          buyTokens(msg.sender);
                                                      else
                                                          airDrop(msg.sender); 
                                                      
                                                      
                                                      
                                                         
                                                  }
                                              
                                                  // ========== 公用函数 ===============
                                                  // 主要就是 safemath
                                                  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) 
                                                  {
                                                      if (a == 0) 
                                                      {
                                                          return 0;
                                                      }
                                              
                                                      c = a * b;
                                                      assert(c / a == b);
                                                      return c;
                                                  }
                                              
                                                  function div(uint256 a, uint256 b) internal pure returns (uint256) 
                                                  {
                                                      return a / b;
                                                  }
                                              
                                                  function sub(uint256 a, uint256 b) internal pure returns (uint256) 
                                                  {
                                                      assert(b <= a);
                                                      return a - b;
                                                  }
                                              
                                                  function add(uint256 a, uint256 b) internal pure returns (uint256 c) 
                                                  {
                                                      c = a + b;
                                                      assert(c >= a);
                                                      return c;
                                                  }
                                              
                                              }