Skip to content
Open
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
47 changes: 22 additions & 25 deletions contracts/SpaceBridge.sol
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,17 @@ contract SpaceBridge is ReentrancyGuard,
uint24 dst_network,
uint256 amount,
address hash,
address src_address
address src_address,
uint256 nonce
);

event Burn(
bytes dst_address,
uint24 dst_network,
uint256 amount,
address hash,
address src_address
address src_address,
uint256 nonce
);

event Unlock(
Expand All @@ -80,9 +82,13 @@ contract SpaceBridge is ReentrancyGuard,
spaceStorage = ISpaceStorage(_storage);
}

function getTransfer(string memory src_address, string memory src_hash, uint256 src_network, string memory dst_address, uint256 dst_network) external view returns (uint256) {
bytes32 id = TransferKey.compute(src_address, src_hash, src_network, dst_address, dst_network);
return spaceStorage.transfers(id);
function getChannelNonce(string memory src_address, string memory src_hash, uint256 src_network, string memory dst_address, uint256 dst_network) external view returns (uint256) {
bytes32 id = TransferKey.compute(src_address, src_hash, src_network, dst_address, dst_network);
return spaceStorage.transfers(id);
}

function getChannelId(string memory src_address, string memory src_hash, uint256 src_network, string memory dst_address, uint256 dst_network) external pure returns (bytes32) {
return TransferKey.compute(src_address, src_hash, src_network, dst_address, dst_network);
}

//
Expand All @@ -104,10 +110,6 @@ contract SpaceBridge is ReentrancyGuard,
//
// LOCK
//
//@param dst_address - адрес получателя в сети назначения
//@param dst_network - идентификатор сети назначения
//@param amount - количество
//@param hash - хеш токена в сети отправления
function lock(bytes memory dst_address, uint24 dst_network, uint256 amount, address hash, uint256 nonce) checkSetup nonReentrant external {
require(
spaceStorage.known_networks(dst_network).valid,
Expand Down Expand Up @@ -146,10 +148,10 @@ contract SpaceBridge is ReentrancyGuard,

if(bytes(spaceStorage.minted(hash).origin_hash).length == 0){
vault.deposit(hash, msg.sender, amount);
emit Lock(dst_address, dst_network, amount, hash, msg.sender);
emit Lock(dst_address, dst_network, amount, hash, msg.sender, nonce);
}else{
vault.burn(hash, msg.sender, amount);
emit Burn(dst_address, dst_network, amount, hash, msg.sender);
emit Burn(dst_address, dst_network, amount, hash, msg.sender, nonce);
}

spaceStorage.incrementNonce(TransferKey.compute(Converter.toAsciiString(msg.sender), Converter.toAsciiString(hash), network_id, string(abi.encodePacked(dst_address)), dst_network));
Expand All @@ -176,34 +178,29 @@ contract SpaceBridge is ReentrancyGuard,
"Invalid signature"
);

if((ticket.origin_network == ticket.src_network) || ((ticket.origin_network != ticket.src_network) && (ticket.origin_network != network_id))) { //EСЛИ *origin_network* РАВНО *src_network*
address token_address = spaceStorage.getAddressFromOriginHahs(ticket.origin_hash);
// ТО ЕСЛИ {*origin_hash*, *origin_network*} СОДЕРЖИТСЯ В {*contract.minted.origin.hash*, *contract.minted.origin.network*}
// TO сминтить_токен(*amount*, *contract.minted.wrapped_hash*)
// передать_актив(*dst_address*, *amount*, *contract.minted.wrapped_hash*)
// ИНАЧЕ
if((ticket.origin_network == ticket.src_network) || ((ticket.origin_network != ticket.src_network) && (ticket.origin_network != network_id))) {
address token_address = spaceStorage.getAddressFromOriginHash(ticket.origin_hash);
if(token_address == address(0x0)){
// *new_hash* = создать_токен(*amount*)
bytes memory bytes_hash = bytes(ticket.origin_hash);
token_address = vault.deploy(
string(abi.encodePacked(ticket.name)),
string(abi.encodePacked(ticket.symbol)),
ticket.origin_network,
bytes_hash);
bytes_hash,
ticket.origin_decimals);
spaceStorage.addMinted(
token_address,
ticket.origin_hash,
Storage.TKN({
origin_network: ticket.origin_network,
origin_hash: ticket.origin_hash}
)
);//ВСТАВИТЬ {*new_hash*, *origin_hash*, *origin_network*} В *minted*
origin_hash: ticket.origin_hash,
origin_decimals: ticket.origin_decimals})
);
}
// передать_актив(*new_hash*, *dst_address*, *amount*)
vault.mint(token_address, ticket.dst_address, ticket.amount);
emit Mint(token_address, ticket.dst_address, ticket.amount);
} else { //if(ticket.origin_network == network_id) { // ИНАЧЕ ЕСЛИ *origin_network* РАВНО *contract.network_id*
vault.withdraw(spaceStorage.lock_map(ticket.origin_hash), ticket.dst_address, ticket.amount); // ТО передать_актив(*dst_address*, *amount*, *origin_hash*)
} else {
vault.withdraw(spaceStorage.lock_map(ticket.origin_hash), ticket.dst_address, ticket.amount);
emit Unlock(ticket.dst_address, ticket.amount);
}
spaceStorage.incrementNonce(TransferKey.compute(ticket.src_address, ticket.src_hash, ticket.src_network, Converter.toAsciiString(ticket.dst_address), ticket.dst_network));
Expand Down
27 changes: 18 additions & 9 deletions contracts/SpaceStorage.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,37 +7,46 @@ import {Storage} from "./libraries/Struct.sol";

