Skip to content
This repository was archived by the owner on Mar 19, 2019. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 94 additions & 19 deletions contracts/BrokerRegistry.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,22 @@ pragma solidity 0.4.23;
pragma experimental "v0.5.0";
pragma experimental "ABIEncoderV2";

import "./IBrokerRegistry.sol";

/// @title Trade Broker
/// @dev A broker is an account that can submit order on behalf of other
/// accounts. When register a broker, the owner can also specify a
/// pre-deployed BrokerInterceptor to manage the allowance of the
/// specific broker.

/// @title An Implementation of IBrokerRegistry.
/// @author Daniel Wang - <daniel@loopring.org>.
contract BrokerRegistry {
event BrokerRegistered(
address owner,
address broker,
address interceptor
);
contract BrokerRegistry is IBrokerRegistry {
struct Broker {
uint pos; // 0 mens unregistered; if > 0, pos - 1 is the
// token's position in `addresses`.
address owner;
address addr;
address interceptor;
}

event BrokerUnregistered(
address owner,
address broker
);
mapping(address => Broker[]) public brokerageMap;
mapping(address => mapping(address => Broker)) public brokerMap;

function getBroker(
address owner,
Expand All @@ -46,7 +44,12 @@ contract BrokerRegistry {
returns(
bool registered,
address interceptor
);
)
{
Broker storage b = brokerMap[owner][broker];
registered = (b.addr == broker);
interceptor = b.interceptor;
}

function getBrokers(
uint start,
Expand All @@ -57,16 +60,88 @@ contract BrokerRegistry {
returns (
address[] brokers,
address[] interceptors
);
)
{
Broker[] storage _brokers = brokerageMap[msg.sender];
uint num = _brokers.length;

if (start >= num) {
return;
}

uint end = start + count;
if (end > num) {
end = num;
}

if (start == num) {
return;
}

brokers = new address[](end - start);
interceptors = new address[](end - start);
for (uint i = start; i < end; i++) {
brokers[i - start] = _brokers[i].addr;
interceptors[i - start] = _brokers[i].interceptor;
}
}

function registerBroker(
address broker,
address interceptor // 0x0 allowed
)
external;
external
{
require(0x0 != broker,"bad broker");
require(
0 == brokerMap[msg.sender][broker].pos,
"broker already exists"
);

Broker[] storage brokers = brokerageMap[msg.sender];
Broker memory b = Broker(
brokers.length + 1,
msg.sender,
broker,
interceptor
);

brokers.push(b);
brokerMap[msg.sender][broker] = b;

emit BrokerRegistered(
msg.sender,
broker,
interceptor
);
}

function unregisterBroker(
address broker
)
external;
external
{
require(0x0 != broker, "bad broker");
require(
brokerMap[msg.sender][broker].addr == broker,
"broker not found"
);

Broker storage b = brokerMap[msg.sender][broker];
delete brokerMap[msg.sender][broker];

Broker[] storage brokers = brokerageMap[msg.sender];
Broker storage lastBroker = brokers[brokers.length - 1];

if (lastBroker.addr != broker) {
// Swap with the last token and update the pos
lastBroker.pos = b.pos;
brokers[b.pos - 1] = lastBroker;
brokerMap[lastBroker.owner][lastBroker.addr] = lastBroker;
}

brokers.length--;

emit BrokerUnregistered(msg.sender, broker);
}
}
147 changes: 0 additions & 147 deletions contracts/BrokerRegistryImpl.sol

This file was deleted.

Loading