Contract Overview
Balance:
0 Ether
EtherValue:
$0.00
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
Azimuth
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2019-01-04
*/
// the azimuth data store
// https://azimuth.network
pragma solidity 0.4.24;
////////////////////////////////////////////////////////////////////////////////
// Imports
////////////////////////////////////////////////////////////////////////////////
// OpenZeppelin's Ownable.sol
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
*/
contract Ownable {
address public owner;
event OwnershipRenounced(address indexed previousOwner);
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
constructor() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to relinquish control of the contract.
* @notice Renouncing to ownership will leave the contract without an owner.
* It will not be possible to call the functions with the `onlyOwner`
* modifier anymore.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipRenounced(owner);
owner = address(0);
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function transferOwnership(address _newOwner) public onlyOwner {
_transferOwnership(_newOwner);
}
/**
* @dev Transfers control of the contract to a newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function _transferOwnership(address _newOwner) internal {
require(_newOwner != address(0));
emit OwnershipTransferred(owner, _newOwner);
owner = _newOwner;
}
}
////////////////////////////////////////////////////////////////////////////////
// Azimuth
////////////////////////////////////////////////////////////////////////////////
// Azimuth: point state data contract
//
// This contract is used for storing all data related to Azimuth points
// and their ownership. Consider this contract the Azimuth ledger.
//
// It also contains permissions data, which ties in to ERC721
// functionality. Operators of an address are allowed to transfer
// ownership of all points owned by their associated address
// (ERC721's approveAll()). A transfer proxy is allowed to transfer
// ownership of a single point (ERC721's approve()).
// Separate from ERC721 are managers, assigned per point. They are
// allowed to perform "low-impact" operations on the owner's points,
// like configuring public keys and making escape requests.
//
// Since data stores are difficult to upgrade, this contract contains
// as little actual business logic as possible. Instead, the data stored
// herein can only be modified by this contract's owner, which can be
// changed and is thus upgradable/replaceable.
//
// This contract will be owned by the Ecliptic contract.
//
contract Azimuth is Ownable
{
//
// Events
//
// OwnerChanged: :point is now owned by :owner
//
event OwnerChanged(uint32 indexed point, address indexed owner);
// Activated: :point is now active
//
event Activated(uint32 indexed point);
// Spawned: :prefix has spawned :child
//
event Spawned(uint32 indexed prefix, uint32 indexed child);
// EscapeRequested: :point has requested a new :sponsor
//
event EscapeRequested(uint32 indexed point, uint32 indexed sponsor);
// EscapeCanceled: :point's :sponsor request was canceled or rejected
//
event EscapeCanceled(uint32 indexed point, uint32 indexed sponsor);
// EscapeAccepted: :point confirmed with a new :sponsor
//
event EscapeAccepted(uint32 indexed point, uint32 indexed sponsor);
// LostSponsor: :point's :sponsor is now refusing it service
//
event LostSponsor(uint32 indexed point, uint32 indexed sponsor);
// ChangedKeys: :point has new network public keys
//
event ChangedKeys( uint32 indexed point,
bytes32 encryptionKey,
bytes32 authenticationKey,
uint32 cryptoSuiteVersion,
uint32 keyRevisionNumber );
// BrokeContinuity: :point has a new continuity number, :number
//
event BrokeContinuity(uint32 indexed point, uint32 number);
// ChangedSpawnProxy: :spawnProxy can now spawn using :point
//
event ChangedSpawnProxy(uint32 indexed point, address indexed spawnProxy);
// ChangedTransferProxy: :transferProxy can now transfer ownership of :point
//
event ChangedTransferProxy( uint32 indexed point,
address indexed transferProxy );
// ChangedManagementProxy: :managementProxy can now manage :point
//
event ChangedManagementProxy( uint32 indexed point,
address indexed managementProxy );
// ChangedVotingProxy: :votingProxy can now vote using :point
//
event ChangedVotingProxy(uint32 indexed point, address indexed votingProxy);
// ChangedDns: dnsDomains have been updated
//
event ChangedDns(string primary, string secondary, string tertiary);
//
// Structures
//
// Size: kinds of points registered on-chain
//
// NOTE: the order matters, because of Solidity enum numbering
//
enum Size
{
Galaxy, // = 0
Star, // = 1
Planet // = 2
}
// Point: state of a point
//
// While the ordering of the struct members is semantically chaotic,
// they are ordered to tightly pack them into Ethereum's 32-byte storage
// slots, which reduces gas costs for some function calls.
// The comment ticks indicate assumed slot boundaries.
//
struct Point
{
// encryptionKey: (curve25519) encryption public key, or 0 for none
//
bytes32 encryptionKey;
//
// authenticationKey: (ed25519) authentication public key, or 0 for none
//
bytes32 authenticationKey;
//
// spawned: for stars and galaxies, all :active children
//
uint32[] spawned;
//
// hasSponsor: true if the sponsor still supports the point
//
bool hasSponsor;
// active: whether point can be linked
//
// false: point belongs to prefix, cannot be configured or linked
// true: point no longer belongs to prefix, can be configured and linked
//
bool active;
// escapeRequested: true if the point has requested to change sponsors
//
bool escapeRequested;
// sponsor: the point that supports this one on the network, or,
// if :hasSponsor is false, the last point that supported it.
// (by default, the point's half-width prefix)
//
uint32 sponsor;
// escapeRequestedTo: if :escapeRequested is true, new sponsor requested
//
uint32 escapeRequestedTo;
// cryptoSuiteVersion: version of the crypto suite used for the pubkeys
//
uint32 cryptoSuiteVersion;
// keyRevisionNumber: incremented every time the public keys change
//
uint32 keyRevisionNumber;
// continuityNumber: incremented to indicate network-side state loss
//
uint32 continuityNumber;
}
// Deed: permissions for a point
//
struct Deed
{
// owner: address that owns this point
//
address owner;
// managementProxy: 0, or another address with the right to perform
// low-impact, managerial operations on this point
//
address managementProxy;
// spawnProxy: 0, or another address with the right to spawn children
// of this point
//
address spawnProxy;
// votingProxy: 0, or another address with the right to vote as this point
//
address votingProxy;
// transferProxy: 0, or another address with the right to transfer
// ownership of this point
//
address transferProxy;
}
//
// General state
//
// points: per point, general network-relevant point state
//
mapping(uint32 => Point) public points;
// rights: per point, on-chain ownership and permissions
//
mapping(uint32 => Deed) public rights;
// operators: per owner, per address, has the right to transfer ownership
// of all the owner's points (ERC721)
//
mapping(address => mapping(address => bool)) public operators;
// dnsDomains: base domains for contacting galaxies
//
// dnsDomains[0] is primary, the others are used as fallbacks
//
string[3] public dnsDomains;
//
// Lookups
//
// sponsoring: per point, the points they are sponsoring
//
mapping(uint32 => uint32[]) public sponsoring;
// sponsoringIndexes: per point, per point, (index + 1) in
// the sponsoring array
//
mapping(uint32 => mapping(uint32 => uint256)) public sponsoringIndexes;
// escapeRequests: per point, the points they have open escape requests from
//
mapping(uint32 => uint32[]) public escapeRequests;
// escapeRequestsIndexes: per point, per point, (index + 1) in
// the escapeRequests array
//
mapping(uint32 => mapping(uint32 => uint256)) public escapeRequestsIndexes;
// pointsOwnedBy: per address, the points they own
//
mapping(address => uint32[]) public pointsOwnedBy;
// pointOwnerIndexes: per owner, per point, (index + 1) in
// the pointsOwnedBy array
//
// We delete owners by moving the last entry in the array to the
// newly emptied slot, which is (n - 1) where n is the value of
// pointOwnerIndexes[owner][point].
//
mapping(address => mapping(uint32 => uint256)) public pointOwnerIndexes;
// managerFor: per address, the points they are the management proxy for
//
mapping(address => uint32[]) public managerFor;
// managerForIndexes: per address, per point, (index + 1) in
// the managerFor array
//
mapping(address => mapping(uint32 => uint256)) public managerForIndexes;
// spawningFor: per address, the points they can spawn with
//
mapping(address => uint32[]) public spawningFor;
// spawningForIndexes: per address, per point, (index + 1) in
// the spawningFor array
//
mapping(address => mapping(uint32 => uint256)) public spawningForIndexes;
// votingFor: per address, the points they can vote with
//
mapping(address => uint32[]) public votingFor;
// votingForIndexes: per address, per point, (index + 1) in
// the votingFor array
//
mapping(address => mapping(uint32 => uint256)) public votingForIndexes;
// transferringFor: per address, the points they can transfer
//
mapping(address => uint32[]) public transferringFor;
// transferringForIndexes: per address, per point, (index + 1) in
// the transferringFor array
//
mapping(address => mapping(uint32 => uint256)) public transferringForIndexes;
//
// Logic
//
// constructor(): configure default dns domains
//
constructor()
public
{
setDnsDomains("example.com", "example.com", "example.com");
}
// setDnsDomains(): set the base domains used for contacting galaxies
//
// Note: since a string is really just a byte[], and Solidity can't
// work with two-dimensional arrays yet, we pass in the three
// domains as individual strings.
//
function setDnsDomains(string _primary, string _secondary, string _tertiary)
onlyOwner
public
{
dnsDomains[0] = _primary;
dnsDomains[1] = _secondary;
dnsDomains[2] = _tertiary;
emit ChangedDns(_primary, _secondary, _tertiary);
}
//
// Point reading
//
// isActive(): return true if _point is active
//
function isActive(uint32 _point)
view
external
returns (bool equals)
{
return points[_point].active;
}
// getKeys(): returns the public keys and their details, as currently
// registered for _point
//
function getKeys(uint32 _point)
view
external
returns (bytes32 crypt, bytes32 auth, uint32 suite, uint32 revision)
{
Point storage point = points[_point];
return (point.encryptionKey,
point.authenticationKey,
point.cryptoSuiteVersion,
point.keyRevisionNumber);
}
// getKeyRevisionNumber(): gets the revision number of _point's current
// public keys
//
function getKeyRevisionNumber(uint32 _point)
view
external
returns (uint32 revision)
{
return points[_point].keyRevisionNumber;
}
// hasBeenLinked(): returns true if the point has ever been assigned keys
//
function hasBeenLinked(uint32 _point)
view
external
returns (bool result)
{
return ( points[_point].keyRevisionNumber > 0 );
}
// isLive(): returns true if _point currently has keys properly configured
//
function isLive(uint32 _point)
view
external
returns (bool result)
{
Point storage point = points[_point];
return ( point.encryptionKey != 0 &&
point.authenticationKey != 0 &&
point.cryptoSuiteVersion != 0 );
}
// getContinuityNumber(): returns _point's current continuity number
//
function getContinuityNumber(uint32 _point)
view
external
returns (uint32 continuityNumber)
{
return points[_point].continuityNumber;
}
// getSpawnCount(): return the number of children spawned by _point
//
function getSpawnCount(uint32 _point)
view
external
returns (uint32 spawnCount)
{
uint256 len = points[_point].spawned.length;
assert(len < 2**32);
return uint32(len);
}
// getSpawned(): return array of points created under _point
//
// Note: only useful for clients, as Solidity does not currently
// support returning dynamic arrays.
//
function getSpawned(uint32 _point)
view
external
returns (uint32[] spawned)
{
return points[_point].spawned;
}
// hasSponsor(): returns true if _point's sponsor is providing it service
//
function hasSponsor(uint32 _point)
view
external
returns (bool has)
{
return points[_point].hasSponsor;
}
// getSponsor(): returns _point's current (or most recent) sponsor
//
function getSponsor(uint32 _point)
view
external
returns (uint32 sponsor)
{
return points[_point].sponsor;
}
// isSponsor(): returns true if _sponsor is currently providing service
// to _point
//
function isSponsor(uint32 _point, uint32 _sponsor)
view
external
returns (bool result)
{
Point storage point = points[_point];
return ( point.hasSponsor &&
(point.sponsor == _sponsor) );
}
// getSponsoringCount(): returns the number of points _sponsor is
// providing service to
//
function getSponsoringCount(uint32 _sponsor)
view
external
returns (uint256 count)
{
return sponsoring[_sponsor].length;
}
// getSponsoring(): returns a list of points _sponsor is providing
// service to
//
// Note: only useful for clients, as Solidity does not currently
// support returning dynamic arrays.
//
function getSponsoring(uint32 _sponsor)
view
external
returns (uint32[] sponsees)
{
return sponsoring[_sponsor];
}
// escaping
// isEscaping(): returns true if _point has an outstanding escape request
//
function isEscaping(uint32 _point)
view
external
returns (bool escaping)
{
return points[_point].escapeRequested;
}
// getEscapeRequest(): returns _point's current escape request
//
// the returned escape request is only valid as long as isEscaping()
// returns true
//
function getEscapeRequest(uint32 _point)
view
external
returns (uint32 escape)
{
return points[_point].escapeRequestedTo;
}
// isRequestingEscapeTo(): returns true if _point has an outstanding
// escape request targetting _sponsor
//
function isRequestingEscapeTo(uint32 _point, uint32 _sponsor)
view
public
returns (bool equals)
{
Point storage point = points[_point];
return (point.escapeRequested && (point.escapeRequestedTo == _sponsor));
}
// getEscapeRequestsCount(): returns the number of points _sponsor
// is providing service to
//
function getEscapeRequestsCount(uint32 _sponsor)
view
external
returns (uint256 count)
{
return escapeRequests[_sponsor].length;
}
// getEscapeRequests(): get the points _sponsor has received escape
// requests from
//
// Note: only useful for clients, as Solidity does not currently
// support returning dynamic arrays.
//
function getEscapeRequests(uint32 _sponsor)
view
external
returns (uint32[] requests)
{
return escapeRequests[_sponsor];
}
//
// Point writing
//
// activatePoint(): activate a point, register it as spawned by its prefix
//
function activatePoint(uint32 _point)
onlyOwner
external
{
// make a point active, setting its sponsor to its prefix
//
Point storage point = points[_point];
require(!point.active);
point.active = true;
registerSponsor(_point, true, getPrefix(_point));
emit Activated(_point);
}
// setKeys(): set network public keys of _point to _encryptionKey and
// _authenticationKey, with the specified _cryptoSuiteVersion
//
function setKeys(uint32 _point,
bytes32 _encryptionKey,
bytes32 _authenticationKey,
uint32 _cryptoSuiteVersion)
onlyOwner
external
{
Point storage point = points[_point];
if ( point.encryptionKey == _encryptionKey &&
point.authenticationKey == _authenticationKey &&
point.cryptoSuiteVersion == _cryptoSuiteVersion )
{
return;
}
point.encryptionKey = _encryptionKey;
point.authenticationKey = _authenticationKey;
point.cryptoSuiteVersion = _cryptoSuiteVersion;
point.keyRevisionNumber++;
emit ChangedKeys(_point,
_encryptionKey,
_authenticationKey,
_cryptoSuiteVersion,
point.keyRevisionNumber);
}
// incrementContinuityNumber(): break continuity for _point
//
function incrementContinuityNumber(uint32 _point)
onlyOwner
external
{
Point storage point = points[_point];
point.continuityNumber++;
emit BrokeContinuity(_point, point.continuityNumber);
}
// registerSpawn(): add a point to its prefix's list of spawned points
//
function registerSpawned(uint32 _point)
onlyOwner
external
{
// if a point is its own prefix (a galaxy) then don't register it
//
uint32 prefix = getPrefix(_point);
if (prefix == _point)
{
return;
}
// register a new spawned point for the prefix
//
points[prefix].spawned.push(_point);
emit Spawned(prefix, _point);
}
// loseSponsor(): indicates that _point's sponsor is no longer providing
// it service
//
function loseSponsor(uint32 _point)
onlyOwner
external
{
Point storage point = points[_point];
if (!point.hasSponsor)
{
return;
}
registerSponsor(_point, false, point.sponsor);
emit LostSponsor(_point, point.sponsor);
}
// setEscapeRequest(): for _point, start an escape request to _sponsor
//
function setEscapeRequest(uint32 _point, uint32 _sponsor)
onlyOwner
external
{
if (isRequestingEscapeTo(_point, _sponsor))
{
return;
}
registerEscapeRequest(_point, true, _sponsor);
emit EscapeRequested(_point, _sponsor);
}
// cancelEscape(): for _point, stop the current escape request, if any
//
function cancelEscape(uint32 _point)
onlyOwner
external
{
Point storage point = points[_point];
if (!point.escapeRequested)
{
return;
}
uint32 request = point.escapeRequestedTo;
registerEscapeRequest(_point, false, 0);
emit EscapeCanceled(_point, request);
}
// doEscape(): perform the requested escape
//
function doEscape(uint32 _point)
onlyOwner
external
{
Point storage point = points[_point];
require(point.escapeRequested);
registerSponsor(_point, true, point.escapeRequestedTo);
registerEscapeRequest(_point, false, 0);
emit EscapeAccepted(_point, point.sponsor);
}
//
// Point utils
//
// getPrefix(): compute prefix ("parent") of _point
//
function getPrefix(uint32 _point)
pure
public
returns (uint16 prefix)
{
if (_point < 0x10000)
{
return uint16(_point % 0x100);
}
return uint16(_point % 0x10000);
}
// getPointSize(): return the size of _point
//
function getPointSize(uint32 _point)
external
pure
returns (Size _size)
{
if (_point < 0x100) return Size.Galaxy;
if (_point < 0x10000) return Size.Star;
return Size.Planet;
}
// internal use
// registerSponsor(): set the sponsorship state of _point and update the
// reverse lookup for sponsors
//
function registerSponsor(uint32 _point, bool _hasSponsor, uint32 _sponsor)
internal
{
Point storage point = points[_point];
bool had = point.hasSponsor;
uint32 prev = point.sponsor;
// if we didn't have a sponsor, and won't get one,
// or if we get the sponsor we already have,
// nothing will change, so jump out early.
//
if ( (!had && !_hasSponsor) ||
(had && _hasSponsor && prev == _sponsor) )
{
return;
}
// if the point used to have a different sponsor, do some gymnastics
// to keep the reverse lookup gapless. delete the point from the old
// sponsor's list, then fill that gap with the list tail.
//
if (had)
{
// i: current index in previous sponsor's list of sponsored points
//
uint256 i = sponsoringIndexes[prev][_point];
// we store index + 1, because 0 is the solidity default value
//
assert(i > 0);
i--;
// copy the last item in the list into the now-unused slot,
// making sure to update its :sponsoringIndexes reference
//
uint32[] storage prevSponsoring = sponsoring[prev];
uint256 last = prevSponsoring.length - 1;
uint32 moved = prevSponsoring[last];
prevSponsoring[i] = moved;
sponsoringIndexes[prev][moved] = i + 1;
// delete the last item
//
delete(prevSponsoring[last]);
prevSponsoring.length = last;
sponsoringIndexes[prev][_point] = 0;
}
if (_hasSponsor)
{
uint32[] storage newSponsoring = sponsoring[_sponsor];
newSponsoring.push(_point);
sponsoringIndexes[_sponsor][_point] = newSponsoring.length;
}
point.sponsor = _sponsor;
point.hasSponsor = _hasSponsor;
}
// registerEscapeRequest(): set the escape state of _point and update the
// reverse lookup for sponsors
//
function registerEscapeRequest( uint32 _point,
bool _isEscaping, uint32 _sponsor )
internal
{
Point storage point = points[_point];
bool was = point.escapeRequested;
uint32 prev = point.escapeRequestedTo;
// if we weren't escaping, and won't be,
// or if we were escaping, and the new target is the same,
// nothing will change, so jump out early.
//
if ( (!was && !_isEscaping) ||
(was && _isEscaping && prev == _sponsor) )
{
return;
}
// if the point used to have a different request, do some gymnastics
// to keep the reverse lookup gapless. delete the point from the old
// sponsor's list, then fill that gap with the list tail.
//
if (was)
{
// i: current index in previous sponsor's list of sponsored points
//
uint256 i = escapeRequestsIndexes[prev][_point];
// we store index + 1, because 0 is the solidity default value
//
assert(i > 0);
i--;
// copy the last item in the list into the now-unused slot,
// making sure to update its :escapeRequestsIndexes reference
//
uint32[] storage prevRequests = escapeRequests[prev];
uint256 last = prevRequests.length - 1;
uint32 moved = prevRequests[last];
prevRequests[i] = moved;
escapeRequestsIndexes[prev][moved] = i + 1;
// delete the last item
//
delete(prevRequests[last]);
prevRequests.length = last;
escapeRequestsIndexes[prev][_point] = 0;
}
if (_isEscaping)
{
uint32[] storage newRequests = escapeRequests[_sponsor];
newRequests.push(_point);
escapeRequestsIndexes[_sponsor][_point] = newRequests.length;
}
point.escapeRequestedTo = _sponsor;
point.escapeRequested = _isEscaping;
}
//
// Deed reading
//
// owner
// getOwner(): return owner of _point
//
function getOwner(uint32 _point)
view
external
returns (address owner)
{
return rights[_point].owner;
}
// isOwner(): true if _point is owned by _address
//
function isOwner(uint32 _point, address _address)
view
external
returns (bool result)
{
return (rights[_point].owner == _address);
}
// getOwnedPointCount(): return length of array of points that _whose owns
//
function getOwnedPointCount(address _whose)
view
external
returns (uint256 count)
{
return pointsOwnedBy[_whose].length;
}
// getOwnedPoints(): return array of points that _whose owns
//
// Note: only useful for clients, as Solidity does not currently
// support returning dynamic arrays.
//
function getOwnedPoints(address _whose)
view
external
returns (uint32[] ownedPoints)
{
return pointsOwnedBy[_whose];
}
// getOwnedPointAtIndex(): get point at _index from array of points that
// _whose owns
//
function getOwnedPointAtIndex(address _whose, uint256 _index)
view
external
returns (uint32 point)
{
uint32[] storage owned = pointsOwnedBy[_whose];
require(_index < owned.length);
return owned[_index];
}
// management proxy
// getManagementProxy(): returns _point's current management proxy
//
function getManagementProxy(uint32 _point)
view
external
returns (address manager)
{
return rights[_point].managementProxy;
}
// isManagementProxy(): returns true if _proxy is _point's management proxy
//
function isManagementProxy(uint32 _point, address _proxy)
view
external
returns (bool result)
{
return (rights[_point].managementProxy == _proxy);
}
// canManage(): true if _who is the owner or manager of _point
//
function canManage(uint32 _point, address _who)
view
external
returns (bool result)
{
Deed storage deed = rights[_point];
return ( (0x0 != _who) &&
( (_who == deed.owner) ||
(_who == deed.managementProxy) ) );
}
// getManagerForCount(): returns the amount of points _proxy can manage
//
function getManagerForCount(address _proxy)
view
external
returns (uint256 count)
{
return managerFor[_proxy].length;
}
// getManagerFor(): returns the points _proxy can manage
//
// Note: only useful for clients, as Solidity does not currently
// support returning dynamic arrays.
//
function getManagerFor(address _proxy)
view
external
returns (uint32[] mfor)
{
return managerFor[_proxy];
}
// spawn proxy
// getSpawnProxy(): returns _point's current spawn proxy
//
function getSpawnProxy(uint32 _point)
view
external
returns (address spawnProxy)
{
return rights[_point].spawnProxy;
}
// isSpawnProxy(): returns true if _proxy is _point's spawn proxy
//
function isSpawnProxy(uint32 _point, address _proxy)
view
external
returns (bool result)
{
return (rights[_point].spawnProxy == _proxy);
}
// canSpawnAs(): true if _who is the owner or spawn proxy of _point
//
function canSpawnAs(uint32 _point, address _who)
view
external
returns (bool result)
{
Deed storage deed = rights[_point];
return ( (0x0 != _who) &&
( (_who == deed.owner) ||
(_who == deed.spawnProxy) ) );
}
// getSpawningForCount(): returns the amount of points _proxy
// can spawn with
//
function getSpawningForCount(address _proxy)
view
external
returns (uint256 count)
{
return spawningFor[_proxy].length;
}
// getSpawningFor(): get the points _proxy can spawn with
//
// Note: only useful for clients, as Solidity does not currently
// support returning dynamic arrays.
//
function getSpawningFor(address _proxy)
view
external
returns (uint32[] sfor)
{
return spawningFor[_proxy];
}
// voting proxy
// getVotingProxy(): returns _point's current voting proxy
//
function getVotingProxy(uint32 _point)
view
external
returns (address voter)
{
return rights[_point].votingProxy;
}
// isVotingProxy(): returns true if _proxy is _point's voting proxy
//
function isVotingProxy(uint32 _point, address _proxy)
view
external
returns (bool result)
{
return (rights[_point].votingProxy == _proxy);
}
// canVoteAs(): true if _who is the owner of _point,
// or the voting proxy of _point's owner
//
function canVoteAs(uint32 _point, address _who)
view
external
returns (bool result)
{
Deed storage deed = rights[_point];
return ( (0x0 != _who) &&
( (_who == deed.owner) ||
(_who == deed.votingProxy) ) );
}
// getVotingForCount(): returns the amount of points _proxy can vote as
//
function getVotingForCount(address _proxy)
view
external
returns (uint256 count)
{
return votingFor[_proxy].length;
}
// getVotingFor(): returns the points _proxy can vote as
//
// Note: only useful for clients, as Solidity does not currently
// support returning dynamic arrays.
//
function getVotingFor(address _proxy)
view
external
returns (uint32[] vfor)
{
return votingFor[_proxy];
}
// transfer proxy
// getTransferProxy(): returns _point's current transfer proxy
//
function getTransferProxy(uint32 _point)
view
external
returns (address transferProxy)
{
return rights[_point].transferProxy;
}
// isTransferProxy(): returns true if _proxy is _point's transfer proxy
//
function isTransferProxy(uint32 _point, address _proxy)
view
external
returns (bool result)
{
return (rights[_point].transferProxy == _proxy);
}
// canTransfer(): true if _who is the owner or transfer proxy of _point,
// or is an operator for _point's current owner
//
function canTransfer(uint32 _point, address _who)
view
external
returns (bool result)
{
Deed storage deed = rights[_point];
return ( (0x0 != _who) &&
( (_who == deed.owner) ||
(_who == deed.transferProxy) ||
operators[deed.owner][_who] ) );
}
// getTransferringForCount(): returns the amount of points _proxy
// can transfer
//
function getTransferringForCount(address _proxy)
view
external
returns (uint256 count)
{
return transferringFor[_proxy].length;
}
// getTransferringFor(): get the points _proxy can transfer
//
// Note: only useful for clients, as Solidity does not currently
// support returning dynamic arrays.
//
function getTransferringFor(address _proxy)
view
external
returns (uint32[] tfor)
{
return transferringFor[_proxy];
}
// isOperator(): returns true if _operator is allowed to transfer
// ownership of _owner's points
//
function isOperator(address _owner, address _operator)
view
external
returns (bool result)
{
return operators[_owner][_operator];
}
//
// Deed writing
//
// setOwner(): set owner of _point to _owner
//
// Note: setOwner() only implements the minimal data storage
// logic for a transfer; the full transfer is implemented in
// Ecliptic.
//
// Note: _owner must not be the zero address.
//
function setOwner(uint32 _point, address _owner)
onlyOwner
external
{
// prevent burning of points by making zero the owner
//
require(0x0 != _owner);
// prev: previous owner, if any
//
address prev = rights[_point].owner;
if (prev == _owner)
{
return;
}
// if the point used to have a different owner, do some gymnastics to
// keep the list of owned points gapless. delete this point from the
// list, then fill that gap with the list tail.
//
if (0x0 != prev)
{
// i: current index in previous owner's list of owned points
//
uint256 i = pointOwnerIndexes[prev][_point];
// we store index + 1, because 0 is the solidity default value
//
assert(i > 0);
i--;
// copy the last item in the list into the now-unused slot,
// making sure to update its :pointOwnerIndexes reference
//
uint32[] storage owner = pointsOwnedBy[prev];
uint256 last = owner.length - 1;
uint32 moved = owner[last];
owner[i] = moved;
pointOwnerIndexes[prev][moved] = i + 1;
// delete the last item
//
delete(owner[last]);
owner.length = last;
pointOwnerIndexes[prev][_point] = 0;
}
// update the owner list and the owner's index list
//
rights[_point].owner = _owner;
pointsOwnedBy[_owner].push(_point);
pointOwnerIndexes[_owner][_point] = pointsOwnedBy[_owner].length;
emit OwnerChanged(_point, _owner);
}
// setManagementProxy(): makes _proxy _point's management proxy
//
function setManagementProxy(uint32 _point, address _proxy)
onlyOwner
external
{
Deed storage deed = rights[_point];
address prev = deed.managementProxy;
if (prev == _proxy)
{
return;
}
// if the point used to have a different manager, do some gymnastics
// to keep the reverse lookup gapless. delete the point from the
// old manager's list, then fill that gap with the list tail.
//
if (0x0 != prev)
{
// i: current index in previous manager's list of managed points
//
uint256 i = managerForIndexes[prev][_point];
// we store index + 1, because 0 is the solidity default value
//
assert(i > 0);
i--;
// copy the last item in the list into the now-unused slot,
// making sure to update its :managerForIndexes reference
//
uint32[] storage prevMfor = managerFor[prev];
uint256 last = prevMfor.length - 1;
uint32 moved = prevMfor[last];
prevMfor[i] = moved;
managerForIndexes[prev][moved] = i + 1;
// delete the last item
//
delete(prevMfor[last]);
prevMfor.length = last;
managerForIndexes[prev][_point] = 0;
}
if (0x0 != _proxy)
{
uint32[] storage mfor = managerFor[_proxy];
mfor.push(_point);
managerForIndexes[_proxy][_point] = mfor.length;
}
deed.managementProxy = _proxy;
emit ChangedManagementProxy(_point, _proxy);
}
// setSpawnProxy(): makes _proxy _point's spawn proxy
//
function setSpawnProxy(uint32 _point, address _proxy)
onlyOwner
external
{
Deed storage deed = rights[_point];
address prev = deed.spawnProxy;
if (prev == _proxy)
{
return;
}
// if the point used to have a different spawn proxy, do some
// gymnastics to keep the reverse lookup gapless. delete the point
// from the old proxy's list, then fill that gap with the list tail.
//
if (0x0 != prev)
{
// i: current index in previous proxy's list of spawning points
//
uint256 i = spawningForIndexes[prev][_point];
// we store index + 1, because 0 is the solidity default value
//
assert(i > 0);
i--;
// copy the last item in the list into the now-unused slot,
// making sure to update its :spawningForIndexes reference
//
uint32[] storage prevSfor = spawningFor[prev];
uint256 last = prevSfor.length - 1;
uint32 moved = prevSfor[last];
prevSfor[i] = moved;
spawningForIndexes[prev][moved] = i + 1;
// delete the last item
//
delete(prevSfor[last]);
prevSfor.length = last;
spawningForIndexes[prev][_point] = 0;
}
if (0x0 != _proxy)
{
uint32[] storage sfor = spawningFor[_proxy];
sfor.push(_point);
spawningForIndexes[_proxy][_point] = sfor.length;
}
deed.spawnProxy = _proxy;
emit ChangedSpawnProxy(_point, _proxy);
}
// setVotingProxy(): makes _proxy _point's voting proxy
//
function setVotingProxy(uint32 _point, address _proxy)
onlyOwner
external
{
Deed storage deed = rights[_point];
address prev = deed.votingProxy;
if (prev == _proxy)
{
return;
}
// if the point used to have a different voter, do some gymnastics
// to keep the reverse lookup gapless. delete the point from the
// old voter's list, then fill that gap with the list tail.
//
if (0x0 != prev)
{
// i: current index in previous voter's list of points it was
// voting for
//
uint256 i = votingForIndexes[prev][_point];
// we store index + 1, because 0 is the solidity default value
//
assert(i > 0);
i--;
// copy the last item in the list into the now-unused slot,
// making sure to update its :votingForIndexes reference
//
uint32[] storage prevVfor = votingFor[prev];
uint256 last = prevVfor.length - 1;
uint32 moved = prevVfor[last];
prevVfor[i] = moved;
votingForIndexes[prev][moved] = i + 1;
// delete the last item
//
delete(prevVfor[last]);
prevVfor.length = last;
votingForIndexes[prev][_point] = 0;
}
if (0x0 != _proxy)
{
uint32[] storage vfor = votingFor[_proxy];
vfor.push(_point);
votingForIndexes[_proxy][_point] = vfor.length;
}
deed.votingProxy = _proxy;
emit ChangedVotingProxy(_point, _proxy);
}
// setManagementProxy(): makes _proxy _point's transfer proxy
//
function setTransferProxy(uint32 _point, address _proxy)
onlyOwner
external
{
Deed storage deed = rights[_point];
address prev = deed.transferProxy;
if (prev == _proxy)
{
return;
}
// if the point used to have a different transfer proxy, do some
// gymnastics to keep the reverse lookup gapless. delete the point
// from the old proxy's list, then fill that gap with the list tail.
//
if (0x0 != prev)
{
// i: current index in previous proxy's list of transferable points
//
uint256 i = transferringForIndexes[prev][_point];
// we store index + 1, because 0 is the solidity default value
//
assert(i > 0);
i--;
// copy the last item in the list into the now-unused slot,
// making sure to update its :transferringForIndexes reference
//
uint32[] storage prevTfor = transferringFor[prev];
uint256 last = prevTfor.length - 1;
uint32 moved = prevTfor[last];
prevTfor[i] = moved;
transferringForIndexes[prev][moved] = i + 1;
// delete the last item
//
delete(prevTfor[last]);
prevTfor.length = last;
transferringForIndexes[prev][_point] = 0;
}
if (0x0 != _proxy)
{
uint32[] storage tfor = transferringFor[_proxy];
tfor.push(_point);
transferringForIndexes[_proxy][_point] = tfor.length;
}
deed.transferProxy = _proxy;
emit ChangedTransferProxy(_point, _proxy);
}
// setOperator(): dis/allow _operator to transfer ownership of all points
// owned by _owner
//
// operators are part of the ERC721 standard
//
function setOperator(address _owner, address _operator, bool _approved)
onlyOwner
external
{
operators[_owner][_operator] = _approved;
}
}[{"constant":true,"inputs":[{"name":"","type":"uint32"},{"name":"","type":"uint32"}],"name":"escapeRequestsIndexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_whose","type":"address"}],"name":"getOwnedPoints","outputs":[{"name":"ownedPoints","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"votingFor","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint32"}],"name":"rights","outputs":[{"name":"owner","type":"address"},{"name":"managementProxy","type":"address"},{"name":"spawnProxy","type":"address"},{"name":"votingProxy","type":"address"},{"name":"transferProxy","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"transferringFor","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_sponsor","type":"uint32"}],"name":"isSponsor","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getManagementProxy","outputs":[{"name":"manager","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getContinuityNumber","outputs":[{"name":"continuityNumber","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint32"},{"name":"","type":"uint256"}],"name":"sponsoring","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_whose","type":"address"}],"name":"getOwnedPointCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"doEscape","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_whose","type":"address"},{"name":"_index","type":"uint256"}],"name":"getOwnedPointAtIndex","outputs":[{"name":"point","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getTransferProxy","outputs":[{"name":"transferProxy","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"isSpawnProxy","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"pointsOwnedBy","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"operators","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getSpawnCount","outputs":[{"name":"spawnCount","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"setSpawnProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"setTransferProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint32"},{"name":"","type":"uint32"}],"name":"sponsoringIndexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"isTransferProxy","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getVotingProxy","outputs":[{"name":"voter","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"isManagementProxy","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint32"}],"name":"votingForIndexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"isLive","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_sponsor","type":"uint32"}],"name":"getEscapeRequests","outputs":[{"name":"requests","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getSponsor","outputs":[{"name":"sponsor","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_sponsor","type":"uint32"}],"name":"getEscapeRequestsCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint32"}],"name":"pointOwnerIndexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getManagerFor","outputs":[{"name":"mfor","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint32"}],"name":"managerForIndexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"managerFor","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"isActive","outputs":[{"name":"equals","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getOwner","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint32"}],"name":"points","outputs":[{"name":"encryptionKey","type":"bytes32"},{"name":"authenticationKey","type":"bytes32"},{"name":"hasSponsor","type":"bool"},{"name":"active","type":"bool"},{"name":"escapeRequested","type":"bool"},{"name":"sponsor","type":"uint32"},{"name":"escapeRequestedTo","type":"uint32"},{"name":"cryptoSuiteVersion","type":"uint32"},{"name":"keyRevisionNumber","type":"uint32"},{"name":"continuityNumber","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getSpawningForCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"hasBeenLinked","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_who","type":"address"}],"name":"canTransfer","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint32"}],"name":"spawningForIndexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"hasSponsor","outputs":[{"name":"has","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"activatePoint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getSpawned","outputs":[{"name":"spawned","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"setManagementProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_who","type":"address"}],"name":"canSpawnAs","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getKeyRevisionNumber","outputs":[{"name":"revision","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_who","type":"address"}],"name":"canManage","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getTransferringFor","outputs":[{"name":"tfor","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getPointSize","outputs":[{"name":"_size","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_sponsor","type":"uint32"}],"name":"getSponsoringCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getSpawningFor","outputs":[{"name":"sfor","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"isEscaping","outputs":[{"name":"escaping","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint32"},{"name":"","type":"uint256"}],"name":"escapeRequests","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"setVotingProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_sponsor","type":"uint32"}],"name":"getSponsoring","outputs":[{"name":"sponsees","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_sponsor","type":"uint32"}],"name":"setEscapeRequest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isOperator","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_who","type":"address"}],"name":"canVoteAs","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_primary","type":"string"},{"name":"_secondary","type":"string"},{"name":"_tertiary","type":"string"}],"name":"setDnsDomains","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"loseSponsor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"registerSpawned","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getKeys","outputs":[{"name":"crypt","type":"bytes32"},{"name":"auth","type":"bytes32"},{"name":"suite","type":"uint32"},{"name":"revision","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"cancelEscape","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_address","type":"address"}],"name":"isOwner","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getManagerForCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint32"}],"name":"transferringForIndexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getVotingFor","outputs":[{"name":"vfor","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"spawningFor","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getTransferringForCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"isVotingProxy","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getPrefix","outputs":[{"name":"prefix","type":"uint16"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dnsDomains","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"incrementContinuityNumber","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getSpawnProxy","outputs":[{"name":"spawnProxy","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getEscapeRequest","outputs":[{"name":"escape","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_encryptionKey","type":"bytes32"},{"name":"_authenticationKey","type":"bytes32"},{"name":"_cryptoSuiteVersion","type":"uint32"}],"name":"setKeys","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getVotingForCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_sponsor","type":"uint32"}],"name":"isRequestingEscapeTo","outputs":[{"name":"equals","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"owner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"}],"name":"Activated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"prefix","type":"uint32"},{"indexed":true,"name":"child","type":"uint32"}],"name":"Spawned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"sponsor","type":"uint32"}],"name":"EscapeRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"sponsor","type":"uint32"}],"name":"EscapeCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"sponsor","type":"uint32"}],"name":"EscapeAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"sponsor","type":"uint32"}],"name":"LostSponsor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":false,"name":"encryptionKey","type":"bytes32"},{"indexed":false,"name":"authenticationKey","type":"bytes32"},{"indexed":false,"name":"cryptoSuiteVersion","type":"uint32"},{"indexed":false,"name":"keyRevisionNumber","type":"uint32"}],"name":"ChangedKeys","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":false,"name":"number","type":"uint32"}],"name":"BrokeContinuity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"spawnProxy","type":"address"}],"name":"ChangedSpawnProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"transferProxy","type":"address"}],"name":"ChangedTransferProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"managementProxy","type":"address"}],"name":"ChangedManagementProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"votingProxy","type":"address"}],"name":"ChangedVotingProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"primary","type":"string"},{"indexed":false,"name":"secondary","type":"string"},{"indexed":false,"name":"tertiary","type":"string"}],"name":"ChangedDns","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]Contract Creation Code
60806040523480156200001157600080fd5b5060008054600160a060020a03191633179055604080518082018252600b8082527f6578616d706c652e636f6d00000000000000000000000000000000000000000060208084018290528451808601865283815280820183905285518087019096529285528401526200008d9264010000000062000093810204565b62000307565b600054600160a060020a03163314620000ab57600080fd5b8251620000c090600490602086019062000262565b508151620000d690600590602085019062000262565b508051620000ec90600690602084019062000262565b507ffafd04ade1daae2e1fdb0fc1cc6a899fd424063ed5c92120e67e073053b9489883838360405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b83811015620001585781810151838201526020016200013e565b50505050905090810190601f168015620001865780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b83811015620001bb578181015183820152602001620001a1565b50505050905090810190601f168015620001e95780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b838110156200021e57818101518382015260200162000204565b50505050905090810190601f1680156200024c5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002a557805160ff1916838001178555620002d5565b82800160010185558215620002d5579182015b82811115620002d5578251825591602001919060010190620002b8565b50620002e3929150620002e7565b5090565b6200030491905b80821115620002e35760008155600101620002ee565b90565b613e0180620003176000396000f3006080604052600436106103bb5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301d8a97f81146103c05780630333d499146103f657806304bbb61d1461046757806304bc94e5146104a4578063073167da146104fe57806308083039146105225780630f934e661461055a578063108d995b1461059457806312ace2e6146105b257806312afbc78146105d357806313063180146105f457806322a7906f1461061457806324541f781461063857806324ba1a461461065657806324cf61b5146106805780632637588e146106a4578063293a9169146106cb5780632a19642c146106e95780632c7ba564146107135780632cce0e291461073d5780633262207c1461076157806333f337241461078b578063375e24c1146107a957806337de45c1146107d35780633b17b4ea146107fd5780633c01a9fa1461081b578063439f7d3c146108395780634448f5fb14610857578063474dbae714610875578063483a15ed1461089f57806352c0683b146108c05780635a83df54146108ea5780635e19b3051461090e578063621b23e21461092c57806363fa9a871461094a5780636436b1b9146109c65780636d09887b146109e7578063715018a614610a05578063728aa85714610a1a57806376944d5b14610a4457806377eb4c5014610a6e5780637bc702a114610a8c578063846f652b14610aaa5780638866bb2c14610ac85780638a27bf5914610af25780638d2d3f4114610b1c5780638da5cb5b14610b3a5780639137fe0a14610b4f57806391398f2514610b795780639397640514610b9a578063942324c314610bdc5780639b0d1b2c14610bfa5780639b350e1214610c1b5780639dd9019014610c39578063a297c1d814610c5a578063a46afef114610c84578063a634585914610ca2578063b6363cf214610cc6578063b65afedd14610ced578063bac55edd14610d17578063bc562b9e14610dec578063bc735d9014610e0a578063c17ad9d814610e36578063c210c62314610e54578063c6d761d414610e9e578063caf590f914610ebc578063d154126414610ee6578063d2588e2014610f07578063d2a9b6ed14610f31578063d5c5164f14610f52578063ddc3595014610f76578063e01cff8414610fa0578063e213c84014610fc1578063e4a358d714610feb578063eccc8ff114611020578063f2fde38b146110ad578063f4914919146110ce578063f4e3be2d146110ec578063f5af66211461110a578063f9b87d4014611128578063fdb357be14611154578063fde9073314611175575b600080fd5b3480156103cc57600080fd5b506103e463ffffffff60043581169060243516611199565b60408051918252519081900360200190f35b34801561040257600080fd5b50610417600160a060020a03600435166111b6565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561045357818101518382015260200161043b565b505050509050019250505060405180910390f35b34801561047357600080fd5b5061048b600160a060020a036004351660243561124f565b6040805163ffffffff9092168252519081900360200190f35b3480156104b057600080fd5b506104c263ffffffff60043516611297565b60408051600160a060020a0396871681529486166020860152928516848401529084166060840152909216608082015290519081900360a00190f35b34801561050a57600080fd5b5061048b600160a060020a03600435166024356112d9565b34801561052e57600080fd5b5061054663ffffffff600435811690602435166112f4565b604080519115158252519081900360200190f35b34801561056657600080fd5b5061057863ffffffff60043516611338565b60408051600160a060020a039092168252519081900360200190f35b3480156105a057600080fd5b5061048b63ffffffff6004351661135c565b3480156105be57600080fd5b5061048b63ffffffff60043516602435611391565b3480156105df57600080fd5b506103e4600160a060020a03600435166113ac565b34801561060057600080fd5b5061061263ffffffff600435166113c7565b005b34801561062057600080fd5b5061048b600160a060020a036004351660243561147f565b34801561064457600080fd5b5061057863ffffffff600435166114e1565b34801561066257600080fd5b5061054663ffffffff60043516600160a060020a0360243516611505565b34801561068c57600080fd5b5061048b600160a060020a0360043516602435611532565b3480156106b057600080fd5b50610546600160a060020a036004358116906024351661154d565b3480156106d757600080fd5b5061048b63ffffffff6004351661156d565b3480156106f557600080fd5b5061061263ffffffff60043516600160a060020a036024351661159a565b34801561071f57600080fd5b5061061263ffffffff60043516600160a060020a036024351661189c565b34801561074957600080fd5b506103e463ffffffff60043581169060243516611b9b565b34801561076d57600080fd5b5061054663ffffffff60043516600160a060020a0360243516611bb8565b34801561079757600080fd5b5061057863ffffffff60043516611be4565b3480156107b557600080fd5b5061054663ffffffff60043516600160a060020a0360243516611c08565b3480156107df57600080fd5b506103e4600160a060020a036004351663ffffffff60243516611c34565b34801561080957600080fd5b5061054663ffffffff60043516611c51565b34801561082757600080fd5b5061041763ffffffff60043516611ca4565b34801561084557600080fd5b5061048b63ffffffff60043516611d11565b34801561086357600080fd5b506103e463ffffffff60043516611d36565b34801561088157600080fd5b506103e4600160a060020a036004351663ffffffff60243516611d4e565b3480156108ab57600080fd5b50610417600160a060020a0360043516611d6b565b3480156108cc57600080fd5b506103e4600160a060020a036004351663ffffffff60243516611ddb565b3480156108f657600080fd5b5061048b600160a060020a0360043516602435611df8565b34801561091a57600080fd5b5061054663ffffffff60043516611e13565b34801561093857600080fd5b5061057863ffffffff60043516611e36565b34801561095657600080fd5b5061096863ffffffff60043516611e57565b604080519a8b5260208b0199909952961515898901529415156060890152921515608088015263ffffffff91821660a0880152811660c087015290811660e08601529081166101008501521661012083015251908190036101400190f35b3480156109d257600080fd5b506103e4600160a060020a0360043516611eeb565b3480156109f357600080fd5b5061054663ffffffff60043516611f06565b348015610a1157600080fd5b50610612611f3a565b348015610a2657600080fd5b5061054663ffffffff60043516600160a060020a0360243516611f99565b348015610a5057600080fd5b506103e4600160a060020a036004351663ffffffff60243516612025565b348015610a7a57600080fd5b5061054663ffffffff60043516612042565b348015610a9857600080fd5b5061061263ffffffff60043516612060565b348015610ab657600080fd5b5061041763ffffffff60043516612103565b348015610ad457600080fd5b5061061263ffffffff60043516600160a060020a0360243516612173565b348015610afe57600080fd5b5061054663ffffffff60043516600160a060020a0360243516612472565b348015610b2857600080fd5b5061048b63ffffffff600435166124cb565b348015610b4657600080fd5b506105786124fc565b348015610b5b57600080fd5b5061054663ffffffff60043516600160a060020a036024351661250b565b348015610b8557600080fd5b50610417600160a060020a0360043516612564565b348015610ba657600080fd5b50610bb863ffffffff600435166125d4565b60405180826002811115610bc857fe5b60ff16815260200191505060405180910390f35b348015610be857600080fd5b506103e463ffffffff6004351661260f565b348015610c0657600080fd5b50610417600160a060020a0360043516612627565b348015610c2757600080fd5b5061054663ffffffff60043516612697565b348015610c4557600080fd5b5061048b63ffffffff600435166024356126bb565b348015610c6657600080fd5b5061061263ffffffff60043516600160a060020a03602435166126d6565b348015610c9057600080fd5b5061041763ffffffff600435166129d5565b348015610cae57600080fd5b5061061263ffffffff60043581169060243516612a42565b348015610cd257600080fd5b50610546600160a060020a0360043581169060243516612ab8565b348015610cf957600080fd5b5061054663ffffffff60043516600160a060020a0360243516612ae6565b348015610d2357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261061294369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750612b3f9650505050505050565b348015610df857600080fd5b5061061263ffffffff60043516612cfe565b348015610e1657600080fd5b50610612600160a060020a03600435811690602435166044351515612da4565b348015610e4257600080fd5b5061061263ffffffff60043516612df5565b348015610e6057600080fd5b50610e7263ffffffff60043516612ea8565b60408051948552602085019390935263ffffffff91821684840152166060830152519081900360800190f35b348015610eaa57600080fd5b5061061263ffffffff60043516612efa565b348015610ec857600080fd5b5061054663ffffffff60043516600160a060020a0360243516612fa8565b348015610ef257600080fd5b506103e4600160a060020a0360043516612fd1565b348015610f1357600080fd5b506103e4600160a060020a036004351663ffffffff60243516612fec565b348015610f3d57600080fd5b50610417600160a060020a0360043516613009565b348015610f5e57600080fd5b5061048b600160a060020a0360043516602435613079565b348015610f8257600080fd5b5061061263ffffffff60043516600160a060020a0360243516613094565b348015610fac57600080fd5b506103e4600160a060020a0360043516613328565b348015610fcd57600080fd5b5061054663ffffffff60043516600160a060020a0360243516613343565b348015610ff757600080fd5b5061100963ffffffff6004351661336f565b6040805161ffff9092168252519081900360200190f35b34801561102c57600080fd5b50611038600435613394565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561107257818101518382015260200161105a565b50505050905090810190601f16801561109f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156110b957600080fd5b50610612600160a060020a036004351661342f565b3480156110da57600080fd5b5061061263ffffffff60043516613452565b3480156110f857600080fd5b5061057863ffffffff60043516613508565b34801561111657600080fd5b5061048b63ffffffff6004351661352d565b34801561113457600080fd5b5061061263ffffffff600435811690602435906044359060643516613556565b34801561116057600080fd5b506103e4600160a060020a036004351661369b565b34801561118157600080fd5b5061054663ffffffff600435811690602435166136b6565b600a60209081526000928352604080842090915290825290205481565b600160a060020a0381166000908152600b602090815260409182902080548351818402810184019094528084526060939283018282801561124257602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116112055790505b505050505090505b919050565b60116020528160005260406000208181548110151561126a57fe5b9060005260206000209060089182820401919006600402915091509054906101000a900463ffffffff1681565b600260208190526000918252604090912080546001820154928201546003830154600490930154600160a060020a039283169483169391831692918216911685565b60136020528160005260406000208181548110151561126a57fe5b63ffffffff82166000908152600160205260408120600381015460ff1680156113305750600381015463ffffffff848116630100000090920416145b949350505050565b63ffffffff16600090815260026020526040902060010154600160a060020a031690565b63ffffffff90811660009081526001602052604090206003015473010000000000000000000000000000000000000090041690565b60076020528160005260406000208181548110151561126a57fe5b600160a060020a03166000908152600b602052604090205490565b60008054600160a060020a031633146113df57600080fd5b5063ffffffff81166000908152600160205260409020600381015462010000900460ff16151561140e57600080fd5b61142e8260018360030160079054906101000a900463ffffffff16613705565b61143a826000806139bf565b600381015460405163ffffffff63010000009092048216918416907f7e447c9b1bda4b174b0796e100bf7f34ebf36dbb7fe665490b1bfce6246a9da590600090a35050565b600160a060020a0382166000908152600b60205260408120805483106114a457600080fd5b80838154811015156114b257fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691505092915050565b63ffffffff16600090815260026020526040902060040154600160a060020a031690565b63ffffffff9190911660009081526002602081905260409091200154600160a060020a0391821691161490565b600b6020528160005260406000208181548110151561126a57fe5b600360209081526000928352604080842090915290825290205460ff1681565b63ffffffff8116600090815260016020526040812060020154640100000000811061159457fe5b92915050565b60008054819081908190819081908190600160a060020a031633146115be57600080fd5b63ffffffff8916600090815260026020819052604090912090810154909750600160a060020a03908116965088168614156115f857611891565b600160a060020a0386161561176d57600160a060020a038616600090815260106020908152604080832063ffffffff8d1684529091528120549550851161163b57fe5b600160a060020a0386166000908152600f60205260409020805460001996870196919550908101935084908490811061167057fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691508184868154811015156116a757fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a03891682526010835260408083209186168352925220600186019055835484908490811061170c57fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff02191690558284816117419190613d06565b50600160a060020a038616600090815260106020908152604080832063ffffffff8d1684529091528120555b600160a060020a0388161561183f57600f600089600160a060020a0316600160a060020a0316815260200190815260200160002090508089908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050601060008a600160a060020a0316600160a060020a0316815260200190815260200160002060008b63ffffffff1663ffffffff168152602001908152602001600020819055505b600287018054600160a060020a031916600160a060020a038a1690811790915560405163ffffffff8b16907f902736af7b3cefe10d9e840aed0d687e35c84095122b25051a20ead8866f006d90600090a35b505050505050505050565b60008054819081908190819081908190600160a060020a031633146118c057600080fd5b63ffffffff891660009081526002602052604090206004810154909750600160a060020a03908116965088168614156118f857611891565b600160a060020a03861615611a6d57600160a060020a038616600090815260146020908152604080832063ffffffff8d1684529091528120549550851161193b57fe5b600160a060020a0386166000908152601360205260409020805460001996870196919550908101935084908490811061197057fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691508184868154811015156119a757fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a038916825260148352604080832091861683529252206001860190558354849084908110611a0c57fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff0219169055828481611a419190613d06565b50600160a060020a038616600090815260146020908152604080832063ffffffff8d1684529091528120555b600160a060020a03881615611b3f576013600089600160a060020a0316600160a060020a0316815260200190815260200160002090508089908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050601460008a600160a060020a0316600160a060020a0316815260200190815260200160002060008b63ffffffff1663ffffffff168152602001908152602001600020819055505b600487018054600160a060020a031916600160a060020a038a1690811790915560405163ffffffff8b16907fcfe369b7197e7f0cf06793ae2472a9b13583fecbed2f78dfa14d1f10796b847c90600090a3505050505050505050565b600860209081526000928352604080842090915290825290205481565b63ffffffff91909116600090815260026020526040902060040154600160a060020a0391821691161490565b63ffffffff16600090815260026020526040902060030154600160a060020a031690565b63ffffffff91909116600090815260026020526040902060010154600160a060020a0391821691161490565b601260209081526000928352604080842090915290825290205481565b63ffffffff81166000908152600160205260408120805415801590611c795750600181015415155b8015611c9d575060038101546b010000000000000000000000900463ffffffff1615155b9392505050565b63ffffffff8116600090815260096020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b63ffffffff908116600090815260016020526040902060030154630100000090041690565b63ffffffff1660009081526009602052604090205490565b600c60209081526000928352604080842090915290825290205481565b600160a060020a0381166000908152600d6020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b600e60209081526000928352604080842090915290825290205481565b600d6020528160005260406000208181548110151561126a57fe5b63ffffffff16600090815260016020526040902060030154610100900460ff1690565b63ffffffff16600090815260026020526040902054600160a060020a031690565b600160208190526000918252604090912080549181015460039091015460ff808216916101008104821691620100008204169063ffffffff6301000000820481169167010000000000000081048216916b01000000000000000000000082048116916f010000000000000000000000000000008104821691730100000000000000000000000000000000000000909104168a565b600160a060020a03166000908152600f602052604090205490565b63ffffffff9081166000908152600160205260408120600301546f0100000000000000000000000000000090049091161190565b600054600160a060020a03163314611f5157600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a260008054600160a060020a0319169055565b63ffffffff82166000908152600260205260408120600160a060020a0383161580159061133057508054600160a060020a0384811691161480611feb57506004810154600160a060020a038481169116145b8061133057508054600160a060020a0390811660009081526003602090815260408083209387168352929052205460ff1691505092915050565b601060209081526000928352604080842090915290825290205481565b63ffffffff1660009081526001602052604090206003015460ff1690565b60008054600160a060020a0316331461207857600080fd5b5063ffffffff811660009081526001602052604090206003810154610100900460ff16156120a557600080fd5b60038101805461ff0019166101001790556120ce8260016120c58261336f565b61ffff16613705565b60405163ffffffff8316907fe74c03809d0769e1b1f706cc8414258cd1f3b6fe020cd15d0165c210ba503a0f90600090a25050565b63ffffffff8116600090815260016020908152604091829020600201805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b60008054819081908190819081908190600160a060020a0316331461219757600080fd5b63ffffffff891660009081526002602052604090206001810154909750600160a060020a03908116965088168614156121cf57611891565b600160a060020a0386161561234457600160a060020a0386166000908152600e6020908152604080832063ffffffff8d1684529091528120549550851161221257fe5b600160a060020a0386166000908152600d60205260409020805460001996870196919550908101935084908490811061224757fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16915081848681548110151561227e57fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a0389168252600e83526040808320918616835292522060018601905583548490849081106122e357fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff02191690558284816123189190613d06565b50600160a060020a0386166000908152600e6020908152604080832063ffffffff8d1684529091528120555b600160a060020a0388161561241657600d600089600160a060020a0316600160a060020a0316815260200190815260200160002090508089908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050600e60008a600160a060020a0316600160a060020a0316815260200190815260200160002060008b63ffffffff1663ffffffff168152602001908152602001600020819055505b600187018054600160a060020a031916600160a060020a038a1690811790915560405163ffffffff8b16907fab9c9327cffd2acc168fafedbe06139f5f55cb84c761df05e0511c251e2ee9bf90600090a3505050505050505050565b63ffffffff82166000908152600260205260408120600160a060020a0383161580159061133057508054600160a060020a0384811691161480611330575060020154600160a060020a0390811692169190911492915050565b63ffffffff9081166000908152600160205260409020600301546f0100000000000000000000000000000090041690565b600054600160a060020a031681565b63ffffffff82166000908152600260205260408120600160a060020a0383161580159061133057508054600160a060020a0384811691161480611330575060010154600160a060020a0390811692169190911492915050565b600160a060020a038116600090815260136020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b60006101008263ffffffff1610156125ee5750600061124a565b620100008263ffffffff1610156126075750600161124a565b506002919050565b63ffffffff1660009081526007602052604090205490565b600160a060020a0381166000908152600f6020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b63ffffffff1660009081526001602052604090206003015462010000900460ff1690565b60096020528160005260406000208181548110151561126a57fe5b60008054819081908190819081908190600160a060020a031633146126fa57600080fd5b63ffffffff891660009081526002602052604090206003810154909750600160a060020a039081169650881686141561273257611891565b600160a060020a038616156128a757600160a060020a038616600090815260126020908152604080832063ffffffff8d1684529091528120549550851161277557fe5b600160a060020a038616600090815260116020526040902080546000199687019691955090810193508490849081106127aa57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691508184868154811015156127e157fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a03891682526012835260408083209186168352925220600186019055835484908490811061284657fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff021916905582848161287b9190613d06565b50600160a060020a038616600090815260126020908152604080832063ffffffff8d1684529091528120555b600160a060020a03881615612979576011600089600160a060020a0316600160a060020a0316815260200190815260200160002090508089908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050601260008a600160a060020a0316600160a060020a0316815260200190815260200160002060008b63ffffffff1663ffffffff168152602001908152602001600020819055505b600387018054600160a060020a031916600160a060020a038a1690811790915560405163ffffffff8b16907fcbd6269ec71457f2c7b1a22774f246f6c5a2eae3795ed7300db517680c61c80590600090a3505050505050505050565b63ffffffff8116600090815260076020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b600054600160a060020a03163314612a5957600080fd5b612a6382826136b6565b15612a6d57612ab4565b612a79826001836139bf565b8063ffffffff168263ffffffff167fb4d4850b8f218218141c5665cba379e53e9bb015b51e8d934be70210aead874a60405160405180910390a35b5050565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205460ff1690565b63ffffffff82166000908152600260205260408120600160a060020a0383161580159061133057508054600160a060020a0384811691161480611330575060030154600160a060020a0390811692169190911492915050565b600054600160a060020a03163314612b5657600080fd5b8251612b69906004906020860190613d3a565b508151612b7d906005906020850190613d3a565b508051612b91906006906020840190613d3a565b507ffafd04ade1daae2e1fdb0fc1cc6a899fd424063ed5c92120e67e073053b9489883838360405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b83811015612bfb578181015183820152602001612be3565b50505050905090810190601f168015612c285780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b83811015612c5b578181015183820152602001612c43565b50505050905090810190601f168015612c885780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b83811015612cbb578181015183820152602001612ca3565b50505050905090810190601f168015612ce85780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1505050565b60008054600160a060020a03163314612d1657600080fd5b5063ffffffff81166000908152600160205260409020600381015460ff161515612d3f57612ab4565b612d5f8260008360030160039054906101000a900463ffffffff16613705565b600381015460405163ffffffff63010000009092048216918416907fd7704f9a25193dbd0b0cb4a809feffffa7f19d1aae8817a71346c194448210d590600090a35050565b600054600160a060020a03163314612dbb57600080fd5b600160a060020a03928316600090815260036020908152604080832094909516825292909252919020805460ff1916911515919091179055565b60008054600160a060020a03163314612e0d57600080fd5b612e168261336f565b61ffff16905063ffffffff8216811415612e2f57612ab4565b63ffffffff80821660008181526001602081815260408084206002018054938401815584529083206008830401805488871660046007909516949094026101000a848102970219169590951790945592517fb2d3a6e7a339f5c8ff96265e2f03a010a8541070f3744a2470909644150815469190a35050565b63ffffffff9081166000908152600160208190526040909120805491810154600390910154919390926b01000000000000000000000083048116926f0100000000000000000000000000000090041690565b600080548190600160a060020a03163314612f1457600080fd5b63ffffffff83166000908152600160205260409020600381015490925062010000900460ff161515612f4557612fa3565b506003810154670100000000000000900463ffffffff16612f68836000806139bf565b8063ffffffff168363ffffffff167fd653bb0e0bb7ce8393e624d98fbf17cda5902c8328ed0cd09988f36890d9932a60405160405180910390a35b505050565b63ffffffff91909116600090815260026020526040902054600160a060020a0391821691161490565b600160a060020a03166000908152600d602052604090205490565b601460209081526000928352604080842090915290825290205481565b600160a060020a038116600090815260116020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b600f6020528160005260406000208181548110151561126a57fe5b600080548190819081908190600160a060020a031633146130b457600080fd5b600160a060020a03861615156130c957600080fd5b63ffffffff8716600090815260026020526040902054600160a060020a03908116955086168514156130fa5761331f565b600160a060020a0385161561326f57600160a060020a0385166000908152600c6020908152604080832063ffffffff8b1684529091528120549450841161313d57fe5b600160a060020a0385166000908152600b60205260409020805460001995860195919450908101925083908390811061317257fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1690508083858154811015156131a957fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a0388168252600c835260408083209185168352925220600185019055825483908390811061320e57fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff02191690558183816132439190613d06565b50600160a060020a0385166000908152600c6020908152604080832063ffffffff8b1684529091528120555b63ffffffff87811660008181526002602090815260408083208054600160a060020a031916600160a060020a038d16908117909155808452600b835281842080546001810182558186528486206008820401805460079092166004026101000a98890219909116978702979097179096558084529454600c835281842085855290925280832091909155517f16d0f539d49c6cad822b767a9445bfb1cf7ea6f2a6c2b120a7ea4cc7660d8fda9190a35b50505050505050565b600160a060020a031660009081526013602052604090205490565b63ffffffff91909116600090815260026020526040902060030154600160a060020a0391821691161490565b6000620100008263ffffffff16101561338c575060ff811661124a565b5061ffff1690565b600481600381106133a157fe5b018054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815293508301828280156134275780601f106133fc57610100808354040283529160200191613427565b820191906000526020600020905b81548152906001019060200180831161340a57829003601f168201915b505050505081565b600054600160a060020a0316331461344657600080fd5b61344f81613c96565b50565b60008054600160a060020a0316331461346a57600080fd5b5063ffffffff80821660008181526001602081815260409283902060038101805473010000000000000000000000000000000000000080820489169095018816850276ffffffff000000000000000000000000000000000000001990911617908190558451939004909516825291517f29294799f1c21a37ef838e15f79dd91bcee2df99d63cd1c18ac968b129514e6e929181900390910190a25050565b63ffffffff1660009081526002602081905260409091200154600160a060020a031690565b63ffffffff90811660009081526001602052604090206003015467010000000000000090041690565b60008054600160a060020a0316331461356e57600080fd5b5063ffffffff841660009081526001602052604090208054841480156135975750600181015483145b80156135be5750600381015463ffffffff8381166b01000000000000000000000090920416145b156135c857613694565b83815560018082018490556003820180546f0100000000000000000000000000000063ffffffff8087166b01000000000000000000000081026effffffff0000000000000000000000199094169390931782810482169095018116820272ffffffff0000000000000000000000000000001990951694909417928390556040805189815260208101899052808201939093529204831660608201529051918716917faa10e7a0117d4323f1d99d630ec169bebb3a988e895770e351987e01ff5423d59181900360800190a25b5050505050565b600160a060020a031660009081526011602052604090205490565b63ffffffff82166000908152600160205260408120600381015462010000900460ff16801561133057506003810154670100000000000000900463ffffffff9081169084161491505092915050565b63ffffffff80841660009081526001602052604081206003810154909260ff821692630100000090920416908080808086158015613741575089155b8061376857508680156137515750895b801561376857508863ffffffff168663ffffffff16145b15613772576139b2565b86156138cc5763ffffffff8087166000908152600860209081526040808320938f16835292905290812054955085116137a757fe5b63ffffffff8616600090815260076020526040902080546000199687019691955090810193508490849081106137d957fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16915081848681548110151561381057fe5b600091825260208083206008808404909101805460079094166004026101000a63ffffffff818102199095169685160295909517909455898216835292835260408083209186168352925220600186019055835484908490811061387057fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff02191690558284816138a59190613d06565b5063ffffffff8087166000908152600860209081526040808320938f168352929052908120555b891561398957600760008a63ffffffff1663ffffffff1681526020019081526020016000209050808b908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050600860008b63ffffffff1663ffffffff16815260200190815260200160002060008d63ffffffff1663ffffffff168152602001908152602001600020819055505b60038801805466ffffffff0000001916630100000063ffffffff8c16021760ff19168b15151790555b5050505050505050505050565b63ffffffff80841660009081526001602052604081206003810154909260ff620100008304169267010000000000000090920416908080808086158015613a04575089155b80613a2b5750868015613a145750895b8015613a2b57508863ffffffff168663ffffffff16145b15613a35576139b2565b8615613b8d5763ffffffff8087166000908152600a60209081526040808320938f1683529290529081205495508511613a6a57fe5b63ffffffff861660009081526009602052604090208054600019968701969195509081019350849084908110613a9c57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff169150818486815481101515613ad357fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff8181021990941695841602949094179093558881168252600a8352604080832091861683529252206001860190558354849084908110613b3157fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff0219169055828481613b669190613d06565b5063ffffffff8087166000908152600a60209081526040808320938f168352929052908120555b8915613c4a57600960008a63ffffffff1663ffffffff1681526020019081526020016000209050808b908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050600a60008b63ffffffff1663ffffffff16815260200190815260200160002060008d63ffffffff1663ffffffff168152602001908152602001600020819055505b6003880180548b1515620100000262ff00001963ffffffff8d16670100000000000000026affffffff000000000000001990931692909217919091161790555050505050505050505050565b600160a060020a0381161515613cab57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a031916600160a060020a0392909216919091179055565b815481835581811115612fa3576007016008900481600701600890048360005260206000209182019101612fa39190613db8565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613d7b57805160ff1916838001178555613da8565b82800160010185558215613da8579182015b82811115613da8578251825591602001919060010190613d8d565b50613db4929150613db8565b5090565b613dd291905b80821115613db45760008155600101613dbe565b905600a165627a7a72305820e17b29d41082d92ff3fcb77ee16ddd9cee4ce75a55eb3bc727ed72ff0e59df930029
Swarm Source
bzzr://e17b29d41082d92ff3fcb77ee16ddd9cee4ce75a55eb3bc727ed72ff0e59df93
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

