Contract Overview
Contract Name:
DeviceBinding
Compiler Version
v0.8.17+commit.8df45f5f
/** * SourceUnit: /Users/mz/Codes/my-ws-app/blockchain/contracts/DeviceBinding.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } /** * SourceUnit: /Users/mz/Codes/my-ws-app/blockchain/contracts/DeviceBinding.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; ////import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * SourceUnit: /Users/mz/Codes/my-ws-app/blockchain/contracts/DeviceBinding.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.0; ////import "@openzeppelin/contracts/access/Ownable.sol"; contract DevicesRegistry is Ownable { event DeviceRegistered(bytes32 indexed _deviceId); event DeviceDeleted(bytes32 indexed _deviceId); event DeviceSuspended(bytes32 indexed _deviceId); event DeviceActivated(bytes32 indexed _deviceId); struct Device { bool isRegistered; bool isActive; } mapping(bytes32 => Device) public devices; constructor() {} modifier onlyRegisteredDevice(bytes32 _deviceId) { require( devices[_deviceId].isRegistered, "Data Source is not registered" ); _; } modifier onlyUnregisteredDevice(bytes32 _deviceId) { require( !devices[_deviceId].isRegistered, "Data Source already registered" ); _; } modifier onlyActiveDevice(bytes32 _deviceId) { require(devices[_deviceId].isActive, "Data Source is suspended"); _; } modifier onlySuspendedDevice(bytes32 _deviceId) { require(!devices[_deviceId].isActive, "Data Source is active"); _; } function registerDevice( bytes32 _deviceId ) public onlyOwner onlyUnregisteredDevice(_deviceId) { devices[_deviceId] = Device(true, true); emit DeviceRegistered(_deviceId); } function removeDevice( bytes32 _deviceId ) public onlyOwner onlyRegisteredDevice(_deviceId) { delete devices[_deviceId]; emit DeviceDeleted(_deviceId); } function suspendDevice( bytes32 _deviceId ) public onlyOwner onlyRegisteredDevice(_deviceId) onlyActiveDevice(_deviceId) { devices[_deviceId].isActive = false; emit DeviceSuspended(_deviceId); } function activateDevice( bytes32 _deviceId ) public onlyOwner onlyRegisteredDevice(_deviceId) onlySuspendedDevice(_deviceId) { devices[_deviceId].isActive = true; emit DeviceActivated(_deviceId); } function isAuthorizedDevice( bytes32 _deviceId ) public view onlyRegisteredDevice(_deviceId) onlyActiveDevice(_deviceId) returns (bool) { return true; } } /** * SourceUnit: /Users/mz/Codes/my-ws-app/blockchain/contracts/DeviceBinding.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } /** * SourceUnit: /Users/mz/Codes/my-ws-app/blockchain/contracts/DeviceBinding.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.0; ////import "@openzeppelin/contracts/access/Ownable.sol"; ////import "@openzeppelin/contracts/utils/Counters.sol"; ////import "./DevicesRegistry.sol"; contract DeviceBinding is Ownable { using Counters for Counters.Counter; DevicesRegistry public devicesRegistry; Counters.Counter private totalDevices; mapping(bytes32 => address) public deviceToOwner; mapping(address => bytes32[]) public ownerToDevices; event OwnershipAssigned( bytes32 indexed _deviceId, address indexed _ownerAddress ); event OwnershipRenounced(bytes32 indexed _deviceId); modifier onlyAuthorizedDevice(bytes32 _deviceId) { require( devicesRegistry.isAuthorizedDevice(_deviceId), "device is not authorized" ); _; } modifier onlyNotBoundDevice(bytes32 _deviceId) { require( deviceToOwner[_deviceId] == address(0), "device has already been bound" ); _; } modifier onlyBoundDevice(bytes32 _deviceId) { require(deviceToOwner[_deviceId] != address(0), "device is not bound"); _; } modifier onlyDeviceOwnerOrAdmin(bytes32 _deviceId) { require( (deviceToOwner[_deviceId] == msg.sender) || (msg.sender == this.owner()), "not the device owner or admin" ); _; } constructor(address _devicesRegistryAddress) { devicesRegistry = DevicesRegistry(_devicesRegistryAddress); } function bindDevice( bytes32 _deviceId, address _ownerAddress ) public onlyOwner onlyNotBoundDevice(_deviceId) onlyAuthorizedDevice(_deviceId) returns (bool) { _bindDevice(_deviceId, _ownerAddress); emit OwnershipAssigned(_deviceId, _ownerAddress); return true; } function unbindDevice( bytes32 _deviceId ) public onlyBoundDevice(_deviceId) onlyDeviceOwnerOrAdmin(_deviceId) returns (bool) { _unbindDevice(_deviceId); emit OwnershipRenounced(_deviceId); return true; } function getDevicesCount() public view returns (uint) { return totalDevices.current(); } function getDeviceOwner(bytes32 _deviceId) public view returns (address) { return deviceToOwner[_deviceId]; } function getOwnedDevices( address _ownerAddress ) public view returns (bytes32[] memory) { return ownerToDevices[_ownerAddress]; } function _bindDevice(bytes32 _deviceId, address _ownerAddress) private { deviceToOwner[_deviceId] = _ownerAddress; totalDevices.increment(); ownerToDevices[_ownerAddress].push(_deviceId); } function _unbindDevice(bytes32 _deviceId) private { address ownerAddress = deviceToOwner[_deviceId]; delete deviceToOwner[_deviceId]; totalDevices.decrement(); _removeDeviceFromOwner(ownerAddress, _deviceId); } function _removeDeviceFromOwner( address _ownerAddress, bytes32 _deviceId ) private { bytes32[] storage ownedDevices = ownerToDevices[_ownerAddress]; uint deviceIndex; for (uint i = 0; i < ownedDevices.length; i++) { if (ownedDevices[i] == _deviceId) { deviceIndex = i; break; } } ownedDevices[deviceIndex] = ownedDevices[ownedDevices.length - 1]; ownedDevices.pop(); } }
[{"inputs":[{"internalType":"address","name":"_devicesRegistryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_deviceId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_ownerAddress","type":"address"}],"name":"OwnershipAssigned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_deviceId","type":"bytes32"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"bytes32","name":"_deviceId","type":"bytes32"},{"internalType":"address","name":"_ownerAddress","type":"address"}],"name":"bindDevice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"deviceToOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devicesRegistry","outputs":[{"internalType":"contract DevicesRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_deviceId","type":"bytes32"}],"name":"getDeviceOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDevicesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"}],"name":"getOwnedDevices","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerToDevices","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_deviceId","type":"bytes32"}],"name":"unbindDevice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600436106100a95760003560e01c80636c3a0355116100715780636c3a03551461018c578063715018a6146101aa5780638da5cb5b146101b45780639caf9a13146101d2578063abb8d20014610202578063f2fde38b14610232576100a9565b80630611f1c5146100ae5780630d3f730e146100de57806316f936c51461010e5780631a8f06bb1461013e57806324fd8c441461015c575b600080fd5b6100c860048036038101906100c39190610cf0565b61024e565b6040516100d59190610d5e565b60405180910390f35b6100f860048036038101906100f39190610ddb565b610281565b6040516101059190610e2a565b60405180910390f35b61012860048036038101906101239190610cf0565b6102b2565b6040516101359190610d5e565b60405180910390f35b6101466102ef565b6040516101539190610ea4565b60405180910390f35b61017660048036038101906101719190610ebf565b610315565b6040516101839190610f1a565b60405180910390f35b6101946104f8565b6040516101a19190610f44565b60405180910390f35b6101b2610509565b005b6101bc61051d565b6040516101c99190610d5e565b60405180910390f35b6101ec60048036038101906101e79190610f5f565b610546565b6040516101f9919061104a565b60405180910390f35b61021c60048036038101906102179190610cf0565b6105dd565b6040516102299190610f1a565b60405180910390f35b61024c60048036038101906102479190610f5f565b610809565b005b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6004602052816000526040600020818154811061029d57600080fd5b90600052602060002001600091509150505481565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061031f61088c565b82600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146103c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b9906110c9565b60405180910390fd5b83600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637fe93f3a826040518263ffffffff1660e01b815260040161041e9190610e2a565b602060405180830381865afa15801561043b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045f9190611115565b61049e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104959061118e565b60405180910390fd5b6104a8858561090a565b8373ffffffffffffffffffffffffffffffffffffffff16857f79e9049c280370b9eda34d20f57456b7dcc94e83ac839777f71209901f780f4860405160405180910390a360019250505092915050565b600061050460026109d0565b905090565b61051161088c565b61051b60006109de565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156105d157602002820191906000526020600020905b8154815260200190600101908083116105bd575b50505050509050919050565b600081600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610682576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610679906111fa565b60405180910390fd5b823373ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061078957503073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075a919061122f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6107c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bf906112a8565b60405180910390fd5b6107d184610aa2565b837f082a52a4b0a06e3d96ce6f09c7d65257ff67f267c0f7f536943eefdeeb28febb60405160405180910390a2600192505050919050565b61081161088c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108779061133a565b60405180910390fd5b610889816109de565b50565b610894610b28565b73ffffffffffffffffffffffffffffffffffffffff166108b261051d565b73ffffffffffffffffffffffffffffffffffffffff1614610908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ff906113a6565b60405180910390fd5b565b806003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506109666002610b30565b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150506001900390600052602060002001600090919091909150555050565b600081600001549050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610b1a6002610b46565b610b248183610ba2565b5050565b600033905090565b6001816000016000828254019250508190555050565b60008160000154905060008111610b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8990611412565b60405180910390fd5b6001810382600001819055505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600080600090505b8280549050811015610c385783838281548110610c0d57610c0c611432565b5b906000526020600020015403610c2557809150610c38565b8080610c3090611490565b915050610bed565b508160018380549050610c4b91906114d8565b81548110610c5c57610c5b611432565b5b9060005260206000200154828281548110610c7a57610c79611432565b5b906000526020600020018190555081805480610c9957610c9861150c565b5b6001900381819060005260206000200160009055905550505050565b600080fd5b6000819050919050565b610ccd81610cba565b8114610cd857600080fd5b50565b600081359050610cea81610cc4565b92915050565b600060208284031215610d0657610d05610cb5565b5b6000610d1484828501610cdb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610d4882610d1d565b9050919050565b610d5881610d3d565b82525050565b6000602082019050610d736000830184610d4f565b92915050565b610d8281610d3d565b8114610d8d57600080fd5b50565b600081359050610d9f81610d79565b92915050565b6000819050919050565b610db881610da5565b8114610dc357600080fd5b50565b600081359050610dd581610daf565b92915050565b60008060408385031215610df257610df1610cb5565b5b6000610e0085828601610d90565b9250506020610e1185828601610dc6565b9150509250929050565b610e2481610cba565b82525050565b6000602082019050610e3f6000830184610e1b565b92915050565b6000819050919050565b6000610e6a610e65610e6084610d1d565b610e45565b610d1d565b9050919050565b6000610e7c82610e4f565b9050919050565b6000610e8e82610e71565b9050919050565b610e9e81610e83565b82525050565b6000602082019050610eb96000830184610e95565b92915050565b60008060408385031215610ed657610ed5610cb5565b5b6000610ee485828601610cdb565b9250506020610ef585828601610d90565b9150509250929050565b60008115159050919050565b610f1481610eff565b82525050565b6000602082019050610f2f6000830184610f0b565b92915050565b610f3e81610da5565b82525050565b6000602082019050610f596000830184610f35565b92915050565b600060208284031215610f7557610f74610cb5565b5b6000610f8384828501610d90565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610fc181610cba565b82525050565b6000610fd38383610fb8565b60208301905092915050565b6000602082019050919050565b6000610ff782610f8c565b6110018185610f97565b935061100c83610fa8565b8060005b8381101561103d5781516110248882610fc7565b975061102f83610fdf565b925050600181019050611010565b5085935050505092915050565b600060208201905081810360008301526110648184610fec565b905092915050565b600082825260208201905092915050565b7f6465766963652068617320616c7265616479206265656e20626f756e64000000600082015250565b60006110b3601d8361106c565b91506110be8261107d565b602082019050919050565b600060208201905081810360008301526110e2816110a6565b9050919050565b6110f281610eff565b81146110fd57600080fd5b50565b60008151905061110f816110e9565b92915050565b60006020828403121561112b5761112a610cb5565b5b600061113984828501611100565b91505092915050565b7f646576696365206973206e6f7420617574686f72697a65640000000000000000600082015250565b600061117860188361106c565b915061118382611142565b602082019050919050565b600060208201905081810360008301526111a78161116b565b9050919050565b7f646576696365206973206e6f7420626f756e6400000000000000000000000000600082015250565b60006111e460138361106c565b91506111ef826111ae565b602082019050919050565b60006020820190508181036000830152611213816111d7565b9050919050565b60008151905061122981610d79565b92915050565b60006020828403121561124557611244610cb5565b5b60006112538482850161121a565b91505092915050565b7f6e6f742074686520646576696365206f776e6572206f722061646d696e000000600082015250565b6000611292601d8361106c565b915061129d8261125c565b602082019050919050565b600060208201905081810360008301526112c181611285565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061132460268361106c565b915061132f826112c8565b604082019050919050565b6000602082019050818103600083015261135381611317565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061139060208361106c565b915061139b8261135a565b602082019050919050565b600060208201905081810360008301526113bf81611383565b9050919050565b7f436f756e7465723a2064656372656d656e74206f766572666c6f770000000000600082015250565b60006113fc601b8361106c565b9150611407826113c6565b602082019050919050565b6000602082019050818103600083015261142b816113ef565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061149b82610da5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114cd576114cc611461565b5b600182019050919050565b60006114e382610da5565b91506114ee83610da5565b925082820390508181111561150657611505611461565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212209423f1228ae1cf056366e1223f706b56b3b2de3e19a5c8afadc177377ddad5fe64736f6c63430008110033
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for
interesting conversations.