Address Contract Partially Verified
Address
0xe5AD1a7C9ecfd77C856c211Fd5df26a04a72c365
Balance
0 ETH
Nonce
1
Code Size
20379 bytes
Creator
0x724C4191...5576 at tx 0x69a1200d...725602
Indexed Transactions
0 (1 on-chain, 1.7% indexed)
Contract Bytecode
20379 bytes
0x6080604052600436106103905760003560e01c80637a0b0bf4116101dc578063b7d2bce711610102578063d4ee1d90116100a0578063eb876dc91161006f578063eb876dc914610a1f578063f2fde38b14610a3f578063f366635514610a5f578063f78efd0614610a7f5761039a565b8063d4ee1d90146109b5578063dc73e49c146109ca578063e1e03134146109df578063eb310933146109ff5761039a565b8063bc3c9195116100dc578063bc3c91951461093d578063c31c9c071461096b578063cc06c35914610980578063cf746c56146109955761039a565b8063b7d2bce7146108e8578063b98b677f146108fd578063bbfcbd031461091d5761039a565b8063883e8f0c1161017a5780639a1c9f3b116101495780639a1c9f3b146108685780639ebd68e214610888578063a61c9f00146108a8578063b2596a67146108c85761039a565b8063883e8f0c146107f1578063894f0ccf1461081e5780638da5cb5b14610833578063996bc292146108485761039a565b80637cd07e47116101b65780637cd07e471461077c5780637ecebe00146107915780637fc96d6b146107b1578063855f0924146107d15761039a565b80637a0b0bf4146107195780637bc03a71146107395780637c9e0abb146107675761039a565b80633297215a116102c1578063575cea6b1161025f5780635dfc014f1161022e5780635dfc014f146106a457806362d58c87146106c4578063631db75b146106e457806379ba5097146107045761039a565b8063575cea6b1461062457806358b1b151146106445780635a39f7f3146106645780635aad6cf0146106845761039a565b80633a0f4a211161029b5780633a0f4a21146105a25780634aed47cf146105b75780634b759088146105d757806354ed7da3146105f75761039a565b80633297215a14610563578063348d4487146105785780633644e5151461058d5761039a565b80631cbfd1571161032e57806328e8696a1161030857806328e8696a146104e35780632a355f7c146105035780632c2602c21461052357806330bbcefe146105435761039a565b80631cbfd157146104835780631faf7efe146104a357806323858d01146104c35761039a565b806306427cc11161036a57806306427cc1146104175780630ca3b92114610437578063164547541461044c5780631aa3a0081461046e5761039a565b806301ee22531461039f57806303f809ab146103d5578063042b435d146103f75761039a565b3661039a57600080fd5b600080fd5b3480156103ab57600080fd5b506103bf6103ba366004613fff565b610a9f565b6040516103cc9190614652565b60405180910390f35b3480156103e157600080fd5b506103f56103f0366004614225565b610ad7565b005b34801561040357600080fd5b506103f5610412366004613f5e565b610b36565b34801561042357600080fd5b506103f5610432366004614225565b610c36565b34801561044357600080fd5b506103bf610c8c565b34801561045857600080fd5b50610461610c92565b6040516103cc9190614545565b34801561047a57600080fd5b506103bf610cb6565b34801561048f57600080fd5b506103f561049e366004613f5e565b610cca565b3480156104af57600080fd5b506103f56104be366004614453565b610de3565b3480156104cf57600080fd5b506103f56104de366004614303565b610f3d565b3480156104ef57600080fd5b506103f56104fe366004613f5e565b611239565b34801561050f57600080fd5b506103f561051e366004613f78565b61131e565b34801561052f57600080fd5b506103f561053e366004613fb3565b611534565b34801561054f57600080fd5b506103f561055e366004614225565b6115ee565b34801561056f57600080fd5b506103bf611644565b34801561058457600080fd5b506103bf61164a565b34801561059957600080fd5b506103bf611650565b3480156105ae57600080fd5b506103bf611674565b3480156105c357600080fd5b506104616105d2366004614225565b611698565b3480156105e357600080fd5b506103bf6105f2366004613f5e565b6116c0565b34801561060357600080fd5b50610617610612366004614225565b6116d2565b6040516103cc91906145f1565b34801561063057600080fd5b5061061761063f366004613f5e565b611735565b34801561065057600080fd5b506103f561065f366004614280565b6117b6565b34801561067057600080fd5b506103f561067f366004614161565b611b02565b34801561069057600080fd5b5061046161069f366004614225565b611ea4565b3480156106b057600080fd5b506103bf6106bf366004613f5e565b611edb565b3480156106d057600080fd5b506103bf6106df366004613f5e565b611f0a565b3480156106f057600080fd5b506103f56106ff366004614028565b611f3f565b34801561071057600080fd5b506103f5611faa565b34801561072557600080fd5b506103f561073436600461405b565b612064565b34801561074557600080fd5b50610759610754366004614225565b6121be565b6040516103cc929190614640565b34801561077357600080fd5b506103bf6121eb565b34801561078857600080fd5b506104616121f1565b34801561079d57600080fd5b506103bf6107ac366004613f5e565b61220d565b3480156107bd57600080fd5b506103f56107cc366004613f5e565b61221f565b3480156107dd57600080fd5b506103f56107ec366004614225565b612304565b3480156107fd57600080fd5b5061081161080c366004613f5e565b6124d7565b6040516103cc9190614635565b34801561082a57600080fd5b506104616128fc565b34801561083f57600080fd5b50610461612918565b34801561085457600080fd5b506103f5610863366004613f5e565b612934565b34801561087457600080fd5b506103f5610883366004613fff565b612ac7565b34801561089457600080fd5b506103f56108a3366004614389565b612b1d565b3480156108b457600080fd5b506103f56108c336600461409e565b612c84565b3480156108d457600080fd5b506103bf6108e3366004614225565b612dd2565b3480156108f457600080fd5b506103bf612df3565b34801561090957600080fd5b506103f5610918366004613f5e565b612e17565b34801561092957600080fd5b506103f5610938366004614280565b612efc565b34801561094957600080fd5b5061095d610958366004614225565b61318f565b6040516103cc929190614d90565b34801561097757600080fd5b506104616131b5565b34801561098c57600080fd5b506103bf6131d1565b3480156109a157600080fd5b506103bf6109b0366004614225565b6131d7565b3480156109c157600080fd5b506104616131e9565b3480156109d657600080fd5b50610461613205565b3480156109eb57600080fd5b506104616109fa366004613f5e565b613221565b348015610a0b57600080fd5b506103f5610a1a366004614255565b613296565b348015610a2b57600080fd5b506103f5610a3a36600461435a565b61343c565b348015610a4b57600080fd5b506103f5610a5a366004613f5e565b613533565b348015610a6b57600080fd5b506103f5610a7a366004614225565b6135f3565b348015610a8b57600080fd5b506103bf610a9a366004614225565b613649565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a602090815260408083208484529091529020545b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614778565b60405180910390fd5b601655565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a6020908152604080832083805290915290205480610b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614cdd565b601454610bc390839073ffffffffffffffffffffffffffffffffffffffff1683613762565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600d6020526040902054610bf39082613884565b73ffffffffffffffffffffffffffffffffffffffff9092166000908152600d6020908152604080832094909455600a815283822082805290529182209190915550565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614778565b600855565b60075481565b7f000000000000000000000000eb58343b36c7528f23caae63a15024024131004981565b6000610cc5633b9aca01613649565b905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614778565b73ffffffffffffffffffffffffffffffffffffffff8116610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b289061481b565b601480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790556040517fa2633d9172615e769c0e1876085fd82a53a82839b9b46e0c4dafb5033abc5f5e90610dd8908390614545565b60405180910390a150565b60135473ffffffffffffffffffffffffffffffffffffffff163314610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906148e2565b8051825114610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614c23565b60005b8251811015610f3757818181518110610eb4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600e6000858481518110610ef9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000206000868152602001908152602001600020819055508080610f2f90614ebd565b915050610e72565b50505050565b83421115610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614c80565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602052604090205415610fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614ac4565b73ffffffffffffffffffffffffffffffffffffffff851660009081526010602052604081208054908261100683614ebd565b91905055905060007f15e63dc60fe2c70a321d1fe9c17e904fc439c5fae39130dfcda42b33d9d34f567f965f73b57f3777233e641e140ef6fc17fb3dd7594d04c94df9e3bc6f8531614b60001b8989858a60405160200161106b959493929190614699565b6040516020818303038152906040528051906020012060405160200161109292919061450f565b6040516020818303038152906040528051906020012090506000600182878787604051600081526020016040526040516110cf94939291906146d2565b6020604051602081039080840390855afa1580156110f1573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061115b575060135473ffffffffffffffffffffffffffffffffffffffff8281169116145b611191576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614b58565b73ffffffffffffffffffffffffffffffffffffffff881660008181526003602090815260408083208d90558c835260049091529081902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016909217909155517f9b3dfe78e39f5f2ee4309cc14cec54f21b60b233ea16119151c1ace450dcfe4b906112269083908c908c90889061458c565b60405180910390a1505050505050505050565b60135473ffffffffffffffffffffffffffffffffffffffff16331461128a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906148e2565b73ffffffffffffffffffffffffffffffffffffffff81166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b289061481b565b601380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60175460011461135a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906149f9565b600060178190556040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516906370a08231906113b3903090600401614545565b60206040518083038186803b1580156113cb57600080fd5b505afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611403919061423d565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600d60205260409020549091506114368383614e7a565b101561146e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b289061499c565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360209081526040808320548084526009909252909120546114ab575060005b73ffffffffffffffffffffffffffffffffffffffff85166000908152600a602090815260408083208484529091529020546114e690846138cd565b73ffffffffffffffffffffffffffffffffffffffff9095166000818152600a6020908152604080832094835293815283822097909755908152600d9095529093209290925550506001601755565b60005b815181101561159c5761158a8383838151811061157d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613916565b8061159481614ebd565b915050611537565b503360009081526003602090815260408083205473ffffffffffffffffffffffffffffffffffffffff86168452600a835281842081855290925290912054156115e9576115e98382613916565b505050565b60135473ffffffffffffffffffffffffffffffffffffffff16331461163f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906148e2565b600255565b60165481565b60025481565b7f15e63dc60fe2c70a321d1fe9c17e904fc439c5fae39130dfcda42b33d9d34f5681565b7f48b1ff889c9b587c3e7ddba4a9f57008181c3ed75eabbc6f2fefb3a62e987e9581565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60036020526000908152604090205481565b6000818152600b602090815260409182902080548351818402810184019094528084526060939283018282801561172857602002820191906000526020600020905b815481526020019060010190808311611714575b505050505090505b919050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360209081526040808320548352600b82529182902080548351818402810184019094528084526060939283018282801561172857602002820191906000526020600020908154815260200190600101908083116117145750505050509050919050565b834211156117f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614c80565b73ffffffffffffffffffffffffffffffffffffffff861660009081526010602052604081208054908261182283614ebd565b91905055905060007f15e63dc60fe2c70a321d1fe9c17e904fc439c5fae39130dfcda42b33d9d34f567f48b1ff889c9b587c3e7ddba4a9f57008181c3ed75eabbc6f2fefb3a62e987e9560001b8a8a8a60405160200161188291906144bd565b60405160208183030381529060405280519060200120868b6040516020016118af9695949392919061465b565b604051602081830303815290604052805190602001206040516020016118d692919061450f565b60405160208183030381529060405280519060200120905060006001828787876040516000815260200160405260405161191394939291906146d2565b6020604051602081039080840390855afa158015611935573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061199f575060135473ffffffffffffffffffffffffffffffffffffffff8281169116145b6119d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614b58565b73ffffffffffffffffffffffffffffffffffffffff891660008181526003602090815260408083208e90558d83526004909152812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169092179091555b8851811015611ab85760008b8152600b6020526040902089518a9083908110611a87577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091018101518254600181018455600093845291909220015580611ab081614ebd565b915050611a35565b507f9b3dfe78e39f5f2ee4309cc14cec54f21b60b233ea16119151c1ace450dcfe4b818b8b86604051611aee949392919061458c565b60405180910390a150505050505050505050565b60135473ffffffffffffffffffffffffffffffffffffffff163314611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906148e2565b60025415611b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614a30565b8251845114611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614c23565b60005b8451811015611e9d576000858281518110611c0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050848281518110611c52577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091018101516000838152600990925260408220558451859084908110611ca8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614611de2578060036000868581518110611d09577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550838281518110611d88577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000838381518110611e1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101511115611e8a57828281518110611e64577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091018101516000838152600e8352604080822082805290935291909120555b5080611e9581614ebd565b915050611bcb565b5050505050565b60128181548110611eb457600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812054610ad190613649565b73ffffffffffffffffffffffffffffffffffffffff166000908152600360209081526040808320548352600990915290205490565b60005b8151811015611fa657611f94828281518110611f87577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610b36565b80611f9e81614ebd565b915050611f42565b5050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611fce57600080fd5b6001546000805460405173ffffffffffffffffffffffffffffffffffffffff93841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b33600090815260036020526040812054905b8351811015610f37576120c98482815181106120bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015184613916565b6000600a6000868481518110612108577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000205411156121ac576121ac84828151811061219e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183613916565b806121b681614ebd565b915050612076565b6000908152600f60209081526040808320838052909152808220546001835291205460ff91821692911690565b60085481565b60135473ffffffffffffffffffffffffffffffffffffffff1681565b60106020526000908152604090205481565b60005473ffffffffffffffffffffffffffffffffffffffff163314612270576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614778565b73ffffffffffffffffffffffffffffffffffffffff81166122bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614bec565b601580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314612355576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614778565b6012805461236590600190614e7a565b8154811061239c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000918252602090912001546012805473ffffffffffffffffffffffffffffffffffffffff90921691839081106123fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601280548061247c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550565b600073ffffffffffffffffffffffffffffffffffffffff82166124fc57506000611730565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000eb58343b36c7528f23caae63a15024024131004916906370a0823190612571908690600401614545565b60206040518083038186803b15801561258957600080fd5b505afa15801561259d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c1919061423d565b905060005b6012548110156126d7576126c36012828154811061260d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000918252602090912001546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906370a082319061266c908890600401614545565b60206040518083038186803b15801561268457600080fd5b505afa158015612698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126bc919061423d565b83906138cd565b9150806126cf81614ebd565b9150506125c6565b506008548110156126ec576000915050611730565b6040805160028082526060820183526000926020830190803683370190505090507f000000000000000000000000eb58343b36c7528f23caae63a15024024131004981600081518110612768577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526015548251911690829060019081106127cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526011546040517fd06ca61f000000000000000000000000000000000000000000000000000000008152600092919091169063d06ca61f906128379086908690600401614d3a565b60006040518083038186803b15801561284f57600080fd5b505afa158015612863573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526128a991908101906140d1565b6001815181106128e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506016548110159350505050919050565b60145473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314612985576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614778565b60005b601254811015612a4f578173ffffffffffffffffffffffffffffffffffffffff16601282815481106129e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415612a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614a8d565b80612a4781614ebd565b915050612988565b50601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612ad18282613916565b3360009081526003602090815260408083205473ffffffffffffffffffffffffffffffffffffffff86168452600a835281842081855290925290912054156115e9576115e98382613916565b60135473ffffffffffffffffffffffffffffffffffffffff163314612b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906148e2565b8051825114612ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614c23565b60005b8251811015610f3757818181518110612bee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600f6000858481518110612c33577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001908152602001600020600086815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612c7c90614ebd565b915050612bac565b60005473ffffffffffffffffffffffffffffffffffffffff163314612cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614778565b6000805b8251811015612d4257828181518110612d1b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015182612d2e9190614dec565b915080612d3a81614ebd565b915050612cd9565b5080606414612d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614885565b8151612d90906005906020850190613dfc565b5081516006556040517f98336ae56b2204abd6eaef3ab21aa1ab22406a9e8cb90e6e0cec5114ec1e74b490612dc69084906145f1565b60405180910390a15050565b60058181548110612de257600080fd5b600091825260209091200154905081565b7f965f73b57f3777233e641e140ef6fc17fb3dd7594d04c94df9e3bc6f8531614b81565b60005473ffffffffffffffffffffffffffffffffffffffff163314612e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614778565b73ffffffffffffffffffffffffffffffffffffffff8116612eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614bec565b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b83421115612f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614c80565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260106020526040812080549082612f6883614ebd565b91905055905060007f15e63dc60fe2c70a321d1fe9c17e904fc439c5fae39130dfcda42b33d9d34f567f48b1ff889c9b587c3e7ddba4a9f57008181c3ed75eabbc6f2fefb3a62e987e9560001b8a8a8a604051602001612fc891906144bd565b60405160208183030381529060405280519060200120868b604051602001612ff59695949392919061465b565b6040516020818303038152906040528051906020012060405160200161301c92919061450f565b60405160208183030381529060405280519060200120905060006001828787876040516000815260200160405260405161305994939291906146d2565b6020604051602081039080840390855afa15801561307b573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906130e5575060135473ffffffffffffffffffffffffffffffffffffffff8281169116145b61311b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614b58565b73ffffffffffffffffffffffffffffffffffffffff891660008181526003602090815260408083208e90558d83526004825280832080547fffffffffffffffffffffffff000000000000000000000000000000000000000016909417909355600b81529190208951611ab8928b0190613dfc565b6000908152600e6020908152604080832083805290915280822054600183529120549091565b60115473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b60009081526009602052604090205490565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60155473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602090815260408083205483526009909152812054633b9aca0181101561326a576000915050611730565b60009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff169050611730565b60135473ffffffffffffffffffffffffffffffffffffffff1633146132e7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906148e2565b73ffffffffffffffffffffffffffffffffffffffff8116613334576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b289061481b565b600082815260096020526040902054633b9aca011161337f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614b21565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040902054156133dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614ac4565b73ffffffffffffffffffffffffffffffffffffffff166000818152600360209081526040808320859055938252600490529190912080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b60135473ffffffffffffffffffffffffffffffffffffffff16331461348d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906148e2565b6000828152600b6020908152604090912082516134ac92840190613dfc565b5060005b81518110156115e9576000838152600b602052604090208251839083908110613502577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810291909101810151825460018101845560009384529190922001558061352b81614ebd565b9150506134b0565b60005473ffffffffffffffffffffffffffffffffffffffff163314613584576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614778565b60015473ffffffffffffffffffffffffffffffffffffffff828116911614156135ac57600080fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314613644576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614778565b600755565b3360009081526003602052604081205415613690576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614b8f565b6000828152600960205260409020546136d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614850565b60006002600081546136e690614ebd565b91829055503360008181526003602090815260408083208590558483526004825280832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690941790935560098152828220879055868252600b8152918120805460018101825590825291902001819055915050919050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401613794929190614566565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516137e291906144f3565b6000604051808303816000865af19150503d806000811461381f576040519150601f19603f3d011682016040523d82523d6000602084013e613824565b606091505b509150915081801561384e57508051158061384e57508080602001905181019061384e9190614209565b611e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614741565b60006138c683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b76565b9392505050565b6000806138da8385614dec565b9050838110156138c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906147ad565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a6020908152604080832084845290915290205461397d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906147e4565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a60209081526040808320848452909152812054906139bc8484848480613bc7565b9050600654811015613b04576000815b600654811015613a3a5760058181548110613a10577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015482613a269190614dec565b915080613a3281614ebd565b9150506139cc565b5060006064613a498386614e3d565b613a539190614e04565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a60209081526040808320838052909152902054909150613a9190826138cd565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a602090815260408083208380529091529081902091909155517fcb8ef0fcfbe24855ccb42f2ec553b8f4c8a766080de85215d7a3dfacf1f2795590613af9908890889085906145c3565b60405180910390a150505b7f0d01c94d0df28276fb43f8bfa77a79b387742823fa1189417aca8b82afff7701848484604051613b37939291906145c3565b60405180910390a1505073ffffffffffffffffffffffffffffffffffffffff9091166000908152600a6020908152604080832093835292905290812055565b60008184841115613bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2891906146f0565b50613bbf8385614e7a565b949350505050565b60006006548310613bdb5750600654613d94565b600754821115613bec575081613d94565b600085815260096020526040902054633b9aca01811015613c105783915050613d94565b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16613c3e816124d7565b15613d775760006064613c9e60058881548110613c84577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015489613d9d90919063ffffffff16565b613ca89190614e04565b9050613cb5898383613762565b73ffffffffffffffffffffffffffffffffffffffff89166000908152600d6020526040902054613ce59082613884565b73ffffffffffffffffffffffffffffffffffffffff8a166000908152600d60205260409081902091909155517f83a6edf49fbee87a7414e24715d11decb49603bb26ef52a0c8e829d576d1231890613d42908b90869085906145c3565b60405180910390a1613d6d898489613d598a614ebd565b995089613d658a614ebd565b995089613bc7565b9350505050613d94565b613d8f88838888613d8789614ebd565b985088613bc7565b925050505b95945050505050565b600082613dac57506000610ad1565b6000613db88385614e3d565b905082613dc58583614e04565b146138c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b289061493f565b828054828255906000526020600020908101928215613e37579160200282015b82811115613e37578251825591602001919060010190613e1c565b50613e43929150613e47565b5090565b5b80821115613e435760008155600101613e48565b803573ffffffffffffffffffffffffffffffffffffffff8116811461173057600080fd5b600082601f830112613e90578081fd5b81356020613ea5613ea083614dc8565b614d9e565b8281528181019085830183850287018401881015613ec1578586fd5b855b85811015613ee657613ed482613e5c565b84529284019290840190600101613ec3565b5090979650505050505050565b600082601f830112613f03578081fd5b81356020613f13613ea083614dc8565b8281528181019085830183850287018401881015613f2f578586fd5b855b85811015613ee657813584529284019290840190600101613f31565b803560ff8116811461173057600080fd5b600060208284031215613f6f578081fd5b6138c682613e5c565b600080600060608486031215613f8c578182fd5b613f9584613e5c565b9250613fa360208501613e5c565b9150604084013590509250925092565b60008060408385031215613fc5578182fd5b613fce83613e5c565b9150602083013567ffffffffffffffff811115613fe9578182fd5b613ff585828601613ef3565b9150509250929050565b60008060408385031215614011578182fd5b61401a83613e5c565b946020939093013593505050565b600060208284031215614039578081fd5b813567ffffffffffffffff81111561404f578182fd5b613bbf84828501613e80565b6000806040838503121561406d578182fd5b823567ffffffffffffffff811115614083578283fd5b61408f85828601613e80565b95602094909401359450505050565b6000602082840312156140af578081fd5b813567ffffffffffffffff8111156140c5578182fd5b613bbf84828501613ef3565b600060208083850312156140e3578182fd5b825167ffffffffffffffff8111156140f9578283fd5b8301601f81018513614109578283fd5b8051614117613ea082614dc8565b8181528381019083850185840285018601891015614133578687fd5b8694505b83851015614155578051835260019490940193918501918501614137565b50979650505050505050565b60008060008060808587031215614176578182fd5b843567ffffffffffffffff8082111561418d578384fd5b61419988838901613ef3565b955060208701359150808211156141ae578384fd5b6141ba88838901613ef3565b945060408701359150808211156141cf578384fd5b6141db88838901613e80565b935060608701359150808211156141f0578283fd5b506141fd87828801613ef3565b91505092959194509250565b60006020828403121561421a578081fd5b81516138c681614f54565b600060208284031215614236578081fd5b5035919050565b60006020828403121561424e578081fd5b5051919050565b60008060408385031215614267578182fd5b8235915061427760208401613e5c565b90509250929050565b600080600080600080600060e0888a03121561429a578485fd5b873596506142aa60208901613e5c565b9550604088013567ffffffffffffffff8111156142c5578586fd5b6142d18a828b01613ef3565b955050606088013593506142e760808901613f4d565b925060a0880135915060c0880135905092959891949750929550565b60008060008060008060c0878903121561431b578384fd5b8635955061432b60208801613e5c565b94506040870135935061434060608801613f4d565b92506080870135915060a087013590509295509295509295565b6000806040838503121561436c578182fd5b82359150602083013567ffffffffffffffff811115613fe9578182fd5b60008060006060848603121561439d578081fd5b8335925060208085013567ffffffffffffffff808211156143bc578384fd5b6143c888838901613ef3565b945060408701359150808211156143dd578384fd5b508501601f810187136143ee578283fd5b80356143fc613ea082614dc8565b81815283810190838501858402850186018b1015614418578687fd5b8694505b8385101561444357803561442f81614f54565b83526001949094019391850191850161441c565b5080955050505050509250925092565b600080600060608486031215614467578081fd5b83359250602084013567ffffffffffffffff80821115614485578283fd5b61449187838801613ef3565b935060408601359150808211156144a6578283fd5b506144b386828701613ef3565b9150509250925092565b815160009082906020808601845b838110156144e7578151855293820193908201906001016144cb565b50929695505050505050565b60008251614505818460208701614e91565b9190910192915050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9485168152602081019390935292166040820152606081019190915260800190565b73ffffffffffffffffffffffffffffffffffffffff9390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b818110156146295783518352928401929184019160010161460d565b50909695505050505050565b901515815260200190565b91151582521515602082015260400190565b90815260200190565b958652602086019490945273ffffffffffffffffffffffffffffffffffffffff9290921660408501526060840152608083015260a082015260c00190565b948552602085019390935273ffffffffffffffffffffffffffffffffffffffff9190911660408401526060830152608082015260a00190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252825180602084015261470f816040850160208701614e91565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b6020808252818101527f4f776e61626c653a2043616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526016908201527f556e646973747269627574656420666565206973203000000000000000000000604082015260600190565b6020808252818101527f4e696d62757320526566657272616c3a2041646472657373206973207a65726f604082015260600190565b6020808252818101527f4e696d62757320526566657272616c3a204e6f20737563682073706f6e736f72604082015260600190565b60208082526025908201527f4e696d62757320526566657272616c3a2057726f6e67206c6576656c7320616d60408201527f6f756e7473000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602b908201527f4e696d62757320526566657272616c3a2063616c6c6572206973206e6f74207460408201527f6865206d69677261746f72000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f4e696d62757320526566657272616c3a2042616c616e636520636865636b206660408201527f61696c6564000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600e908201527f4e696d6275733a204c4f434b4544000000000000000000000000000000000000604082015260600190565b6020808252602c908201527f4e696d62757320526566657272616c3a204261736963206d6967726174696f6e60408201527f2069732066696e69736865640000000000000000000000000000000000000000606082015260800190565b6020808252600b908201527f506f6f6c20657869737473000000000000000000000000000000000000000000604082015260600190565b60208082526031908201527f4e696d62757320526566657272616c3a204164647265737320697320616c726560408201527f61647920696e207468652073797374656d000000000000000000000000000000606082015260800190565b6020808252601d908201527f4e696d62757320526566657272616c3a204e6f20737563682075736572000000604082015260600190565b60208082526019908201527f4e696d6275733a20494e56414c49445f5349474e415455524500000000000000604082015260600190565b60208082526023908201527f4e696d62757320526566657272616c3a20416c7265616479207265676973746560408201527f7265640000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600f908201527f41646472657373206973207a65726f0000000000000000000000000000000000604082015260600190565b60208082526028908201527f4e696d62757320526566657272616c3a20446966666572656e7420617272617960408201527f206c656e67746873000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f4e696d62757320526566657272616c3a207369676e617475726520657870697260408201527f6564000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526036908201527f4e696d62757320526566657272616c3a204e6f20756e636c61696d656420667560408201527f6e647320666f722073656c656374656420746f6b656e00000000000000000000606082015260800190565b60006040820184835260206040818501528185518084526060860191508287019350845b81811015613ee657845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101614d5e565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715614dc057614dc0614f25565b604052919050565b600067ffffffffffffffff821115614de257614de2614f25565b5060209081020190565b60008219821115614dff57614dff614ef6565b500190565b600082614e38577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e7557614e75614ef6565b500290565b600082821015614e8c57614e8c614ef6565b500390565b60005b83811015614eac578181015183820152602001614e94565b83811115610f375750506000910152565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614eef57614eef614ef6565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8015158114614f6257600080fd5b5056fea2646970667358221220f02fa63223540570d3b7d0236123c2af5bc64b63f2b9a1c28ca4307c49ae236464736f6c63430008000033
Verified Source Code Partial Match
Compiler: v0.8.0+commit.c7dfd78e
EVM: istanbul
Optimization: Yes (999999 runs)
NimbusReferralProgram.sol 539 lines
pragma solidity =0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract Ownable {
address public owner;
address public newOwner;
event OwnershipTransferred(address indexed from, address indexed to);
constructor() {
owner = msg.sender;
emit OwnershipTransferred(address(0), owner);
}
modifier onlyOwner {
require(msg.sender == owner, "Ownable: Caller is not the owner");
_;
}
function transferOwnership(address transferOwner) public onlyOwner {
require(transferOwner != newOwner);
newOwner = transferOwner;
}
function acceptOwnership() virtual public {
require(msg.sender == newOwner);
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
newOwner = address(0);
}
}
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
interface INimbusReferralProgram {
function userSponsorByAddress(address user) external view returns (uint);
function userIdByAddress(address user) external view returns (uint);
function userSponsorAddressByAddress(address user) external view returns (address);
}
interface INimbusStakingPool {
function balanceOf(address account) external view returns (uint256);
}
interface INimbusRouter {
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}
contract NimbusReferralProgram is INimbusReferralProgram, Ownable {
using SafeMath for uint;
uint public lastUserId;
mapping(address => uint) public override userIdByAddress;
mapping(uint => address) public userAddressById;
uint[] public levels;
uint public maxLevel;
uint public maxLevelDepth;
uint public minTokenAmountForCheck;
mapping(uint => uint) private _userSponsor;
mapping(address => mapping(uint => uint)) private _undistributedFees;
mapping(uint => uint[]) private _userReferrals;
mapping(uint => bool) private _networkBonus;
mapping(address => uint) private _recordedBalances;
mapping(uint => mapping(uint => uint)) private _legacyBalances;
mapping(uint => mapping(uint => bool)) private _legacyBalanceStatus;
bytes32 public immutable DOMAIN_SEPARATOR;
// keccak256("UpdateUserAddressBySig(uint256 id,address user,uint256 nonce,uint256 deadline)");
bytes32 public constant UPDATE_ADDRESS_TYPEHASH = 0x965f73b57f3777233e641e140ef6fc17fb3dd7594d04c94df9e3bc6f8531614b;
// keccak256("UpdateUserDataBySig(uint256 id,address user,bytes32 refHash,uint256 nonce,uint256 deadline)");
bytes32 public constant UPDATE_DATA_TYPEHASG = 0x48b1ff889c9b587c3e7ddba4a9f57008181c3ed75eabbc6f2fefb3a62e987e95;
mapping(address => uint) public nonces;
IERC20 public immutable NBU;
INimbusRouter public swapRouter;
INimbusStakingPool[] public stakingPools;
address public migrator;
address public specialReserveFund;
address public swapToken;
uint public swapTokenAmountForFeeDistributionThreshold;
event DistributeFees(address token, uint userId, uint amount);
event DistributeFeesForUser(address token, uint recipientId, uint amount);
event ClaimEarnedFunds(address token, uint userId, uint unclaimedAmount);
event TransferToNimbusSpecialReserveFund(address token, uint fromUserId, uint undistributedAmount);
event UpdateLevels(uint[] newLevels);
event UpdateSpecialReserveFund(address newSpecialReserveFund);
event MigrateUserBySign(address signatory, uint userId, address userAddress, uint nonce);
uint private unlocked = 1;
modifier lock() {
require(unlocked == 1, 'Nimbus: LOCKED');
unlocked = 0;
_;
unlocked = 1;
}
constructor(address migratorAddress, address nbu) {
migrator = migratorAddress;
levels = [40, 20, 13, 10, 10, 7];
maxLevel = 6;
NBU = IERC20(nbu);
minTokenAmountForCheck = 10 * 10 ** 18;
maxLevelDepth = 25;
uint chainId;
assembly {
chainId := chainid()
}
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
keccak256(bytes("NimbusReferralProgram")),
keccak256(bytes('1')),
chainId,
address(this)
)
);
}
receive() payable external {
revert();
}
modifier onlyMigrator() {
require(msg.sender == migrator, "Nimbus Referral: caller is not the migrator");
_;
}
function userSponsorByAddress(address user) external override view returns (uint) {
return _userSponsor[userIdByAddress[user]];
}
function userSponsor(uint user) external view returns (uint) {
return _userSponsor[user];
}
function userSponsorAddressByAddress(address user) external override view returns (address) {
uint sponsorId = _userSponsor[userIdByAddress[user]];
if (sponsorId < 1000000001) return address(0);
else return userAddressById[sponsorId];
}
function getUserReferrals(uint userId) external view returns (uint[] memory) {
return _userReferrals[userId];
}
function getUserReferrals(address user) external view returns (uint[] memory) {
return _userReferrals[userIdByAddress[user]];
}
function getLegacyBalance(uint id) external view returns (uint NBU_USDT, uint GNBU_USDT) {
NBU_USDT = _legacyBalances[id][0];
GNBU_USDT = _legacyBalances[id][1];
}
function getLegacyBalanceProcessStatus(uint id) external view returns (bool NBU_USDT, bool GNBU_USDT) {
NBU_USDT = _legacyBalanceStatus[id][0];
GNBU_USDT = _legacyBalanceStatus[id][1];
}
function undistributedFees(address token, uint userId) external view returns (uint) {
return _undistributedFees[token][userId];
}
function registerBySponsorAddress(address sponsorAddress) external returns (uint) {
return registerBySponsorId(userIdByAddress[sponsorAddress]);
}
function register() public returns (uint) {
return registerBySponsorId(1000000001);
}
function registerBySponsorId(uint sponsorId) public returns (uint) {
require(userIdByAddress[msg.sender] == 0, "Nimbus Referral: Already registered");
require(_userSponsor[sponsorId] != 0, "Nimbus Referral: No such sponsor");
uint id = ++lastUserId; //gas saving
userIdByAddress[msg.sender] = id;
userAddressById[id] = msg.sender;
_userSponsor[id] = sponsorId;
_userReferrals[sponsorId].push(id);
return id;
}
function recordFee(address token, address recipient, uint amount) external lock {
uint actualBalance = IERC20(token).balanceOf(address(this));
require(actualBalance - amount >= _recordedBalances[token], "Nimbus Referral: Balance check failed");
uint uiserId = userIdByAddress[recipient];
if (_userSponsor[uiserId] == 0) uiserId = 0;
_undistributedFees[token][uiserId] = _undistributedFees[token][uiserId].add(amount);
_recordedBalances[token] = actualBalance;
}
function distributeEarnedFees(address token, uint userId) external {
distributeFees(token, userId);
uint callerId = userIdByAddress[msg.sender];
if (_undistributedFees[token][callerId] > 0) distributeFees(token, callerId);
}
function distributeEarnedFees(address token, uint[] memory userIds) external {
for (uint i; i < userIds.length; i++) {
distributeFees(token, userIds[i]);
}
uint callerId = userIdByAddress[msg.sender];
if (_undistributedFees[token][callerId] > 0) distributeFees(token, callerId);
}
function distributeEarnedFees(address[] memory tokens, uint userId) external {
uint callerId = userIdByAddress[msg.sender];
for (uint i; i < tokens.length; i++) {
distributeFees(tokens[i], userId);
if (_undistributedFees[tokens[i]][callerId] > 0) distributeFees(tokens[i], callerId);
}
}
function distributeFees(address token, uint userId) private {
require(_undistributedFees[token][userId] > 0, "Undistributed fee is 0");
uint amount = _undistributedFees[token][userId];
uint level = transferToSponsor(token, userId, amount, 0, 0);
if (level < maxLevel) {
uint undistributedPercentage;
for (uint ii = level; ii < maxLevel; ii++) {
undistributedPercentage += levels[ii];
}
uint undistributedAmount = amount * undistributedPercentage / 100;
_undistributedFees[token][0] = _undistributedFees[token][0].add(undistributedAmount);
emit TransferToNimbusSpecialReserveFund(token, userId, undistributedAmount);
}
emit DistributeFees(token, userId, amount);
_undistributedFees[token][userId] = 0;
}
function transferToSponsor(address token, uint userId, uint amount, uint level, uint levelGuard) private returns (uint) {
if (level >= maxLevel) return maxLevel;
if (levelGuard > maxLevelDepth) return level;
uint sponsorId = _userSponsor[userId];
if (sponsorId < 1000000001) return level;
address sponsorAddress = userAddressById[sponsorId];
if (isUserBalanceEnough(sponsorAddress)) {
uint bonusAmount = amount.mul(levels[level]) / 100;
TransferHelper.safeTransfer(token, sponsorAddress, bonusAmount);
_recordedBalances[token] = _recordedBalances[token].sub(bonusAmount);
emit DistributeFeesForUser(token, sponsorId, bonusAmount);
return transferToSponsor(token, sponsorId, amount, ++level, ++levelGuard);
} else {
return transferToSponsor(token, sponsorId, amount, level, ++levelGuard);
}
}
function isUserBalanceEnough(address user) public view returns (bool) {
if (user == address(0)) return false;
uint amount = NBU.balanceOf(user);
for (uint i; i < stakingPools.length; i++) {
amount = amount.add(stakingPools[i].balanceOf(user));
}
if (amount < minTokenAmountForCheck) return false;
address[] memory path = new address[](2);
path[0] = address(NBU);
path[1] = swapToken;
uint tokenAmount = swapRouter.getAmountsOut(amount, path)[1];
return tokenAmount >= swapTokenAmountForFeeDistributionThreshold;
}
function claimSpecialReserveFundBatch(address[] memory tokens) external {
for (uint i; i < tokens.length; i++) {
claimSpecialReserveFund(tokens[i]);
}
}
function claimSpecialReserveFund(address token) public {
uint amount = _undistributedFees[token][0];
require(amount > 0, "Nimbus Referral: No unclaimed funds for selected token");
TransferHelper.safeTransfer(token, specialReserveFund, amount);
_recordedBalances[token] = _recordedBalances[token].sub(amount);
_undistributedFees[token][0] = 0;
}
function migrateUsers(uint[] memory ids, uint[] memory sponsorId, address[] memory userAddress, uint[] memory nbuUsdt) external onlyMigrator {
require(lastUserId == 0, "Nimbus Referral: Basic migration is finished");
require(ids.length == sponsorId.length, "Nimbus Referral: Different array lengths");
for (uint i; i < ids.length; i++) {
uint id = ids[i];
_userSponsor[id] = sponsorId[i];
if (userAddress[i] != address(0)) {
userIdByAddress[userAddress[i]] = id;
userAddressById[id] = userAddress[i];
}
if (nbuUsdt[i] > 0) _legacyBalances[id][0] = nbuUsdt[i];
}
}
function updateUserLegacyBalances(uint currencyId, uint[] memory ids, uint[] memory balances) external onlyMigrator {
require(ids.length == balances.length, "Nimbus Referral: Different array lengths");
for (uint i; i < ids.length; i++) {
_legacyBalances[ids[i]][currencyId] = balances[i];
}
}
function updateUserLegacyBalanceStatuses(uint currencyId, uint[] memory ids, bool[] memory status) external onlyMigrator {
require(ids.length == status.length, "Nimbus Referral: Different array lengths");
for (uint i; i < ids.length; i++) {
_legacyBalanceStatus[ids[i]][currencyId] = status[i];
}
}
function updateUserAddress(uint id, address userAddress) external onlyMigrator {
require(userAddress != address(0), "Nimbus Referral: Address is zero");
require(_userSponsor[id] < 1000000001, "Nimbus Referral: No such user");
require(userIdByAddress[userAddress] == 0, "Nimbus Referral: Address is already in the system");
userIdByAddress[userAddress] = id;
userAddressById[id] = userAddress;
}
function updateUserAddressBySig(uint id, address userAddress, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
require(block.timestamp <= deadline, "Nimbus Referral: signature expired");
require(userIdByAddress[userAddress] == 0, "Nimbus Referral: Address is already in the system");
uint nonce = nonces[userAddress]++;
bytes32 digest = keccak256(
abi.encodePacked(
'\x19\x01',
DOMAIN_SEPARATOR,
keccak256(abi.encode(UPDATE_ADDRESS_TYPEHASH, id, userAddress, nonce, deadline))
)
);
address recoveredAddress = ecrecover(digest, v, r, s);
require(recoveredAddress != address(0) && recoveredAddress == migrator, 'Nimbus: INVALID_SIGNATURE');
userIdByAddress[userAddress] = id;
userAddressById[id] = userAddress;
emit MigrateUserBySign(recoveredAddress, id, userAddress, nonce);
}
function updateUserDataBySig(uint id, address userAddress, uint[] memory referrals, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
require(block.timestamp <= deadline, "Nimbus Referral: signature expired");
uint nonce = nonces[userAddress]++;
bytes32 digest = keccak256(
abi.encodePacked(
'\x19\x01',
DOMAIN_SEPARATOR,
keccak256(abi.encode(UPDATE_DATA_TYPEHASG, id, userAddress, keccak256(abi.encodePacked(referrals)), nonce, deadline))
)
);
address recoveredAddress = ecrecover(digest, v, r, s);
require(recoveredAddress != address(0) && recoveredAddress == migrator, 'Nimbus: INVALID_SIGNATURE');
userIdByAddress[userAddress] = id;
userAddressById[id] = userAddress;
_userReferrals[id] = referrals;
emit MigrateUserBySign(recoveredAddress, id, userAddress, nonce);
}
function updateUserReferralsBySig(uint id, address userAddress, uint[] memory referrals, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
require(block.timestamp <= deadline, "Nimbus Referral: signature expired");
uint nonce = nonces[userAddress]++;
bytes32 digest = keccak256(
abi.encodePacked(
'\x19\x01',
DOMAIN_SEPARATOR,
keccak256(abi.encode(UPDATE_DATA_TYPEHASG, id, userAddress, keccak256(abi.encodePacked(referrals)), nonce, deadline))
)
);
address recoveredAddress = ecrecover(digest, v, r, s);
require(recoveredAddress != address(0) && recoveredAddress == migrator, 'Nimbus: INVALID_SIGNATURE');
userIdByAddress[userAddress] = id;
userAddressById[id] = userAddress;
for (uint i; i < referrals.length; i++) {
_userReferrals[id].push(referrals[i]);
}
emit MigrateUserBySign(recoveredAddress, id, userAddress, nonce);
}
function updateUserReferrals(uint id, uint[] memory referrals) external onlyMigrator {
_userReferrals[id] = referrals;
for (uint i; i < referrals.length; i++) {
_userReferrals[id].push(referrals[i]);
}
}
function updateMigrator(address newMigrator) external onlyMigrator {
require(newMigrator != address(0), "Nimbus Referral: Address is zero");
migrator = newMigrator;
}
function finishBasicMigration(uint userId) external onlyMigrator {
lastUserId = userId;
}
function updateSwapRouter(address newSwapRouter) external onlyOwner {
require(newSwapRouter != address(0), "Address is zero");
swapRouter = INimbusRouter(newSwapRouter);
}
function updateSwapToken(address newSwapToken) external onlyOwner {
require(newSwapToken != address(0), "Address is zero");
swapToken = newSwapToken;
}
function updateSwapTokenAmountForFeeDistributionThreshold(uint threshold) external onlyOwner {
swapTokenAmountForFeeDistributionThreshold = threshold;
}
function updateMaxLevelDepth(uint newMaxLevelDepth) external onlyOwner {
maxLevelDepth = newMaxLevelDepth;
}
function updateMinTokenAmountForCheck(uint newMinTokenAmountForCheck) external onlyOwner {
minTokenAmountForCheck = newMinTokenAmountForCheck;
}
function updateStakingPoolAdd(address newStakingPool) external onlyOwner {
for (uint i; i < stakingPools.length; i++) {
require (address(stakingPools[i]) != newStakingPool, "Pool exists");
}
stakingPools.push(INimbusStakingPool(newStakingPool));
}
function updateStakingPoolRemove(uint poolIndex) external onlyOwner {
stakingPools[poolIndex] = stakingPools[stakingPools.length - 1];
stakingPools.pop();
}
function updateSpecialReserveFund(address newSpecialReserveFund) external onlyOwner {
require(newSpecialReserveFund != address(0), "Nimbus Referral: Address is zero");
specialReserveFund = newSpecialReserveFund;
emit UpdateSpecialReserveFund(newSpecialReserveFund);
}
function updateLevels(uint[] memory newLevels) external onlyOwner {
uint checkSum;
for (uint i; i < newLevels.length; i++) {
checkSum += newLevels[i];
}
require(checkSum == 100, "Nimbus Referral: Wrong levels amounts");
levels = newLevels;
maxLevel = newLevels.length;
emit UpdateLevels(newLevels);
}
}
//helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(address token, address to, uint value) internal {
//bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
}
function safeTransfer(address token, address to, uint value) internal {
//bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
}
function safeTransferFrom(address token, address from, address to, uint value) internal {
//bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
}
function safeTransferETH(address to, uint value) internal {
(bool success,) = to.call{value:value}(new bytes(0));
require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
}
}
Read Contract
DOMAIN_SEPARATOR 0x3644e515 → bytes32
NBU 0x16454754 → address
UPDATE_ADDRESS_TYPEHASH 0xb7d2bce7 → bytes32
UPDATE_DATA_TYPEHASG 0x3a0f4a21 → bytes32
getLegacyBalance 0xbc3c9195 → uint256, uint256
getLegacyBalanceProcessStatus 0x7bc03a71 → bool, bool
getUserReferrals 0x54ed7da3 → uint256[]
getUserReferrals 0x575cea6b → uint256[]
isUserBalanceEnough 0x883e8f0c → bool
lastUserId 0x348d4487 → uint256
levels 0xb2596a67 → uint256
maxLevel 0xcc06c359 → uint256
maxLevelDepth 0x0ca3b921 → uint256
migrator 0x7cd07e47 → address
minTokenAmountForCheck 0x7c9e0abb → uint256
newOwner 0xd4ee1d90 → address
nonces 0x7ecebe00 → uint256
owner 0x8da5cb5b → address
specialReserveFund 0x894f0ccf → address
stakingPools 0x5aad6cf0 → address
swapRouter 0xc31c9c07 → address
swapToken 0xdc73e49c → address
swapTokenAmountForFeeDistributionThreshold 0x3297215a → uint256
undistributedFees 0x01ee2253 → uint256
userAddressById 0x4aed47cf → address
userIdByAddress 0x4b759088 → uint256
userSponsor 0xcf746c56 → uint256
userSponsorAddressByAddress 0xe1e03134 → address
userSponsorByAddress 0x62d58c87 → uint256
Write Contract 30 functions
These functions modify contract state and require a wallet transaction to execute.
acceptOwnership 0x79ba5097
No parameters
claimSpecialReserveFund 0x042b435d
address token
claimSpecialReserveFundBatch 0x631db75b
address[] tokens
distributeEarnedFees 0x2c2602c2
address token
uint256[] userIds
distributeEarnedFees 0x7a0b0bf4
address[] tokens
uint256 userId
distributeEarnedFees 0x9a1c9f3b
address token
uint256 userId
finishBasicMigration 0x30bbcefe
uint256 userId
migrateUsers 0x5a39f7f3
uint256[] ids
uint256[] sponsorId
address[] userAddress
uint256[] nbuUsdt
recordFee 0x2a355f7c
address token
address recipient
uint256 amount
register 0x1aa3a008
No parameters
returns: uint256
registerBySponsorAddress 0x5dfc014f
address sponsorAddress
returns: uint256
registerBySponsorId 0xf78efd06
uint256 sponsorId
returns: uint256
transferOwnership 0xf2fde38b
address transferOwner
updateLevels 0xa61c9f00
uint256[] newLevels
updateMaxLevelDepth 0xf3666355
uint256 newMaxLevelDepth
updateMigrator 0x28e8696a
address newMigrator
updateMinTokenAmountForCheck 0x06427cc1
uint256 newMinTokenAmountForCheck
updateSpecialReserveFund 0x1cbfd157
address newSpecialReserveFund
updateStakingPoolAdd 0x996bc292
address newStakingPool
updateStakingPoolRemove 0x855f0924
uint256 poolIndex
updateSwapRouter 0xb98b677f
address newSwapRouter
updateSwapToken 0x7fc96d6b
address newSwapToken
updateSwapTokenAmountForFeeDistributionThreshold 0x03f809ab
uint256 threshold
updateUserAddress 0xeb310933
uint256 id
address userAddress
updateUserAddressBySig 0x23858d01
uint256 id
address userAddress
uint256 deadline
uint8 v
bytes32 r
bytes32 s
updateUserDataBySig 0xbbfcbd03
uint256 id
address userAddress
uint256[] referrals
uint256 deadline
uint8 v
bytes32 r
bytes32 s
updateUserLegacyBalanceStatuses 0x9ebd68e2
uint256 currencyId
uint256[] ids
bool[] status
updateUserLegacyBalances 0x1faf7efe
uint256 currencyId
uint256[] ids
uint256[] balances
updateUserReferrals 0xeb876dc9
uint256 id
uint256[] referrals
updateUserReferralsBySig 0x58b1b151
uint256 id
address userAddress
uint256[] referrals
uint256 deadline
uint8 v
bytes32 r
bytes32 s
Token Balances (3) $344.50
View Transfers →Recent Transactions
This address has 1 on-chain transactions, but only 1.7% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →