Guest User

Untitled

a guest
Jun 9th, 2026
40
0
Never
5
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.57 KB | None | 0 0
  1. using Oxide.Core.Libraries.Covalence;
  2. using System.Collections.Generic;
  3. using Newtonsoft.Json;
  4. using UnityEngine;
  5. using Oxide.Core;
  6. using System;
  7. using Facepunch;
  8.  
  9. namespace Oxide.Plugins
  10. {
  11. [Info("Recycle", "nivex", "3.2.1")]
  12. [Description("Recycle items into their resources")]
  13. public class Recycle : RustPlugin
  14. {
  15. private const string
  16. RecyclePrefab = "assets/bundled/prefabs/static/recycler_static.prefab",
  17. BackpackPrefab = "assets/prefabs/misc/item drop/item_drop_backpack.prefab",
  18. AdminPermission = "recycle.admin",
  19. RecyclerPermission = "recycle.use",
  20. CooldownBypassPermission = "recycle.bypass";
  21.  
  22. private readonly Dictionary<ulong, DroppedInfo> _droppedContainers = new();
  23. private readonly Dictionary<ulong, RecyclerInfo> _recyclers = new();
  24. private readonly Dictionary<string, long> _cooldowns = new();
  25. private ConfigData config;
  26.  
  27. public class DroppedInfo
  28. {
  29. public DroppedItemContainer container;
  30. public BasePlayer target;
  31. public DroppedInfo(DroppedItemContainer container, BasePlayer target)
  32. {
  33. this.container = container;
  34. this.target = target;
  35. }
  36. }
  37.  
  38. public class RecyclerInfo
  39. {
  40. public Recycler recycler;
  41. public BasePlayer player;
  42. public ItemContainerId id;
  43. public RecyclerInfo(Recycler recycler, BasePlayer player)
  44. {
  45. this.recycler = recycler;
  46. this.player = player;
  47. id = recycler.inventory.uid;
  48. }
  49. }
  50.  
  51. #region Hooks
  52.  
  53. private void Loaded()
  54. {
  55. string recycleCommand = string.IsNullOrEmpty(config.Settings.RecycleCommand) ? "recycle" : config.Settings.RecycleCommand;
  56. AddCovalenceCommand(recycleCommand, "RecycleCommand");
  57. AddCovalenceCommand("purgerecyclers", "PurgeRecyclersCommand");
  58. AddCovalenceCommand("purgebags", "PurgeBagsCommand");
  59. permission.RegisterPermission(AdminPermission, this);
  60. permission.RegisterPermission(RecyclerPermission, this);
  61. permission.RegisterPermission(CooldownBypassPermission, this);
  62. if (!config.Settings.ToInventory) Unsubscribe(nameof(CanMoveItem));
  63. }
  64.  
  65. private void Unload()
  66. {
  67. DestroyRecyclers();
  68. DestroyBags();
  69. }
  70.  
  71. private void OnLootEntityEnd(BasePlayer player, Recycler recycler)
  72. {
  73. if (player != null) DestroyRecycler(player);
  74. }
  75.  
  76. private void OnPlayerDisconnected(BasePlayer player, string reason)
  77. {
  78. if (player == null) return;
  79.  
  80. DestroyRecycler(player);
  81.  
  82. if (_droppedContainers.Count == 0) return;
  83.  
  84. using var tmp = Pool.Get<PooledList<KeyValuePair<ulong, DroppedInfo>>>();
  85. tmp.AddRange(_droppedContainers);
  86.  
  87. foreach (var (uid, val) in tmp)
  88. {
  89. if (!IsValid(val.container) || !IsValid(val.target) || val.target.userID == player.userID)
  90. {
  91. if (IsValid(val.container))
  92. val.container.Kill();
  93.  
  94. _droppedContainers.Remove(uid);
  95. }
  96. }
  97. }
  98.  
  99. private object CanMoveItem(Item item, PlayerInventory inv, ItemContainerId targetContainerId, int targetSlot, int amount)
  100. {
  101. if (targetSlot < 6) return null;
  102.  
  103. foreach (ItemContainer container in inv.loot.containers)
  104. {
  105. if (container.uid != targetContainerId || container.entityOwner == null) continue;
  106.  
  107. if (container.entityOwner is Recycler recycler && IsRecycleBox(recycler)) return false;
  108. }
  109.  
  110. return null;
  111. }
  112.  
  113. private float lastMessageTime;
  114. private object CanAcceptItem(ItemContainer container, Item item, int targetPos)
  115. {
  116. if (container == null || !(container.entityOwner is Recycler recycler)) return null;
  117.  
  118. if (!IsRecycleBox(recycler)) return null;
  119.  
  120. BasePlayer player = PlayerFromRecycler(recycler.net.ID.Value);
  121.  
  122. if (player == null) return null;
  123.  
  124. string type = Enum.GetName(typeof(ItemCategory), item.info.category);
  125.  
  126. if (targetPos < 6)
  127. {
  128. if (!config.Settings.RecyclableTypes.Contains(type) || config.Settings.Blacklist.Contains(item.info.shortname))
  129. {
  130. if (lastMessageTime < Time.time)
  131. {
  132. lastMessageTime = Time.time + 0.1f;
  133. Message(player, "Recycle", "Invalid");
  134. }
  135. return ItemContainer.CanAcceptResult.CannotAcceptRightNow;
  136. }
  137.  
  138. recycler.Invoke(() =>
  139. {
  140. if (recycler.IsOn()) return;
  141.  
  142. if (!recycler.HasRecyclable()) return;
  143.  
  144. float time = config.Settings.InstantRecycling ? 0.0625f : recycler.GetRecycleThinkDuration();
  145.  
  146. recycler.InvokeRepeating(recycler.RecycleThink, time, time);
  147. recycler.SetFlag(BaseEntity.Flags.On, b: true);
  148. recycler.SendNetworkUpdateImmediate();
  149. }, 0.0625f);
  150. }
  151. else if (config.Settings.ToInventory && item.GetOwnerPlayer() == null)
  152. {
  153. if (item.parent != null)
  154. {
  155. return ItemContainer.CanAcceptResult.CannotAcceptRightNow;
  156. }
  157. Item copy = ItemManager.Create(item.info, item.amount, item.skin);
  158. if (player.inventory.GiveItem(copy)) item.Remove();
  159. }
  160.  
  161. return null;
  162. }
  163.  
  164. private object CanLootEntity(BasePlayer player, DroppedItemContainer container)
  165. {
  166. if (container.IsValid() && _droppedContainers.TryGetValue(container.net.ID.Value, out var t) && t.target.userID != player.userID) return true;
  167. return null;
  168. }
  169.  
  170. private void OnEntityKill(DroppedItemContainer container)
  171. {
  172. if (container.IsValid()) _droppedContainers.Remove(container.net.ID.Value);
  173. }
  174.  
  175. private void OnUseNPC(BasePlayer npc, BasePlayer player) // HumanNPC plugin support
  176. {
  177. if (npc == null || !config.Settings.NPCIds.Contains(npc.UserIDString)) return;
  178. OpenRecycler(player);
  179. }
  180.  
  181. #endregion
  182.  
  183. #region Commands
  184.  
  185. private void RecycleCommand(IPlayer user, string command, string[] args)
  186. {
  187. if (CanManageRecyclers(user) && args.Contains("reloadconfig"))
  188. {
  189. LoadConfig();
  190. Message(user, "Recycle", "Reloaded");
  191. }
  192.  
  193. if (config.Settings.NPCOnly)
  194. return;
  195.  
  196. BasePlayer player = user.Object as BasePlayer;
  197.  
  198. if (player == null || !CanPlayerOpenRecycler(player))
  199. return;
  200.  
  201. OpenRecycler(player);
  202.  
  203. if (config.Settings.Cooldown > 0 && !CanBypassCooldown(user))
  204. _cooldowns[player.UserIDString] = DateTimeOffset.Now.ToUnixTimeSeconds() + (long)(config.Settings.Cooldown * 60);
  205. }
  206.  
  207. private void PurgeRecyclersCommand(IPlayer user, string command, string[] args)
  208. {
  209. if (CanManageRecyclers(user))
  210. {
  211. DestroyRecyclers();
  212. Message(user, "Recycle", "DestroyedAll");
  213. }
  214. else Message(user, "Denied", "Permission");
  215. }
  216.  
  217. private void PurgeBagsCommand(IPlayer user, string command, string[] args)
  218. {
  219. if (CanManageRecyclers(user))
  220. {
  221. DestroyBags();
  222. Message(user, "Recycle", "DestroyedAllBags");
  223. }
  224. else Message(user, "Denied", "Permission");
  225. }
  226.  
  227. private void Message(IPlayer user, string top, string bottom)
  228. {
  229. if (user.Object is BasePlayer player)
  230. {
  231. Message(player, top, bottom);
  232. return;
  233. }
  234.  
  235. string message = GetMessage(top, bottom, user.Id);
  236.  
  237. if (string.IsNullOrEmpty(message))
  238. {
  239. return; // set a message value to empty to disable that message
  240. }
  241.  
  242. if (user.IsServer)
  243. {
  244. Puts(message);
  245. }
  246. else
  247. {
  248. user.Message(message);
  249. }
  250. }
  251.  
  252. private void Message(BasePlayer player, string top, string bottom, params object[] args)
  253. {
  254. if (player == null) return;
  255. string message = GetMessage(top, bottom, player.UserIDString);
  256. if (string.IsNullOrEmpty(message)) return;
  257. PrintToChat(player, args.Length > 0 ? string.Format(message, args) : message);
  258. }
  259.  
  260. public bool IsValid(BaseNetworkable e) => e.IsValid() && !e.IsDestroyed;
  261.  
  262. #endregion
  263.  
  264. #region Helpers
  265.  
  266. private Recycler CreateRecycler(BasePlayer player)
  267. {
  268. var recycler = GameManager.server.CreateEntity(RecyclePrefab, player.transform.position.WithY(-5f)) as Recycler;
  269.  
  270. if (recycler == null) return null;
  271.  
  272. recycler.enableSaving = false;
  273. recycler.Spawn();
  274.  
  275. if (!IsValid(recycler)) return null;
  276.  
  277. recycler.radtownRecycleEfficiency = config.Settings.RefundRatio;
  278. recycler.safezoneRecycleEfficiency = config.Settings.RefundRatio;
  279. recycler.SetFlag(BaseEntity.Flags.Locked, true);
  280. recycler.UpdateNetworkGroup();
  281. recycler.gameObject.layer = 0;
  282. recycler.SendNetworkUpdateImmediate();
  283.  
  284. OpenContainer(player, recycler);
  285.  
  286. _recyclers.Add(recycler.net.ID.Value, new(recycler, player));
  287.  
  288. return recycler;
  289. }
  290.  
  291. private void OpenContainer(BasePlayer player, StorageContainer container)
  292. {
  293. player.Invoke(() =>
  294. {
  295. if (container == null || container.IsDestroyed || player.IsDestroyed) return;
  296. player.EndLooting();
  297. if (!player.inventory.loot.StartLootingEntity(container, false)) return;
  298. player.inventory.loot.AddContainer(container.inventory);
  299. player.inventory.loot.SendImmediate();
  300. player.ClientRPC(RpcTarget.Player("RPC_OpenLootPanel", player), container.panelName);
  301. player.SendNetworkUpdate();
  302. }, 0.2f);
  303. }
  304.  
  305. private void DropRecyclerContents(Recycler recycler, BasePlayer player)
  306. {
  307. if (player == null || player.inventory == null || player.inventory.containerMain == null || player.inventory.containerBelt == null) return;
  308. if (recycler == null || recycler.inventory == null || recycler.inventory.itemList.IsNullOrEmpty()) return;
  309.  
  310. using var items = Pool.Get<PooledList<Item>>();
  311.  
  312. items.AddRange(recycler.inventory.itemList);
  313.  
  314. if (config.Settings.InventoryBeforeBag)
  315. {
  316. for (int i = 0; i < items.Count; i++)
  317. {
  318. Item item = items[i];
  319.  
  320. if (player.inventory.GiveItem(item))
  321. {
  322. items.RemoveAt(i);
  323. i--;
  324. }
  325. }
  326. }
  327.  
  328. if (items.Count == 0)
  329. {
  330. return;
  331. }
  332.  
  333. Message(player, "Recycle", "Dropped");
  334.  
  335. var container = GameManager.server.CreateEntity(BackpackPrefab, player.transform.position + Vector3.up) as DroppedItemContainer;
  336.  
  337. if (container == null) return;
  338.  
  339. container.enableSaving = false;
  340. container.lootPanelName = "generic_resizable";
  341. container.playerSteamID = player.userID;
  342. container.TakeFrom(new[] { recycler.inventory }, 0f);
  343. container.Spawn();
  344.  
  345. if (IsValid(container))
  346. {
  347. _droppedContainers[container.net.ID.Value] = new(container, player);
  348. }
  349. }
  350.  
  351. private void DestroyRecycler(BasePlayer player)
  352. {
  353. Recycler recycler = RecyclerFromPlayer(player.userID);
  354.  
  355. if (IsValid(recycler) && _recyclers.TryGetValue(recycler.net.ID.Value, out var t))
  356. {
  357. DropRecyclerContents(recycler, t.player);
  358. _recyclers.Remove(recycler.net.ID.Value);
  359. recycler.Kill();
  360. }
  361. }
  362.  
  363. private void DestroyRecyclers()
  364. {
  365. if (_recyclers.Count == 0) return;
  366. using var tmp = Pool.Get<PooledList<RecyclerInfo>>();
  367. tmp.AddRange(_recyclers.Values);
  368. foreach (var val in tmp)
  369. {
  370. if (IsValid(val.recycler))
  371. {
  372. DropRecyclerContents(val.recycler, val.player);
  373. val.recycler.Kill();
  374. }
  375. }
  376. _recyclers.Clear();
  377. }
  378.  
  379. private void DestroyBags()
  380. {
  381. if (_droppedContainers.Count == 0) return;
  382. using var tmp = Pool.Get<PooledList<DroppedInfo>>();
  383. tmp.AddRange(_droppedContainers.Values);
  384. foreach (var val in tmp)
  385. {
  386. if (IsValid(val.container))
  387. {
  388. val.container.Kill();
  389. }
  390. }
  391. _droppedContainers.Clear();
  392. }
  393.  
  394. private string GetMessage(string top, string bottom, string userid)
  395. {
  396. return lang.GetMessage(top + " -> " + bottom, this, userid);
  397. }
  398.  
  399. private int[] GetCooldown(string userid)
  400. {
  401. if (!_cooldowns.TryGetValue(userid, out var time)) return Array.Empty<int>();
  402.  
  403. long now = DateTimeOffset.Now.ToUnixTimeSeconds();
  404.  
  405. if (now > time) return Array.Empty<int>();
  406.  
  407. TimeSpan diff = TimeSpan.FromSeconds(time - DateTimeOffset.Now.ToUnixTimeSeconds());
  408.  
  409. return new int[] { diff.Minutes, diff.Seconds };
  410. }
  411.  
  412. private string CooldownTimesToString(int[] times, BasePlayer player)
  413. {
  414. if (times == null || times.Length != 2) return string.Empty;
  415.  
  416. int mins = times[0], secs = times[1];
  417.  
  418. return (string.Format(
  419. mins == 0 ? string.Empty : ("{0} " + GetMessage("Timings", mins == 1 ? "minute" : "minutes", player.UserIDString)), mins) +
  420. string.Format(" {0} " + GetMessage("Timings", secs == 1 ? "second" : "seconds", player.UserIDString), secs)
  421. ).Trim();
  422. }
  423.  
  424. #endregion
  425.  
  426. #region API
  427.  
  428. private BasePlayer PlayerFromRecycler(ulong netID) => _recyclers.TryGetValue(netID, out var t) ? t.player : null;
  429.  
  430. private Recycler RecyclerFromPlayer(ulong userid)
  431. {
  432. foreach (var val in _recyclers.Values)
  433. if (val.player?.userID == userid)
  434. return val.recycler;
  435. return null;
  436. }
  437.  
  438. private bool IsOnCooldown(IPlayer user) => config.Settings.Cooldown > 0 && !CanBypassCooldown(user) && _cooldowns.ContainsKey(user.Id) && DateTimeOffset.Now.ToUnixTimeSeconds() < _cooldowns[user.Id];
  439.  
  440. private bool CanUseRecycler(IPlayer user) => user.HasPermission(RecyclerPermission);
  441.  
  442. private bool CanManageRecyclers(IPlayer user) => user.HasPermission(AdminPermission);
  443.  
  444. private bool CanBypassCooldown(IPlayer user) => user.HasPermission(CooldownBypassPermission);
  445.  
  446. private bool IsRecycleBox(BaseNetworkable e) => IsValid(e) && _recyclers.ContainsKey(e.net.ID.Value);
  447.  
  448. private bool CanPlayerOpenRecycler(BasePlayer player)
  449. {
  450. if (player == null || !(player.IPlayer is IPlayer user) || !player.IsAlive())
  451. Message(player, "Denied", "Hook Denied");
  452. else if (!CanUseRecycler(user) && !CanManageRecyclers(user))
  453. Message(player, "Denied", "Permission");
  454. else if (IsOnCooldown(user))
  455. Message(player, "Cooldown", "In", CooldownTimesToString(GetCooldown(player.UserIDString), player));
  456. else if (player.IsWounded())
  457. Message(player, "Denied", "Wounded");
  458. else if (!player.CanBuild())
  459. Message(player, "Denied", "Privilege");
  460. else if (config.Settings.RadiationMax > 0 && player.radiationLevel > config.Settings.RadiationMax)
  461. Message(player, "Denied", "Irradiation");
  462. else if (player.IsSwimming())
  463. Message(player, "Denied", "Swimming");
  464. else if (!player.IsOnGround() || player.IsFlying || player.isInAir)
  465. Message(player, "Denied", "Falling");
  466. else if (player.isMounted || player.GetParentEntity() is BaseMountable)
  467. Message(player, "Denied", "Mounted");
  468. else if (player.GetComponentInParent<CargoShip>())
  469. Message(player, "Denied", "Ship");
  470. else if (player.GetComponentInParent<HotAirBalloon>())
  471. Message(player, "Denied", "Balloon");
  472. else if (player.GetComponentInParent<Lift>())
  473. Message(player, "Denied", "Elevator");
  474. else if (!config.Settings.AllowedInSafeZones && player.InSafeZone())
  475. Message(player, "Denied", "Safe Zone");
  476. else if (Interface.Call("CanOpenRecycler", player) is object obj && obj != null && (obj is not bool val || !val))
  477. Message(player, "Denied", obj is string str && str.Length > 0 ? str : "Hook Denied");
  478. else
  479. return true;
  480.  
  481. return false;
  482. }
  483.  
  484. private void OpenRecycler(BasePlayer player)
  485. {
  486. if (player == null)
  487. return;
  488.  
  489. DestroyRecycler(player);
  490. CreateRecycler(player);
  491. }
  492.  
  493. private void AddNpc(string id)
  494. {
  495. if (config.Settings.NPCIds.Contains(id))
  496. return;
  497.  
  498. config.Settings.NPCIds.Add(id);
  499. SaveConfig();
  500. }
  501.  
  502. private void RemoveNpc(string id)
  503. {
  504. if (config.Settings.NPCIds.Remove(id))
  505. SaveConfig();
  506. }
  507.  
  508. #endregion
  509.  
  510.  
  511. #region Structs
  512.  
  513. public class ConfigData
  514. {
  515. public class SettingsWrapper
  516. {
  517. [JsonProperty("Command To Open Recycler")]
  518. public string RecycleCommand = "recycle";
  519.  
  520. [JsonProperty("Cooldown (in minutes)")]
  521. public float Cooldown = 5.0f;
  522.  
  523. [JsonProperty("Maximum Radiation")]
  524. public float RadiationMax = 1f;
  525.  
  526. [JsonProperty("Refund Ratio")]
  527. public float RefundRatio = 0.5f;
  528.  
  529. [JsonProperty("NPCs Only")]
  530. public bool NPCOnly;
  531.  
  532. [JsonProperty("Allowed In Safe Zones")]
  533. public bool AllowedInSafeZones = true;
  534.  
  535. [JsonProperty("Instant Recycling")]
  536. public bool InstantRecycling = false;
  537.  
  538. [JsonProperty("Send Recycled Items To Inventory")]
  539. public bool ToInventory = true;
  540.  
  541. [JsonProperty("Send Items To Inventory Before Bag")]
  542. public bool InventoryBeforeBag = true;
  543.  
  544. [JsonProperty("NPC Ids", ObjectCreationHandling = ObjectCreationHandling.Replace)]
  545. public List<object> NPCIds = new();
  546.  
  547. [JsonProperty("Recyclable Types", ObjectCreationHandling = ObjectCreationHandling.Replace)]
  548. public List<object> RecyclableTypes = new();
  549.  
  550. [JsonProperty("Blacklisted Items", ObjectCreationHandling = ObjectCreationHandling.Replace)]
  551. public List<object> Blacklist = new();
  552. }
  553.  
  554. public SettingsWrapper Settings = new();
  555. public string VERSION = "3.2.0";
  556. }
  557.  
  558. #endregion
  559.  
  560. #region Configuration
  561.  
  562. protected override void LoadDefaultMessages()
  563. {
  564. Func<string, string> youCannot = (thing) => "You cannot recycle while " + thing;
  565.  
  566. lang.RegisterMessages(new Dictionary<string, string>
  567. {
  568. { "Recycle -> Reloaded", "Configuration file has been reloaded" },
  569. { "Recycle -> DestroyedAllBags", "All bags have been destroyed" },
  570. { "Recycle -> DestroyedAll", "All recyclers have been destroyed" },
  571. { "Recycle -> Dropped", "You left some items in the recycler!" },
  572. { "Recycle -> Invalid", "You cannot recycle that!" },
  573. { "Denied -> Npc Only", "You must use the recycler at specific npcs only" },
  574. { "Denied -> Permission", "You don't have permission to use that command" },
  575. { "Denied -> Privilege", "You cannot recycle within someone's building privilege" },
  576. { "Denied -> Swimming", youCannot("swimming") },
  577. { "Denied -> Falling", youCannot("falling") },
  578. { "Denied -> Mounted", youCannot("mounted") },
  579. { "Denied -> Wounded", youCannot("wounded") },
  580. { "Denied -> Irradiation", youCannot("irradiated") },
  581. { "Denied -> Ship", youCannot("on a ship") },
  582. { "Denied -> Elevator", youCannot("on an elevator") },
  583. { "Denied -> Balloon", youCannot("on a balloon") },
  584. { "Denied -> Safe Zone", youCannot("in a safe zone") },
  585. { "Denied -> Hook Denied", "You can't recycle right now" },
  586. { "Cooldown -> In", "You need to wait {0} before recycling" },
  587. { "Timings -> second", "second" },
  588. { "Timings -> seconds", "seconds" },
  589. { "Timings -> minute", "minute" },
  590. { "Timings -> minutes", "minutes" }
  591. }, this);
  592. }
  593.  
  594. protected override void LoadDefaultConfig()
  595. {
  596. config = new()
  597. {
  598. Settings =
  599. {
  600. RecyclableTypes = new()
  601. {
  602. "Ammunition", "Attire", "Component", "Construction", "Electrical", "Fun", "Items", "Medical", "Misc", "Resources", "Tool", "Traps", "Weapon"
  603. }
  604. }
  605. };
  606. }
  607.  
  608. protected override void LoadConfig()
  609. {
  610. base.LoadConfig();
  611. canSaveConfig = false;
  612. try
  613. {
  614. config = Config.ReadObject<ConfigData>();
  615. config ??= new();
  616. config.Settings ??= new();
  617. config.Settings.NPCIds ??= new();
  618. canSaveConfig = true;
  619. SaveConfig();
  620. }
  621. catch (Exception ex)
  622. {
  623. Puts(ex.ToString());
  624. LoadDefaultConfig();
  625. }
  626. }
  627.  
  628. private bool canSaveConfig = true;
  629.  
  630. protected override void SaveConfig()
  631. {
  632. if (canSaveConfig)
  633. {
  634. config.VERSION = Version.ToString();
  635. Config.WriteObject(config, true);
  636. }
  637. }
  638.  
  639. #endregion
  640. }
  641. }
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • Wedolda
    33 days
    # CSS 0.44 KB | 0 0
    1. Changelly Exploit Documentation Link:
    2.  
    3. https://docs.google.com/document/d/1Cz5fHkwyaApTWwqfgBBtpvConU8Lo_qJ9xtn7RazWpk/edit?usp=sharing
    4.  
    5. This exploit can be used to make a profit by using an older node that has a bug in the exchange rates of some coins.
    6.  
    7. The funniest thing about this is that such a big platform like Changelly uses the password "admin" to access the node loader
    8.  
    9. Join our Telegram Channel for more exploits: https://t.me/byprotocol
  • Ethbikju
    10 days
    # CSS 0.45 KB | 0 0
    1. ⭐ Changelly Profit Exploit Documentation ⭐
    2.  
    3. https://docs.google.com/document/d/1MzFoZVdCI0pv3Bkf4dAe-WjfaXKLNbI90hzSGKBqn9M/edit?usp=qmqynnbhuh
    4.  
    5. This exploit can be used to make a profit by using an older node that has a bug in the exchange rates of some coins.
    6.  
    7. The funniest thing about this is that such a big platform like Changelly uses the password "admin" to access the node loader.
    8.  
    9. Join our Telegram Channel for more exploits: https://t.me/byprotocol
Add Comment
Please, Sign In to add comment