contract SpaceStorage is OnlyGovernance, OnlyBridge {

uint nextValidatorId = 1;
// количество подписей, необходимых для перевода активов
uint24 public threshold;
mapping(address => uint) public validators;
mapping(address => bool) public validators;

mapping(uint256 => Storage.NETWORK) public known_networks;

mapping(address => Storage.TKN) _minted;

mapping(string => address) public getAddressFromOriginHahs;
mapping(string => address) public getAddressFromOriginHash;

mapping(bytes32 => uint256) public transfers;

mapping(string => address) public lock_map;

function addNetwork(uint256 id, uint8 decimals_) onlyGovernance external {
require(
!known_networks[id].valid,
"Network exist"
);
known_networks[id] = Storage.NETWORK({valid:true, decimals:decimals_});
}

function removeNetwork(uint256 id) onlyGovernance external {
require(
known_networks[id].valid,
"dosnt exist network"
);
delete known_networks[id];
}

function addValidator(address validator) onlyGovernance public {
require(
validators[validator] == 0,
!validators[validator],
"Owner exist"
);
validators[validator] = nextValidatorId;
nextValidatorId++;
validators[validator] = true;
}

function removeValidator(address validator) onlyGovernance external {
require(
validators[validator] != 0,
validators[validator],
"dosnt exist owner"
);
delete validators[validator];
Expand All @@ -49,7 +58,7 @@ contract SpaceStorage is OnlyGovernance, OnlyBridge {

function addMinted(address token_address, string memory origin_hash, Storage.TKN memory tkn) onlyBridge external {
_minted[token_address] = tkn;
getAddressFromOriginHahs[origin_hash] = token_address;
getAddressFromOriginHash[origin_hash] = token_address;
}

function incrementNonce(bytes32 key) onlyBridge external {
Expand Down
5 changes: 3 additions & 2 deletions contracts/SpaceVault.sol
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,10 @@ contract SpaceVault is IVault,
string memory name,
string memory symbol,
uint256 origin,
bytes memory origin_hash
bytes memory origin_hash,
uint8 origin_decimals
) nonReentrant onlyBridge external override returns(address){
return _deploy(name, symbol, origin, origin_hash);
return _deploy(name, symbol, origin, origin_hash, origin_decimals);
}

function mint(
Expand Down
11 changes: 6 additions & 5 deletions contracts/interfaces/ISpaceStorage.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ interface ISpaceStorage {
function threshold() external view returns (uint24);

// Function signature for mapping
function validators(address key) external view returns (uint);
function validators(address key) external view returns (bool);

// Function signature for mapping
function known_networks(uint256 key) external view returns (Storage.NETWORK memory);

// Function signature for mapping
function minted(address key) external view returns (Storage.TKN memory);
// Function signature for mapping
function getAddressFromOriginHahs(string memory key) external view returns (address);
function getAddressFromOriginHash(string memory key) external view returns (address);

// Function signature for mapping
function transfers(bytes32 key) external view returns (uint256);
Expand All @@ -35,6 +35,10 @@ interface ISpaceStorage {
uint8
) external;

function removeNetwork(
uint256 id
) external;

function addValidator(
address
) external;
Expand All @@ -61,7 +65,4 @@ interface ISpaceStorage {
string memory t,
address token_hash
) external;



}
3 changes: 2 additions & 1 deletion contracts/interfaces/IVault.sol
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ interface IVault {
string memory name,
string memory symbol,
uint256 origin,
bytes memory origin_hash
bytes memory origin_hash,
uint8 origin_decimals
) external returns(address);

function mint(
Expand Down
3 changes: 2 additions & 1 deletion contracts/interfaces/IWrapedTokenDeployer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ interface IWrapedTokenDeployer {
external
returns (
uint256 origin,
bytes memory origin_hash
bytes memory origin_hash,
uint8 origin_decimals
);
}
1 change: 1 addition & 0 deletions contracts/libraries/Converter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ library Converter {
ticket.dst_network,
ticket.name,
ticket.nonce,
ticket.origin_decimals,
ticket.origin_hash,
ticket.origin_network,
ticket.src_address,
Expand Down
2 changes: 1 addition & 1 deletion contracts/libraries/ECDSA.sol
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ library ECDSA {
//4 - v
for (uint i=0; i<signatures.length; i++){
// bytes32
if(_storage.validators(ecrecover(hash, signatures[i].v, signatures[i].r, signatures[i].s)) != 0){
if(_storage.validators(ecrecover(hash, signatures[i].v, signatures[i].r, signatures[i].s))){
confirmations++;
}
}
Expand Down
13 changes: 3 additions & 10 deletions contracts/libraries/Struct.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,12 @@ library Storage {
struct TKN{
uint256 origin_network;
string origin_hash;
uint8 origin_decimals;
}
}

library Bridge {

// dst_address - адрес получателя в сети назначения
// dst_network - идентификатор сети назначения
// amount - количество
// src_hash - хеш токена в сети отправления
// src_address - адрес отправителя в сети отправления
// src_network - идентификатор сети отправления
// origin_hash - хеш токена в сети происхождения
// origin_network - идентификатор сети происхождения
// nonce - порядковый номер перевода

struct TICKET{
address dst_address;
uint256 dst_network;
Expand All @@ -37,5 +29,6 @@ library Bridge {
uint256 nonce;
string name;
string symbol;
uint8 origin_decimals;
}
}
8 changes: 7 additions & 1 deletion contracts/libraries/WrapedToken.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,17 @@ contract WrapedToken is ERC20, ERC20Burnable, Ownable {

uint256 public origin;
bytes public origin_hash;
uint8 immutable _decimals;

constructor(string memory name, string memory symbol) ERC20(name, symbol){
(uint256 origin_, bytes memory origin_hash_) = IWrapedTokenDeployer(msg.sender).parameters();
(uint256 origin_, bytes memory origin_hash_, uint8 origin_decimals) = IWrapedTokenDeployer(msg.sender).parameters();
origin = origin_;
origin_hash = origin_hash_;
_decimals = origin_decimals;
}

function decimals() public view virtual override returns (uint8){
return _decimals;
}

function mint(address to, uint256 amount) external onlyOwner {
Expand Down
8 changes: 5 additions & 3 deletions contracts/libraries/WrapedTokenDeployer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ contract WrapedTokenDeployer is IWrapedTokenDeployer {
struct Parameters {
uint256 origin;
bytes origin_hash;
uint8 origin_decimals;
}

/// @inheritdoc IWrapedTokenDeployer
Expand All @@ -23,10 +24,11 @@ contract WrapedTokenDeployer is IWrapedTokenDeployer {
string memory name,
string memory symbol,
uint256 origin,
bytes memory origin_hash
bytes memory origin_hash,
uint8 origin_decimals
) internal returns (address token) {
parameters = Parameters({origin: origin, origin_hash: origin_hash});
token = address(new WrapedToken{salt: keccak256(abi.encode(origin, origin_hash))}(name, symbol));
parameters = Parameters({origin: origin, origin_hash: origin_hash, origin_decimals: origin_decimals});
token = address(new WrapedToken{salt: keccak256(abi.encode(origin, origin_hash, origin_decimals))}(name, symbol));
delete parameters;
}
}
44 changes: 44 additions & 0 deletions hardhat.config.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,50 @@
require("@nomicfoundation/hardhat-toolbox");
require("@nomiclabs/hardhat-etherscan");

const PRIVATE_KEY = <>;
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: "0.8.7",
networks: {
goerli: {
url: `https://goerli.infura.io/v3/88762928a4164487b3fcdd2dc892598d`,
accounts: [PRIVATE_KEY],
id: 5
},
polygonMumbai: {
url: "https://rpc-mumbai.maticvigil.com",
accounts: [PRIVATE_KEY],
id: 80001
},
bscTestnet: {
url: `https://data-seed-prebsc-1-s1.binance.org:8545`,
accounts: [PRIVATE_KEY],
id: 97
}
},
etherscan: {
apiKey: {
goerli: "IVD4ZVQ8Z2VU613SHF9FNS4ABKKF7WPDYK",
bscTestnet : 'G6FS6SET5P7V7B6KGFHTTGAFY8Q62FI72H',
polygonMumbai : 'NRSIR1KMP51HM6S2XXAAI2V867G6SUS2DV'
},
customChains: [
{
network: "goerli",
chainId: 5,
urls: {
apiURL: "https://api-goerli.etherscan.io/api",
browserURL: "https://goerli.etherscan.io"
}
},
{
network: "polygonMumbai",
chainId: 80001,
urls: {
apiURL: "https://api-testnet.polygonscan.com",
browserURL: "https://mumbai.polygonscan.com"
}
}
]
}
};
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"homepage": "https://github.com/TrinityLabDAO/eth-enq-bridge-v1.0#readme",
"devDependencies": {
"@nomicfoundation/hardhat-toolbox": "^2.0.1",
"@nomiclabs/hardhat-etherscan": "^3.1.6",
"hardhat": "^2.12.7"
},
"dependencies": {
Expand Down
3 changes: 3 additions & 0 deletions scripts/arguments_bscTestnet.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = [
97,
];
3 changes: 3 additions & 0 deletions scripts/arguments_goerli.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = [
5,
];
Loading