Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.01 KB | None | 0 0
  1. pragma solidity ^ 0.5.11;
  2. contract ColorToken{
  3. BondContract public bondContract;
  4. ResolveContract public resolveContract;
  5. address lastGateway;
  6. address communityResolve;
  7. address THIS = address(this);
  8.  
  9. string public name = "Color Token";
  10. string public symbol = "RGB";
  11. uint8 constant public decimals = 18;
  12. uint _totalSupply;
  13. uint public _totalBonds;
  14. uint masternodeFee = 10; // 10%
  15.  
  16. mapping(address => address payable) proxy;
  17. mapping(address => address payable) proxyOwner;
  18.  
  19. mapping(address => uint256) redBonds;
  20. mapping(address => uint256) greenBonds;
  21. mapping(address => uint256) blueBonds;
  22.  
  23. mapping(address => uint256) redResolves;
  24. mapping(address => uint256) greenResolves;
  25. mapping(address => uint256) blueResolves;
  26.  
  27. mapping(address => mapping(address => uint)) approvals;
  28.  
  29. mapping(address => address) gateway;
  30. mapping(address => uint256) public pocket;
  31. mapping(address => uint256) public upline;
  32. mapping(address => address) public minecart;
  33.  
  34. mapping(address => address) public votingFor;
  35. mapping(address => uint256) public votesFor;
  36.  
  37. constructor(address _bondContract) public{
  38. bondContract = BondContract( _bondContract );
  39. resolveContract = ResolveContract( bondContract.getResolveContract() );
  40. communityResolve = msg.sender;
  41. lastGateway = THIS;
  42. }
  43.  
  44. function totalSupply() public view returns (uint256) {
  45. return _totalSupply;
  46. }
  47. function balanceOf(address addr) public view returns (uint balance) {
  48. return PyramidProxy( proxy[addr] ).getBalance();
  49. }
  50. function max1(uint x) internal pure returns (uint){
  51. if(x>1e12)
  52. return 1e12;
  53. else
  54. return x;
  55. }
  56. /*function proxy(address addr) returns(PyramidProxy){
  57. proxies[proxyID[addr]]
  58. }*/
  59. function ensureProxy(address addr) internal{
  60. if( proxy[addr] == 0x0000000000000000000000000000000000000000){
  61. PyramidProxy prox = new PyramidProxy( this, bondContract );
  62. proxy[addr] = address(prox);
  63. proxyOwner[ address(prox) ] = address(uint160(addr));
  64. }
  65. }
  66. event Buy( address indexed addr, uint256 spent, uint256 bonds, uint red, uint green, uint blue);
  67.  
  68. function buy(uint ETH, uint _red, uint _green, uint _blue, bool EMIT) internal returns(uint bondsCreated){
  69. address sender = msg.sender;
  70. ensureProxy(sender);
  71. _red = max1(_red);
  72. _green = max1(_green);
  73. _blue = max1(_blue);
  74. uint fee = ETH / masternodeFee;
  75. uint eth4Bonds = ETH - fee;
  76.  
  77. address payable proxyAddr = proxyAddress(sender);
  78. proxyAddr.transfer(eth4Bonds);
  79. uint createdBonds = PyramidProxy( proxyAddr ).buy();/**/
  80. _totalBonds += createdBonds;
  81. bondsAddColor(sender,createdBonds, _red, _green, _blue);
  82.  
  83. pocket[ gateway[sender] ] += fee/2;
  84. upline[ gateway[sender] ] += (fee/2)-(fee/2)/5;
  85. pocket[ THIS ] += (fee/2)/5;
  86. pushMinecart();
  87.  
  88. if( EMIT ){
  89. emit Buy( sender, ETH, createdBonds, _red, _green, _blue);
  90. }
  91.  
  92. if( bondBalance( sender ) > 10000*1e12 ){
  93. lastGateway = sender;
  94. }
  95. return createdBonds;/**/
  96. }
  97. function buy(uint _red, uint _green, uint _blue, address MASTERNODE) payable public returns(uint bondsCreated){
  98. if( bondBalance( MASTERNODE ) >= 10000*1e12 ){
  99. gateway[msg.sender] = MASTERNODE;
  100. }else{
  101. gateway[msg.sender] = lastGateway;
  102. }
  103. return buy( msg.value, _red, _green, _blue, true);
  104. }
  105. function pushMinecart() public{
  106. pushMinecart(msg.sender);
  107. }
  108.  
  109. function pushMinecart(address addr) public{
  110. if(gateway[addr] == 0x0000000000000000000000000000000000000000 || bondBalance( gateway[addr] ) < 10000*1e12){
  111. gateway[addr] = lastGateway;
  112. }
  113. if( minecart[addr] == THIS || minecart[addr] == 0x0000000000000000000000000000000000000000){
  114. minecart[addr] = addr;
  115. }else{
  116. minecart[addr] = gateway[ minecart[addr] ];
  117. }
  118. address dropOff = minecart[addr];
  119. uint up = upline[ dropOff ];
  120. pocket[ dropOff ] += up/5;
  121. upline[ gateway[dropOff] ] += up - up/5 ;
  122. upline[ dropOff ] = 0;/**/
  123. }
  124.  
  125. event Sell( address indexed addr, uint256 bondsSold, uint256 resolves, uint red, uint green, uint blue);
  126. function sell(uint amountToSell) public{
  127. address sender = msg.sender;
  128. uint bondsBefore = bondBalance(sender);
  129. (uint _red, uint _green, uint _blue) = RGB_bondRatio();
  130. uint mintedResolves = PyramidProxy( proxyAddress(sender) ).sell(amountToSell);
  131. _totalBonds -= amountToSell;
  132. /*uint _red = redBonds[sender] / bondsBefore;
  133. uint _green = greenBonds[sender] / bondsBefore;
  134. uint _blue = blueBonds[sender] / bondsBefore;*/
  135. resolvesAddColor(sender, mintedResolves, _red, _green, _blue);
  136. votesFor[ votingFor[sender] ] += mintedResolves;
  137. _totalSupply += mintedResolves;
  138. emit Sell(sender, amountToSell, mintedResolves, _red, _green, _blue );
  139.  
  140. bondsThinColor(msg.sender, bondsBefore - amountToSell, bondsBefore);
  141. pushMinecart();
  142. }
  143. function stake(uint amountToStake) public{
  144. address sender = msg.sender;
  145. PyramidProxy( proxyAddress(sender) ).stake( amountToStake );
  146. colorShift(sender, address(bondContract), amountToStake );
  147. pushMinecart();
  148. }
  149. function unstake(uint amountToUnstake) public{
  150. address sender = msg.sender;
  151. PyramidProxy(proxy[sender]).unstake( amountToUnstake );
  152. colorShift(address(bondContract), sender, amountToUnstake );
  153. pushMinecart();
  154. }/**/
  155. function reinvest(uint amount) public{
  156. address sender = msg.sender;
  157. //address proxyAddr = proxyAddress( sender );
  158. //uint bal = bondContract.balanceOf( proxyAddr );
  159. /*uint red = redBonds[sender] / bal;
  160. uint green = greenBonds[sender] / bal;
  161. uint blue = blueBonds[sender] / bal;*/
  162. (uint red, uint green, uint blue) = RGB_bondRatio();
  163.  
  164. uint createdBonds;
  165. uint dissolvedResolves;
  166. (createdBonds, dissolvedResolves) = PyramidProxy( proxyAddress(sender) ).reinvest(amount);
  167.  
  168. createdBonds += buy( pocket[sender], red, green, blue, false);
  169. _totalBonds += createdBonds;
  170. pocket[sender] = 0;
  171.  
  172. bondsAddColor(sender, createdBonds, red, green, blue);
  173. // update core contract's Resolve color
  174. address pyrAddr = address(bondContract);
  175. uint currentResolves = resolveContract.balanceOf( pyrAddr );
  176. resolvesThinColor(pyrAddr, currentResolves, currentResolves + dissolvedResolves);
  177. pushMinecart();
  178. }
  179. function withdraw(uint amount) public{
  180. address payable sender = msg.sender;
  181. uint dissolvedResolves = PyramidProxy(proxy[sender]).withdraw(amount);
  182. uint earned = pocket[sender];
  183. pocket[sender] = 0;
  184. sender.transfer( earned );
  185. // update core contract's Resolve color
  186. address pyrAddr = address(bondContract);
  187. uint currentResolves = resolveContract.balanceOf( pyrAddr );
  188. resolvesThinColor(pyrAddr, currentResolves, currentResolves + dissolvedResolves);
  189. pushMinecart();
  190. }
  191.  
  192. function proxyAddress(address addr) public view returns(address payable addressOfProxxy){
  193. return proxy[addr];//address( proxies[ proxyID[addr] ] );
  194. }
  195. function getProxyOwner(address proxyAddr) public view returns(address ownerAddress){
  196. return proxyOwner[proxyAddr];
  197. }
  198. function unbindResolves(uint amount) public {
  199. address sender = msg.sender;
  200. uint totalResolves = resolveContract.balanceOf( proxyAddress(sender) );
  201. resolvesThinColor( sender, totalResolves - amount, totalResolves);
  202. PyramidProxy( proxyAddress(sender) ).transfer(sender, amount);
  203. }
  204. function setVotingFor(address candidate) public {
  205. address sender = msg.sender;
  206. //Contracts can't vote for anyone. Because then people would just evenly split the pool fund most of the time
  207. require( !isContract(sender) );//This could be enhanced, but this is a barebones demonstration of the powhr of resolve tokens
  208. uint voteWeight = balanceOf(sender);
  209. votesFor[ votingFor[ sender ] ] -= voteWeight;
  210. votingFor[ sender ] = candidate;
  211. votesFor[ candidate ] += voteWeight;
  212. }
  213. function assertNewCommunityResolve(address candidate) public {
  214. if( votesFor[candidate] > votesFor[communityResolve] ){
  215. communityResolve = candidate;
  216. }
  217. }
  218.  
  219. function GET_FUNDED() public{
  220. if(msg.sender == communityResolve){
  221. uint money_gotten = pocket[ THIS ];
  222. pocket[ THIS ] = 0;
  223. msg.sender.transfer(money_gotten);
  224. pushMinecart();
  225. }
  226. }
  227.  
  228. // Function that is called when a user or another contract wants to transfer funds .
  229. function transfer(address _to, uint _value, bytes memory _data) public returns (bool success) {
  230. if( balanceOf(msg.sender) < _value ) revert();
  231. if( isContract(_to) ){
  232. return transferToContract(_to, _value, _data);
  233. }else{
  234. return transferToAddress(_to, _value, _data);
  235. }
  236. }
  237.  
  238. // Standard function transfer similar to ERC20 transfer with no _data .
  239. // Added due to backwards compatibility reasons .
  240. function transfer(address _to, uint _value) public returns (bool success) {
  241. if (balanceOf(msg.sender) < _value) revert();
  242. //standard function transfer similar to ERC20 transfer with no _data
  243. //added due to backwards compatibility reasons
  244. bytes memory empty;
  245. if(isContract(_to)){
  246. return transferToContract(_to, _value, empty);
  247. }else{
  248. return transferToAddress(_to, _value, empty);
  249. }
  250. }
  251.  
  252. //assemble the given address bytecode. If bytecode exists then the _addr is a contract.
  253. function isContract(address _addr) public view returns (bool is_contract) {
  254. uint length = 0;
  255. assembly {
  256. //retrieve the size of the code on target address, this needs assembly
  257. length := extcodesize(_addr)
  258. }
  259. if(length>0) {
  260. return true;
  261. }else {
  262. return false;
  263. }
  264. }
  265.  
  266. //function that is called when transaction target is an address
  267. function transferToAddress(address _to, uint _value, bytes memory _data) private returns (bool success) {
  268. moveTokens(msg.sender,_to,_value);
  269. return true;
  270. }
  271.  
  272. //function that is called when transaction target is a contract
  273. function transferToContract(address _to, uint _value, bytes memory _data) private returns (bool success) {
  274. moveTokens(msg.sender,_to,_value);
  275. ERC223ReceivingContract reciever = ERC223ReceivingContract(_to);
  276. reciever.tokenFallback(msg.sender, _value, _data);
  277. return true;
  278. }
  279.  
  280. function moveTokens(address _from, address _to, uint _amount) internal{
  281. colorShift(_from, _to, _amount);
  282. ensureProxy(_to);
  283.  
  284. votesFor[ votingFor[_from] ] -= _amount;
  285. votesFor[ votingFor[_to] ] += _amount;
  286.  
  287. PyramidProxy(proxy[_from]).transfer( proxyAddress(_to), _amount );
  288. }
  289. function RGB_scale(uint r, uint g, uint b, uint numerator, uint denominator) internal pure returns(uint,uint,uint){
  290. return (r * numerator / denominator, g * numerator / denominator, b * numerator / denominator );
  291. }
  292. function colorShift(address _from, address _to, uint _amount) internal{
  293. //uint bal = proxy[_from].getBalance();
  294. /*uint red_ratio = redResolves[_from] * _amount / bal;
  295. uint green_ratio = greenResolves[_from] * _amount / bal;
  296. uint blue_ratio = blueResolves[_from] * _amount / bal;*/
  297. (uint red_ratio, uint green_ratio, uint blue_ratio) = RGB_scale(redResolves[_from], greenResolves[_from], blueResolves[_from], _amount, PyramidProxy(proxy[_from]).getBalance() );
  298. redResolves[_from] -= red_ratio;
  299. greenResolves[_from] -= green_ratio;
  300. blueResolves[_from] -= blue_ratio;
  301. redResolves[_to] += red_ratio;
  302. greenResolves[_to] += green_ratio;
  303. blueResolves[_to] += blue_ratio;
  304. }
  305.  
  306. function allowance(address src, address guy) public view returns (uint) {
  307. return approvals[src][guy];
  308. }
  309.  
  310. function transferFrom(address src, address dst, uint wad) public returns (bool){
  311. address sender = msg.sender;
  312. require(approvals[src][sender] >= wad);
  313. require(PyramidProxy(proxy[src]).getBalance() >= wad);
  314. if (src != sender) {
  315. approvals[src][sender] -= wad;
  316. }
  317. moveTokens(src,dst,wad);
  318.  
  319. return true;
  320. }
  321. event Approval(address indexed src, address indexed guy, uint wad);
  322. address sender = msg.sender;
  323. function approve(address guy, uint wad) public returns (bool) {
  324. approvals[sender][guy] = wad;
  325.  
  326. emit Approval(sender, guy, wad);
  327.  
  328. return true;
  329. }
  330.  
  331. function resolvesAddColor(address addr, uint amount , uint red, uint green, uint blue) internal{
  332. redResolves[addr] += red * amount;
  333. greenResolves[addr] += green * amount;
  334. blueResolves[addr] += blue * amount;
  335. }
  336. function bondsAddColor(address addr, uint amount , uint red, uint green, uint blue) internal{
  337. redBonds[addr] += red * amount;
  338. greenBonds[addr] += green * amount;
  339. blueBonds[addr] += blue * amount;
  340. }
  341. function resolvesThinColor(address addr, uint newWeight, uint oldWeight) internal{
  342. (redResolves[addr], greenResolves[addr], blueResolves[addr]) = RGB_scale(redResolves[addr], greenResolves[addr], blueResolves[addr], newWeight, oldWeight);
  343. /*redResolves[addr] = redResolves[addr] * newWeight / oldWeight;
  344. greenResolves[addr] = greenResolves[addr] * newWeight / oldWeight;
  345. blueResolves[addr] = blueResolves[addr] * newWeight / oldWeight; */
  346. }
  347. function bondsThinColor(address addr, uint newWeight, uint oldWeight) internal{
  348. (redBonds[addr], greenBonds[addr], blueBonds[addr]) = RGB_scale(redBonds[addr], greenBonds[addr], blueBonds[addr], newWeight, oldWeight);
  349. /*redBonds[addr] = redBonds[addr] * newWeight / oldWeight;
  350. greenBonds[addr] = greenBonds[addr] * newWeight / oldWeight;
  351. blueBonds[addr] = blueBonds[addr] * newWeight / oldWeight; */
  352. }
  353. function RGB_bondRatio() public view returns(uint,uint,uint){
  354. //uint bonds = bondBalance(msg.sender);
  355. return RGB_bondRatio(msg.sender);//(redBonds[sender]/bonds, greenBonds[sender]/bonds, blueBonds[sender]/bonds);
  356. }
  357. function RGB_bondRatio(address addr) public view returns(uint,uint,uint){
  358. uint bonds = bondBalance(addr);
  359. return (redBonds[sender]/bonds, greenBonds[sender]/bonds, blueBonds[sender]/bonds);
  360. }
  361. function RGB_resolveRatio(address addr) public view returns(uint,uint,uint){
  362. uint resolves = balanceOf(addr);
  363. return (redResolves[sender]/resolves, greenResolves[sender]/resolves, blueResolves[sender]/resolves);
  364. }
  365. function () payable external {
  366. if (msg.value > 0) {
  367. //address sender = msg.sender;
  368. //uint totalHoldings = bondBalance(msg.sender);
  369. (uint _red , uint _green, uint _blue) = RGB_bondRatio();
  370. /*redBonds[sender]/totalHoldings;
  371. = greenBonds[sender]/totalHoldings;
  372. = blueBonds[sender]/totalHoldings;*/
  373. buy(_red, _green, _blue, lastGateway);
  374. } else {
  375. withdraw( bondContract.resolveEarnings( proxyAddress(msg.sender) ) );
  376. }
  377. }
  378.  
  379. function bondBalance(address addr) public view returns(uint){
  380. return bondContract.balanceOf( proxyAddress(addr) );
  381. }
  382. /*event BondTransfer(address from, address to, uint amount, uint red, uint green, uint blue);
  383. function bondTransfer(address to, uint amount) public{
  384. address sender = msg.sender;
  385. uint sendersFormerTotalBonds = bondBalance(sender);
  386. bondsThinColor( sender, sendersFormerTotalBonds - amount, sendersFormerTotalBonds);
  387. (uint r, uint g, uint b) = RGB_bondRatio(sender);
  388. bondsAddColor( to, amount, r, g, b );
  389. PyramidProxy(proxy[sender]).bondTransfer( proxyAddress(to) , amount);
  390. emit BondTransfer(sender, to, amount, r, g, b);
  391. }*/
  392. }
  393.  
  394.  
  395. contract BondContract{
  396. function balanceOf(address _owner) public view returns (uint256 balance);
  397. function sellBonds(uint amount) public returns(uint,uint);
  398. function getResolveContract() public view returns(address);
  399. function pullResolves(uint amount) public;
  400. function reinvestEarnings(uint amountFromEarnings) public returns(uint,uint);
  401. function withdraw(uint amount) public returns(uint);
  402. function fund() payable public returns(uint);
  403. function resolveEarnings(address _owner) public view returns (uint256 amount);
  404. //function bondTransfer( address to, uint amount ) public;
  405. }
  406.  
  407. contract ResolveContract{
  408. function balanceOf(address _owner) public view returns (uint256 balance);
  409. function transfer(address _to, uint _value) public returns (bool success);
  410. }
  411.  
  412. contract PyramidProxy{
  413. ColorToken router;
  414. BondContract public bondContract;
  415. ResolveContract public resolveContract;
  416. uint ETH;
  417. address THIS = address(this);
  418.  
  419. constructor(ColorToken _router, BondContract _BondContract) public{
  420. router = _router;
  421. bondContract = _BondContract;
  422. resolveContract = ResolveContract( _BondContract.getResolveContract() );
  423. }
  424.  
  425. modifier routerOnly{
  426. require(msg.sender == address(router));
  427. _;
  428. }
  429. function () payable external{
  430. //ETH += msg.value;
  431. }
  432.  
  433. function buy() public routerOnly() returns(uint){
  434. //uint _ETH = ETH;
  435. //ETH = 0;
  436. return bondContract.fund.value( THIS.balance )();
  437. }
  438. function cash2Owner() internal{
  439. address payable owner = address(uint160( router.getProxyOwner( THIS ) ) );
  440. //uint _ETH = ETH;
  441. //ETH = 0;
  442. owner.transfer( THIS.balance );
  443. }
  444. function getBalance() public view returns (uint balance) {
  445. address bC = address(bondContract);
  446. if( THIS == bC ){
  447. return resolveContract.balanceOf( bC );
  448. }else{
  449. return resolveContract.balanceOf( THIS );
  450. }
  451. }
  452. /*function resolveEarnings() internal view returns(uint){
  453. return bondContract.resolveEarnings( THIS );
  454. }*/
  455. function reinvest(uint amount) public routerOnly() returns(uint,uint){
  456. return bondContract.reinvestEarnings( amount );
  457. }
  458. function withdraw(uint amount) public routerOnly() returns(uint){
  459. uint dissolvedResolves = bondContract.withdraw( amount );
  460. cash2Owner();
  461. return dissolvedResolves;
  462. }
  463. function sell(uint amount) public routerOnly() returns (uint){
  464. uint resolves;
  465. (,resolves) = bondContract.sellBonds(amount);
  466. cash2Owner();
  467. return resolves;
  468. }
  469.  
  470. function stake(uint amount) public routerOnly(){
  471. resolveContract.transfer( address(bondContract), amount );
  472. }
  473. function transfer(address addr, uint amount) public routerOnly(){
  474. resolveContract.transfer( addr, amount );
  475. }
  476. /*function bondTransfer(address to, uint amount) public routerOnly(){
  477. bondContract.bondTransfer( to, amount );
  478. }*/
  479. function unstake(uint amount) public routerOnly(){
  480. bondContract.pullResolves( amount );
  481. }
  482. }
  483.  
  484. contract ERC223ReceivingContract{
  485. function tokenFallback(address _from, uint _value, bytes calldata _data) external;
  486. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement