This repository has been archived by the owner on Dec 27, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 44
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 #72 from connext/66-generic-transfers
66 generic transfers
- Loading branch information
Showing
63 changed files
with
1,115 additions
and
634 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
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,44 @@ | ||
// SPDX-License-Identifier: UNLICENSED | ||
pragma solidity ^0.7.1; | ||
pragma experimental ABIEncoderV2; | ||
|
||
import "./interfaces/ITransferRegistry.sol"; | ||
import "./interfaces/Types.sol"; | ||
import "./lib/LibIterableMapping.sol"; | ||
|
||
|
||
contract TransferRegistry is ITransferRegistry { | ||
|
||
using LibIterableMapping for LibIterableMapping.IterableMapping; | ||
|
||
address immutable owner; | ||
|
||
LibIterableMapping.IterableMapping transfers; | ||
|
||
constructor() { | ||
owner = msg.sender; | ||
} | ||
|
||
modifier onlyOwner() { | ||
require(msg.sender == owner, "Only owner can call function"); | ||
_; | ||
} | ||
|
||
// Should add a transfer definition to the registry | ||
// onlyOwner | ||
function addTransferDefinition(RegisteredTransfer memory definition) external override onlyOwner { | ||
transfers.addTransferDefinition(definition); | ||
} | ||
|
||
// Should remove a transfer definition from the registry | ||
// onlyOwner | ||
function removeTransferDefinition(string memory name) external override onlyOwner { | ||
transfers.removeTransferDefinition(name); | ||
} | ||
|
||
// Should return all transfer defintions in registry | ||
function getTransferDefinitions() external override view returns (RegisteredTransfer[] memory) { | ||
return transfers.getTransferDefinitions(); | ||
} | ||
|
||
} |
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
18 changes: 18 additions & 0 deletions
18
modules/contracts/src.sol/interfaces/ITransferRegistry.sol
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,18 @@ | ||
// SPDX-License-Identifier: UNLICENSED | ||
pragma solidity ^0.7.1; | ||
pragma experimental "ABIEncoderV2"; | ||
|
||
import "./Types.sol"; | ||
|
||
interface ITransferRegistry { | ||
// Should add a transfer definition to the registry | ||
// onlyOwner | ||
function addTransferDefinition(RegisteredTransfer memory transfer) external; | ||
|
||
// Should remove a transfer definition to the registry | ||
// onlyOwner | ||
function removeTransferDefinition(string memory name) external; | ||
|
||
// Should return all transfer defintions in registry | ||
function getTransferDefinitions() external view returns (RegisteredTransfer[] memory); | ||
} |
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,80 @@ | ||
// SPDX-License-Identifier: UNLICENSED | ||
pragma solidity ^0.7.1; | ||
pragma experimental ABIEncoderV2; | ||
|
||
import "../interfaces/Types.sol"; | ||
|
||
library LibIterableMapping { | ||
struct TransferDefinitionWithIndex { | ||
RegisteredTransfer transfer; | ||
uint256 index; | ||
} | ||
|
||
struct IterableMapping { | ||
mapping(string => TransferDefinitionWithIndex) transfers; | ||
string[] names; | ||
} | ||
|
||
function stringEqual(string memory s, string memory t) internal pure returns (bool) { | ||
return keccak256(abi.encodePacked(s)) == keccak256(abi.encodePacked(t)); | ||
} | ||
|
||
function isEmptyString(string memory s) internal pure returns (bool) { | ||
return stringEqual(s, ""); | ||
} | ||
|
||
function nameExists(IterableMapping storage self, string memory name) internal view returns (bool) { | ||
return !isEmptyString(name) && self.names.length != 0 && stringEqual(self.names[self.transfers[name].index], name); | ||
} | ||
|
||
function length(IterableMapping storage self) internal view returns (uint256) { | ||
return self.names.length; | ||
} | ||
|
||
function getTransferDefinitionByName(IterableMapping storage self, string memory name) | ||
internal | ||
view | ||
returns (RegisteredTransfer memory) | ||
{ | ||
require(!isEmptyString(name)); | ||
require(nameExists(self, name)); | ||
return self.transfers[name].transfer; | ||
} | ||
|
||
function getTransferDefinitionByIndex(IterableMapping storage self, uint256 index) | ||
internal | ||
view | ||
returns (RegisteredTransfer memory) | ||
{ | ||
require(index < self.names.length); | ||
return self.transfers[self.names[index]].transfer; | ||
} | ||
|
||
function getTransferDefinitions(IterableMapping storage self) internal view returns (RegisteredTransfer[] memory) { | ||
uint256 l = self.names.length; | ||
RegisteredTransfer[] memory transfers = new RegisteredTransfer[](l); | ||
for (uint256 i = 0; i < l; i++) { | ||
transfers[i] = self.transfers[self.names[i]].transfer; | ||
} | ||
return transfers; | ||
} | ||
|
||
function addTransferDefinition(IterableMapping storage self, RegisteredTransfer memory transfer) internal { | ||
string memory name = transfer.name; | ||
require(!isEmptyString(name)); | ||
require(!nameExists(self, name)); | ||
self.transfers[name] = TransferDefinitionWithIndex({transfer: transfer, index: self.names.length}); | ||
self.names.push(name); | ||
} | ||
|
||
function removeTransferDefinition(IterableMapping storage self, string memory name) internal { | ||
require(!isEmptyString(name)); | ||
require(nameExists(self, name)); | ||
uint256 index = self.transfers[name].index; | ||
string memory lastName = self.names[self.names.length - 1]; | ||
self.transfers[lastName].index = index; | ||
self.names[index] = lastName; | ||
delete self.transfers[name]; | ||
self.names.pop(); | ||
} | ||
} |
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 |
---|---|---|
@@ -1,3 +1,4 @@ | ||
export { registerTransfer, registerTransferCommand } from "./registerTransfer"; | ||
export { fund, fundCommand } from "./fund"; | ||
export { migrate, migrateCommand } from "./migrate"; | ||
export { newToken, newTokenCommand } from "./newToken"; |
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,16 @@ | ||
import { TransferNames } from "@connext/vector-types"; | ||
import { expect } from "@connext/vector-utils"; | ||
|
||
import { addressBookPath, alice } from "../tests"; | ||
|
||
import { migrate } from "./migrate"; | ||
import { registerTransfer } from "./registerTransfer"; | ||
|
||
describe("registerTransfer()", () => { | ||
beforeEach(async () => { | ||
await expect(migrate(alice, addressBookPath, true)).to.be.fulfilled; | ||
}); | ||
it("should run without error", async () => { | ||
await expect(registerTransfer(TransferNames.HashlockTransfer, alice, addressBookPath, false)).to.be.fulfilled; | ||
}); | ||
}); |
Oops, something went wrong.