-
Notifications
You must be signed in to change notification settings - Fork 45
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #223 from livepeer/yf/registry
Implement LIP-9: Service Registry
- Loading branch information
Showing
4 changed files
with
142 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
pragma solidity ^0.4.17; | ||
|
||
import "./ManagerProxyTarget.sol"; | ||
|
||
|
||
/** | ||
* @title ServiceRegistry | ||
* @dev Maintains a registry of service metadata associated with service provider addresses (transcoders/orchestrators) | ||
*/ | ||
contract ServiceRegistry is ManagerProxyTarget { | ||
// Store service metadata | ||
struct Record { | ||
string serviceURI; // Service URI endpoint that can be used to send off-chain requests | ||
} | ||
|
||
// Track records for addresses | ||
mapping (address => Record) private records; | ||
|
||
// Event fired when a caller updates its service URI endpoint | ||
event ServiceURIUpdate(address indexed addr, string serviceURI); | ||
|
||
/** | ||
* @dev ServiceRegistry constructor. Only invokes constructor of base Manager contract with provided Controller address | ||
* @param _controller Address of a Controller that this contract will be registered with | ||
*/ | ||
function ServiceRegistry(address _controller) public Manager(_controller) {} | ||
|
||
/** | ||
* @dev Stores service URI endpoint for the caller that can be used to send requests to the caller off-chain | ||
* @param _serviceURI Service URI endpoint for the caller | ||
*/ | ||
function setServiceURI(string _serviceURI) external { | ||
records[msg.sender].serviceURI = _serviceURI; | ||
|
||
ServiceURIUpdate(msg.sender, _serviceURI); | ||
} | ||
|
||
/** | ||
* @dev Returns service URI endpoint stored for a given address | ||
* @param _addr Address for which a service URI endpoint is desired | ||
*/ | ||
function getServiceURI(address _addr) public view returns (string) { | ||
return records[_addr].serviceURI; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
import Fixture from "./helpers/Fixture" | ||
|
||
const ServiceRegistry = artifacts.require("ServiceRegistry") | ||
|
||
contract("ServiceRegistry", accounts => { | ||
describe("constructor", () => { | ||
it("invokes base Manager contract constructor", async () => { | ||
// Use dummy Controller | ||
const controller = accounts[0] | ||
const registry = await ServiceRegistry.new(controller) | ||
|
||
assert.equal(await registry.controller.call(), controller, "wrong Controller address") | ||
}) | ||
}) | ||
|
||
let fixture | ||
let registry | ||
|
||
before(async () => { | ||
fixture = new Fixture(web3) | ||
|
||
// Use dummy Controller in these unit tests | ||
// We are testing the logic of ServiceRegistry directly so we do not | ||
// interact with the contract via a proxy | ||
// Thus, we do not need an actual Controller for the tests | ||
const controller = accounts[0] | ||
|
||
registry = await ServiceRegistry.new(controller) | ||
}) | ||
|
||
beforeEach(async () => { | ||
await fixture.setUp() | ||
}) | ||
|
||
afterEach(async () => { | ||
await fixture.tearDown() | ||
}) | ||
|
||
describe("setServiceURI", () => { | ||
it("stores service URI endpoint for caller", async () => { | ||
await registry.setServiceURI("foo", {from: accounts[0]}) | ||
await registry.setServiceURI("bar", {from: accounts[1]}) | ||
|
||
assert.equal(await registry.getServiceURI(accounts[0]), "foo", "wrong service URI stored for caller 1") | ||
assert.equal(await registry.getServiceURI(accounts[1]), "bar", "wrong service URI stored for caller 2") | ||
}) | ||
|
||
it("fires ServiceURIUpdate event", async () => { | ||
let e = registry.ServiceURIUpdate({}) | ||
|
||
e.watch(async (err, result) => { | ||
e.stopWatching() | ||
|
||
assert.equal(result.args.addr, accounts[0], "wrong address in ServiceURIUpdate event") | ||
assert.equal(result.args.serviceURI, "foo", "wrong service URI in ServiceURIUpdate event") | ||
}) | ||
|
||
await registry.setServiceURI("foo", {from: accounts[0]}) | ||
}) | ||
}) | ||
|
||
describe("getServiceURI", () => { | ||
it("returns service URI endpoint for provided address", async () => { | ||
await registry.setServiceURI("foo", {from: accounts[0]}) | ||
await registry.setServiceURI("bar", {from: accounts[1]}) | ||
|
||
assert.equal(await registry.getServiceURI(accounts[0]), "foo", "wrong service URI stored for caller 1") | ||
assert.equal(await registry.getServiceURI(accounts[1]), "bar", "wrong service URI stored for caller 2") | ||
}) | ||
|
||
it("returns empty string for address without stored service URI endpoint", async () => { | ||
assert.equal(await registry.getServiceURI(accounts[5]), "", "should return empty string for address without service URI") | ||
}) | ||
}) | ||
}) |