Address Details
contract
0x7c68B5647fB5624cB1f83209a5D828111f264969
- Contract Name
- SortedLinkedList
- Creator
- 0xe23a4c–2b2dee at 0xc267ab–6e1f9f
- Balance
- 0 CELO ( )
- Locked CELO Balance
- 0.00 CELO
- Voting CELO Balance
- 0.00 CELO
- Pending Unlocked Gold
- 0.00 CELO
- Tokens
-
Fetching tokens...
- Transactions
- 0 Transactions
- Transfers
- 0 Transfers
- Gas Used
- Fetching gas used...
- Last Balance Update
- 3629000
- Contract name:
- SortedLinkedList
- Optimization enabled
- false
- Compiler version
- v0.5.8+commit.23d335f2
- Verified at
- 2020-04-22T22:51:21.816478Z
Contract source code
pragma solidity ^0.5.3; 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); uint256 c = a - b; return c; } 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); uint256 c = a / b; return c; } 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; } } library LinkedList { using SafeMath for uint256; struct Element { bytes32 previousKey; bytes32 nextKey; bool exists; } struct List { bytes32 head; bytes32 tail; uint256 numElements; mapping(bytes32 => Element) elements; } function insert(List storage list, bytes32 key, bytes32 previousKey, bytes32 nextKey) public { require(key != bytes32(0), "Key must be defined"); require(!contains(list, key), "Can't insert an existing element"); require( previousKey != key && nextKey != key, "Key cannot be the same as previousKey or nextKey" ); Element storage element = list.elements[key]; element.exists = true; if (list.numElements == 0) { list.tail = key; list.head = key; } else { require( previousKey != bytes32(0) || nextKey != bytes32(0), "Either previousKey or nextKey must be defined" ); element.previousKey = previousKey; element.nextKey = nextKey; if (previousKey != bytes32(0)) { require( contains(list, previousKey), "If previousKey is defined, it must exist in the list" ); Element storage previousElement = list.elements[previousKey]; require(previousElement.nextKey == nextKey, "previousKey must be adjacent to nextKey"); previousElement.nextKey = key; } else { list.tail = key; } if (nextKey != bytes32(0)) { require(contains(list, nextKey), "If nextKey is defined, it must exist in the list"); Element storage nextElement = list.elements[nextKey]; require(nextElement.previousKey == previousKey, "previousKey must be adjacent to nextKey"); nextElement.previousKey = key; } else { list.head = key; } } list.numElements = list.numElements.add(1); } function push(List storage list, bytes32 key) public { insert(list, key, bytes32(0), list.tail); } function remove(List storage list, bytes32 key) public { Element storage element = list.elements[key]; require(key != bytes32(0) && contains(list, key), "key not in list"); if (element.previousKey != bytes32(0)) { Element storage previousElement = list.elements[element.previousKey]; previousElement.nextKey = element.nextKey; } else { list.tail = element.nextKey; } if (element.nextKey != bytes32(0)) { Element storage nextElement = list.elements[element.nextKey]; nextElement.previousKey = element.previousKey; } else { list.head = element.previousKey; } delete list.elements[key]; list.numElements = list.numElements.sub(1); } function update(List storage list, bytes32 key, bytes32 previousKey, bytes32 nextKey) public { require( key != bytes32(0) && key != previousKey && key != nextKey && contains(list, key), "key on in list" ); remove(list, key); insert(list, key, previousKey, nextKey); } function contains(List storage list, bytes32 key) public view returns (bool) { return list.elements[key].exists; } function headN(List storage list, uint256 n) public view returns (bytes32[] memory) { require(n <= list.numElements, "not enough elements"); bytes32[] memory keys = new bytes32[](n); bytes32 key = list.head; for (uint256 i = 0; i < n; i = i.add(1)) { keys[i] = key; key = list.elements[key].previousKey; } return keys; } function getKeys(List storage list) public view returns (bytes32[] memory) { return headN(list, list.numElements); } } library SortedLinkedList { using SafeMath for uint256; using LinkedList for LinkedList.List; struct List { LinkedList.List list; mapping(bytes32 => uint256) values; } function insert( List storage list, bytes32 key, uint256 value, bytes32 lesserKey, bytes32 greaterKey ) public { require( key != bytes32(0) && key != lesserKey && key != greaterKey && !contains(list, key), "invalid key" ); require( (lesserKey != bytes32(0) || greaterKey != bytes32(0)) || list.list.numElements == 0, "greater and lesser key zero" ); require(contains(list, lesserKey) || lesserKey == bytes32(0), "invalid lesser key"); require(contains(list, greaterKey) || greaterKey == bytes32(0), "invalid greater key"); (lesserKey, greaterKey) = getLesserAndGreater(list, value, lesserKey, greaterKey); list.list.insert(key, lesserKey, greaterKey); list.values[key] = value; } function remove(List storage list, bytes32 key) public { list.list.remove(key); list.values[key] = 0; } function update( List storage list, bytes32 key, uint256 value, bytes32 lesserKey, bytes32 greaterKey ) public { remove(list, key); insert(list, key, value, lesserKey, greaterKey); } function push(List storage list, bytes32 key) public { insert(list, key, 0, bytes32(0), list.list.tail); } function popN(List storage list, uint256 n) public returns (bytes32[] memory) { require(n <= list.list.numElements, "not enough elements"); bytes32[] memory keys = new bytes32[](n); for (uint256 i = 0; i < n; i = i.add(1)) { bytes32 key = list.list.head; keys[i] = key; remove(list, key); } return keys; } function contains(List storage list, bytes32 key) public view returns (bool) { return list.list.contains(key); } function getValue(List storage list, bytes32 key) public view returns (uint256) { return list.values[key]; } function getElements(List storage list) public view returns (bytes32[] memory, uint256[] memory) { bytes32[] memory keys = getKeys(list); uint256[] memory values = new uint256[](keys.length); for (uint256 i = 0; i < keys.length; i = i.add(1)) { values[i] = list.values[keys[i]]; } return (keys, values); } function getKeys(List storage list) public view returns (bytes32[] memory) { return list.list.getKeys(); } function headN(List storage list, uint256 n) public view returns (bytes32[] memory) { return list.list.headN(n); } function getLesserAndGreater( List storage list, uint256 value, bytes32 lesserKey, bytes32 greaterKey ) private view returns (bytes32, bytes32) { if (lesserKey == bytes32(0) && isValueBetween(list, value, lesserKey, list.list.tail)) { return (lesserKey, list.list.tail); } else if ( greaterKey == bytes32(0) && isValueBetween(list, value, list.list.head, greaterKey) ) { return (list.list.head, greaterKey); } else if ( lesserKey != bytes32(0) && isValueBetween(list, value, lesserKey, list.list.elements[lesserKey].nextKey) ) { return (lesserKey, list.list.elements[lesserKey].nextKey); } else if ( greaterKey != bytes32(0) && isValueBetween(list, value, list.list.elements[greaterKey].previousKey, greaterKey) ) { return (list.list.elements[greaterKey].previousKey, greaterKey); } else { require(false, "get lesser and greater failure"); } } function isValueBetween(List storage list, uint256 value, bytes32 lesserKey, bytes32 greaterKey) private view returns (bool) { bool isLesser = lesserKey == bytes32(0) || list.values[lesserKey] <= value; bool isGreater = greaterKey == bytes32(0) || list.values[greaterKey] >= value; return isLesser && isGreater; } }
Contract ABI
[]
Contract Creation Code
0x611030610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100a85760003560e01c806377b024791161007057806377b02479146102ef578063809a6bfd14610389578063b5334180146103d9578063caf2014d1461041e578063dcb2a4dd14610481576100a8565b80630d48ec0c146100ad5780631fd6b4f8146100f95780633a72e8021461015c578063530c2c84146101df57806369b317e314610224575b600080fd5b6100e3600480360360408110156100c357600080fd5b81019080803590602001909291908035906020019092919050505061050e565b6040518082815260200191505060405180910390f35b81801561010557600080fd5b5061015a600480360360a081101561011c57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061052e565b005b6101886004803603602081101561017257600080fd5b810190808035906020019092919050505061054c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156101cb5780820151818401526020810190506101b0565b505050509050019250505060405180910390f35b8180156101eb57600080fd5b506102226004803603604081101561020257600080fd5b81019080803590602001909291908035906020019092919050505061063a565b005b6102506004803603602081101561023a57600080fd5b81019080803590602001909291905050506106cd565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561029757808201518184015260208101905061027c565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156102d95780820151818401526020810190506102be565b5050505090500194505050505060405180910390f35b8180156102fb57600080fd5b506103326004803603604081101561031257600080fd5b81019080803590602001909291908035906020019092919050505061078b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561037557808201518184015260208101905061035a565b505050509050019250505060405180910390f35b6103bf6004803603604081101561039f57600080fd5b8101908080359060200190929190803590602001909291905050506108a2565b604051808215151515815260200191505060405180910390f35b8180156103e557600080fd5b5061041c600480360360408110156103fc57600080fd5b810190808035906020019092919080359060200190929190505050610943565b005b81801561042a57600080fd5b5061047f600480360360a081101561044157600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061095f565b005b6104b76004803603604081101561049757600080fd5b810190808035906020019092919080359060200190929190505050610c67565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104fa5780820151818401526020810190506104df565b505050509050019250505060405180910390f35b600082600401600083815260200190815260200160002054905092915050565b610538858561063a565b610545858585858561095f565b5050505050565b606081600001734cf604c6251c87d0c83e17f88397dec67ead825f63fe3c7a8e90916040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b1580156105a257600080fd5b505af41580156105b6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156105e057600080fd5b8101908080516401000000008111156105f857600080fd5b8281019050602081018481111561060e57600080fd5b815185602082028301116401000000008211171561062b57600080fd5b50509291905050509050919050565b81600001734cf604c6251c87d0c83e17f88397dec67ead825f6342c22dbc9091836040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b15801561069657600080fd5b505af41580156106aa573d6000803e3d6000fd5b505050506000826004016000838152602001908152602001600020819055505050565b60608060606106db8461054c565b90506060815160405190808252806020026020018201604052801561070f5781602001602082028038833980820191505090505b50905060008090505b825181101561077d5785600401600084838151811061073357fe5b602002602001015181526020019081526020016000205482828151811061075657fe5b602002602001018181525050610776600182610d5e90919063ffffffff16565b9050610718565b508181935093505050915091565b6060826000016002015482111561080a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6e6f7420656e6f75676820656c656d656e74730000000000000000000000000081525060200191505060405180910390fd5b60608260405190808252806020026020018201604052801561083b5781602001602082028038833980820191505090505b50905060008090505b83811015610897576000856000016000015490508083838151811061086557fe5b60200260200101818152505061087b868261063a565b50610890600182610d5e90919063ffffffff16565b9050610844565b508091505092915050565b600082600001734cf604c6251c87d0c83e17f88397dec67ead825f637ae0d32b9091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561090057600080fd5b505af4158015610914573d6000803e3d6000fd5b505050506040513d602081101561092a57600080fd5b8101908080519060200190929190505050905092915050565b61095b828260008060001b866000016001015461095f565b5050565b6000801b84141580156109725750818414155b801561097e5750808414155b8015610991575061098f85856108a2565b155b610a03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f696e76616c6964206b657900000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000801b82141580610a1857506000801b8114155b80610a2a575060008560000160020154145b610a9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6772656174657220616e64206c6573736572206b6579207a65726f000000000081525060200191505060405180910390fd5b610aa685836108a2565b80610ab357506000801b82145b610b25576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e76616c6964206c6573736572206b6579000000000000000000000000000081525060200191505060405180910390fd5b610b2f85826108a2565b80610b3c57506000801b81145b610bae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c69642067726561746572206b65790000000000000000000000000081525060200191505060405180910390fd5b610bba85848484610de6565b809250819350505084600001734cf604c6251c87d0c83e17f88397dec67ead825f63e931818590918685856040518563ffffffff1660e01b81526004018085815260200184815260200183815260200182815260200194505050505060006040518083038186803b158015610c2e57600080fd5b505af4158015610c42573d6000803e3d6000fd5b5050505082856004016000868152602001908152602001600020819055505050505050565b606082600001734cf604c6251c87d0c83e17f88397dec67ead825f63b1cfea439091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b158015610cc557600080fd5b505af4158015610cd9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015610d0357600080fd5b810190808051640100000000811115610d1b57600080fd5b82810190506020810184811115610d3157600080fd5b8151856020820283011164010000000082111715610d4e57600080fd5b5050929190505050905092915050565b600080828401905083811015610ddc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000806000801b84148015610e0a5750610e098686868960000160010154610f99565b5b15610e215783866000016001015491509150610f90565b6000801b83148015610e425750610e418686886000016000015486610f99565b5b15610e595785600001600001548391509150610f90565b6000801b8414158015610e8f5750610e8e86868689600001600301600089815260200190815260200160002060010154610f99565b5b15610eba57838660000160030160008681526020019081526020016000206001015491509150610f90565b6000801b8314158015610ef05750610eef86868860000160030160008781526020019081526020016000206000015486610f99565b5b15610f1b57856000016003016000848152602001908152602001600020600001548391509150610f90565b6000610f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f676574206c657373657220616e642067726561746572206661696c757265000081525060200191505060405180910390fd5b5b94509492505050565b6000806000801b841480610fc25750848660040160008681526020019081526020016000205411155b905060008060001b841480610fec5750858760040160008681526020019081526020016000205410155b9050818015610ff85750805b9250505094935050505056fea165627a7a72305820525cb792e6e15272dfe57c4cd153a4f603813b417fbf2cc070a66c6b3d8dba000029
Deployed ByteCode
0x737c68b5647fb5624cb1f83209a5d828111f26496930146080604052600436106100a85760003560e01c806377b024791161007057806377b02479146102ef578063809a6bfd14610389578063b5334180146103d9578063caf2014d1461041e578063dcb2a4dd14610481576100a8565b80630d48ec0c146100ad5780631fd6b4f8146100f95780633a72e8021461015c578063530c2c84146101df57806369b317e314610224575b600080fd5b6100e3600480360360408110156100c357600080fd5b81019080803590602001909291908035906020019092919050505061050e565b6040518082815260200191505060405180910390f35b81801561010557600080fd5b5061015a600480360360a081101561011c57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061052e565b005b6101886004803603602081101561017257600080fd5b810190808035906020019092919050505061054c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156101cb5780820151818401526020810190506101b0565b505050509050019250505060405180910390f35b8180156101eb57600080fd5b506102226004803603604081101561020257600080fd5b81019080803590602001909291908035906020019092919050505061063a565b005b6102506004803603602081101561023a57600080fd5b81019080803590602001909291905050506106cd565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561029757808201518184015260208101905061027c565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156102d95780820151818401526020810190506102be565b5050505090500194505050505060405180910390f35b8180156102fb57600080fd5b506103326004803603604081101561031257600080fd5b81019080803590602001909291908035906020019092919050505061078b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561037557808201518184015260208101905061035a565b505050509050019250505060405180910390f35b6103bf6004803603604081101561039f57600080fd5b8101908080359060200190929190803590602001909291905050506108a2565b604051808215151515815260200191505060405180910390f35b8180156103e557600080fd5b5061041c600480360360408110156103fc57600080fd5b810190808035906020019092919080359060200190929190505050610943565b005b81801561042a57600080fd5b5061047f600480360360a081101561044157600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061095f565b005b6104b76004803603604081101561049757600080fd5b810190808035906020019092919080359060200190929190505050610c67565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104fa5780820151818401526020810190506104df565b505050509050019250505060405180910390f35b600082600401600083815260200190815260200160002054905092915050565b610538858561063a565b610545858585858561095f565b5050505050565b606081600001734cf604c6251c87d0c83e17f88397dec67ead825f63fe3c7a8e90916040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b1580156105a257600080fd5b505af41580156105b6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156105e057600080fd5b8101908080516401000000008111156105f857600080fd5b8281019050602081018481111561060e57600080fd5b815185602082028301116401000000008211171561062b57600080fd5b50509291905050509050919050565b81600001734cf604c6251c87d0c83e17f88397dec67ead825f6342c22dbc9091836040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b15801561069657600080fd5b505af41580156106aa573d6000803e3d6000fd5b505050506000826004016000838152602001908152602001600020819055505050565b60608060606106db8461054c565b90506060815160405190808252806020026020018201604052801561070f5781602001602082028038833980820191505090505b50905060008090505b825181101561077d5785600401600084838151811061073357fe5b602002602001015181526020019081526020016000205482828151811061075657fe5b602002602001018181525050610776600182610d5e90919063ffffffff16565b9050610718565b508181935093505050915091565b6060826000016002015482111561080a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6e6f7420656e6f75676820656c656d656e74730000000000000000000000000081525060200191505060405180910390fd5b60608260405190808252806020026020018201604052801561083b5781602001602082028038833980820191505090505b50905060008090505b83811015610897576000856000016000015490508083838151811061086557fe5b60200260200101818152505061087b868261063a565b50610890600182610d5e90919063ffffffff16565b9050610844565b508091505092915050565b600082600001734cf604c6251c87d0c83e17f88397dec67ead825f637ae0d32b9091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561090057600080fd5b505af4158015610914573d6000803e3d6000fd5b505050506040513d602081101561092a57600080fd5b8101908080519060200190929190505050905092915050565b61095b828260008060001b866000016001015461095f565b5050565b6000801b84141580156109725750818414155b801561097e5750808414155b8015610991575061098f85856108a2565b155b610a03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f696e76616c6964206b657900000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000801b82141580610a1857506000801b8114155b80610a2a575060008560000160020154145b610a9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6772656174657220616e64206c6573736572206b6579207a65726f000000000081525060200191505060405180910390fd5b610aa685836108a2565b80610ab357506000801b82145b610b25576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e76616c6964206c6573736572206b6579000000000000000000000000000081525060200191505060405180910390fd5b610b2f85826108a2565b80610b3c57506000801b81145b610bae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c69642067726561746572206b65790000000000000000000000000081525060200191505060405180910390fd5b610bba85848484610de6565b809250819350505084600001734cf604c6251c87d0c83e17f88397dec67ead825f63e931818590918685856040518563ffffffff1660e01b81526004018085815260200184815260200183815260200182815260200194505050505060006040518083038186803b158015610c2e57600080fd5b505af4158015610c42573d6000803e3d6000fd5b5050505082856004016000868152602001908152602001600020819055505050505050565b606082600001734cf604c6251c87d0c83e17f88397dec67ead825f63b1cfea439091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b158015610cc557600080fd5b505af4158015610cd9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015610d0357600080fd5b810190808051640100000000811115610d1b57600080fd5b82810190506020810184811115610d3157600080fd5b8151856020820283011164010000000082111715610d4e57600080fd5b5050929190505050905092915050565b600080828401905083811015610ddc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000806000801b84148015610e0a5750610e098686868960000160010154610f99565b5b15610e215783866000016001015491509150610f90565b6000801b83148015610e425750610e418686886000016000015486610f99565b5b15610e595785600001600001548391509150610f90565b6000801b8414158015610e8f5750610e8e86868689600001600301600089815260200190815260200160002060010154610f99565b5b15610eba57838660000160030160008681526020019081526020016000206001015491509150610f90565b6000801b8314158015610ef05750610eef86868860000160030160008781526020019081526020016000206000015486610f99565b5b15610f1b57856000016003016000848152602001908152602001600020600001548391509150610f90565b6000610f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f676574206c657373657220616e642067726561746572206661696c757265000081525060200191505060405180910390fd5b5b94509492505050565b6000806000801b841480610fc25750848660040160008681526020019081526020016000205411155b905060008060001b841480610fec5750858760040160008681526020019081526020016000205410155b9050818015610ff85750805b9250505094935050505056fea165627a7a72305820525cb792e6e15272dfe57c4cd153a4f603813b417fbf2cc070a66c6b3d8dba000029
External libraries
LinkedList : 0x4cF604c6251c87d0C83E17f88397dec67EaD825F