Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add WrappedToken.sol #1095

Draft
wants to merge 67 commits into
base: feature/1.5.0.0-interflux
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
2d3e00a
Merge remote-tracking branch 'origin/release/1.3.0.0' into release/1.…
fassadlr Oct 11, 2022
96da7d1
Merge remote-tracking branch 'origin/release/1.3.2.1' into release/1.…
fassadlr Oct 11, 2022
729e92c
Merge remote-tracking branch 'origin/release/1.3.2.2' into release/1.…
fassadlr Oct 11, 2022
248646d
Merge remote-tracking branch 'origin/release/1.3.3.0' into release/1.…
fassadlr Oct 11, 2022
a12874d
Bump all versions to 1.3.4.0
fassadlr Oct 11, 2022
6f65bf6
Merge remote-tracking branch 'origin/release/1.3.3.0' into release/1.…
fassadlr Oct 21, 2022
9968ba1
Merge remote-tracking branch 'origin/release/1.3.4.0' into release/1.…
fassadlr Oct 21, 2022
309391d
Bump all versions to 1.4.0.0
fassadlr Oct 21, 2022
0c93dd2
Merge branch 'feature/dotnet6' into release/1.4.0.0
fassadlr Nov 9, 2022
be5ccd6
Set version to RC
fassadlr Nov 9, 2022
8fcacb6
Always publish mining statistics
fassadlr Nov 10, 2022
c14acd9
Add activation height for multisig fee sorting
fassadlr Nov 10, 2022
24ab542
Fix GateWayPairStarts pair
fassadlr Nov 11, 2022
58fc318
Merge pull request #1092 from stratisproject/interflux-ms-fees-ort
fassadlr Nov 14, 2022
341746c
Update release 1.4 activation height
fassadlr Nov 14, 2022
0606287
Bump build version to 1.4.0.1
fassadlr Nov 14, 2022
2958d64
Fix multisig fee sort
fassadlr Nov 14, 2022
d62930c
Bump build revision to 1.4.0.2
fassadlr Nov 14, 2022
fa722c2
Set release 1.4 activation height
fassadlr Nov 16, 2022
1b6c10a
Add WrappedToken.sol
quantumagi Nov 17, 2022
d4a265e
Add WrappedToken.cs
quantumagi Nov 17, 2022
470db60
Changes based on feedback
quantumagi Nov 18, 2022
0032aa6
Rename
quantumagi Nov 18, 2022
333a033
Add burnId
quantumagi Nov 18, 2022
6afb5fe
Add blacklisting
quantumagi Jan 20, 2023
814a3ac
Fix names
quantumagi Jan 20, 2023
2027682
Use external
quantumagi Jan 20, 2023
75a0487
Fix compilation issues
quantumagi Jan 20, 2023
0113b7e
Update ABI
quantumagi Jan 20, 2023
991cd53
Update bytecode
quantumagi Jan 20, 2023
19abd6c
Update WrappedTokenDeployment
quantumagi Jan 20, 2023
721fd34
Fix
quantumagi Jan 20, 2023
344638f
Add helper classes
quantumagi Jan 20, 2023
e7d3278
Bump all versions to 1.3.4.0
fassadlr Oct 11, 2022
577aa63
Bump all versions to 1.4.0.0
fassadlr Oct 21, 2022
f9dfd51
Set version to RC
fassadlr Nov 9, 2022
84d7f40
Bump build version to 1.4.0.1
fassadlr Nov 14, 2022
149a154
Bump build revision to 1.4.0.2
fassadlr Nov 14, 2022
309aed9
Add WrappedToken.sol
quantumagi Nov 17, 2022
efb0ebb
Add WrappedToken.cs
quantumagi Nov 17, 2022
fb747f5
Changes based on feedback
quantumagi Nov 18, 2022
b2f731b
Rename
quantumagi Nov 18, 2022
485edaa
Add burnId
quantumagi Nov 18, 2022
c7c4232
Add blacklisting
quantumagi Jan 20, 2023
6887246
Fix names
quantumagi Jan 20, 2023
9ee754c
Use external
quantumagi Jan 20, 2023
9c8529e
Fix compilation issues
quantumagi Jan 20, 2023
61fe516
Update ABI
quantumagi Jan 20, 2023
407bed3
Update bytecode
quantumagi Jan 20, 2023
320e1c8
Update WrappedTokenDeployment
quantumagi Jan 20, 2023
1c39f6f
Fix
quantumagi Jan 20, 2023
938cdb0
Add helper classes
quantumagi Jan 20, 2023
aa8ed8d
Merge branch 'wrappedcoin' of https://github.com/quantumagi/StratisFu…
quantumagi Sep 4, 2023
2a69ad0
Move contract to correct folder
quantumagi Sep 4, 2023
cff1217
Fix rebase
quantumagi Sep 4, 2023
2521d06
Add require and comments
quantumagi Sep 4, 2023
6314e73
Add TODO
quantumagi Sep 4, 2023
b86f39d
The user signature is not required in the contract
quantumagi Sep 4, 2023
0f6355a
Implement replay check
quantumagi Sep 5, 2023
c649116
Add fee log
quantumagi Sep 6, 2023
7032879
Calculate decimalsFactor
quantumagi Sep 6, 2023
70dd28b
Cast amounts
quantumagi Sep 6, 2023
e58bb5e
Refactor decimalsFactor
quantumagi Sep 7, 2023
dcc237d
Remove fee and toaddr
quantumagi Sep 13, 2023
f97e1ae
Add transferForNetwork method
quantumagi Sep 14, 2023
49b02dc
Fix compile errors and add constants and private methods
quantumagi Sep 14, 2023
feb9812
Refactor
quantumagi Sep 14, 2023
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

// Importing dependencies
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.3.0/contracts/access/Ownable.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.3.0/contracts/token/ERC20/ERC20.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.3.0/contracts/cryptography/ECDSA.sol";

contract WrappedToken is ERC20, Ownable {
string public constant CONTRACT_NAME = "WrappedToken";
string public constant CONTRACT_VERSION = "v1";

mapping (string => string) public withdrawalAddresses;
mapping (uint128 => bool) public uniqueNumberUsed;
mapping (address => bool) public isBlacklisted;

// Constructor initializes the ERC20 token
constructor(string memory tokenName, string memory tokenSymbol, uint256 initialSupply) public ERC20(tokenName, tokenSymbol) {
_mint(msg.sender, initialSupply);
}

// Allows only the owner to mint new tokens
function mint(address account, uint256 amount) public onlyOwner {
_mint(account, amount);
}

// Allows users to burn tokens and specify a withdrawal address
function burn(uint256 amount, string memory tokenAddress, string memory burnId) public {
_burn(msg.sender, amount);
string memory key = string(abi.encodePacked(msg.sender, " ", burnId));
withdrawalAddresses[key] = tokenAddress;
}

// Allows users to burn tokens from an approved address
function burnFrom(address account, uint256 amount, string memory tokenAddress, string memory burnId) public {
uint256 decreasedAllowance = allowance(account, msg.sender).sub(amount, "ERC20: burn amount exceeds allowance");
_approve(account, msg.sender, decreasedAllowance);
_burn(account, amount);
string memory key = string(abi.encodePacked(msg.sender, " ", burnId));
withdrawalAddresses[key] = tokenAddress;
}

// Allows the owner to add addresses to the blacklist
function addToBlackList(address[] calldata addresses) external onlyOwner {
for (uint256 i = 0; i < addresses.length; ++i) {
isBlacklisted[addresses[i]] = true;
}
}

// Allows the owner to remove addresses from the blacklist
function removeFromBlackList(address account) external onlyOwner {
isBlacklisted[account] = false;
}

// Checks if the address is blacklisted before any token transfer
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {
super._beforeTokenTransfer(from, to, amount);
require(!isBlacklisted[from] && !isBlacklisted[to], "This address is blacklisted");
}

// Perform a cross-chain transfer using delegated transfer with metadata
function _transferForNetwork(
address fromAddr,
string memory targetNetwork,
string memory targetAddress,
string memory metadata,
uint256 transferAmount
) internal {
_beforeTokenTransfer(fromAddr, interflux, transferAmount);
_transfer(fromAddr, interflux, transferAmount);
emit CrossChainTransferLog(targetAddress, targetNetwork);
emit MetadataLog(metadata);
}

function transferForNetwork(
string memory targetNetwork,
string memory targetAddress,
string memory metadata,
uint256 transferAmount
) public {
_transferForNetwork(msg.sender, targetNetwork, targetAddress, metadata, transferAmount);
}

// Perform a cross-chain transfer using delegated transfer with metadata
function delegatedTransferForNetwork(
uint128 uniqueNumber,
address fromAddr,
string memory targetNetwork,
string memory targetAddress,
string memory metadata,
uint32 amount,
uint8 amountCents,
bytes memory signature
) public {
require(!uniqueNumberUsed[uniqueNumber], "Unique number already used");
uniqueNumberUsed[uniqueNumber] = true;
string memory token = symbol();
bytes32 dataHash = keccak256(abi.encode(uniqueNumber, keccak256(bytes(token)), fromAddr, keccak256(bytes(targetNetwork)), keccak256(bytes(targetAddress)), keccak256(bytes(metadata)), amount, amountCents));
bytes32 domainSeparator = _getDomainSeparator();
bytes32 eip712DataHash = keccak256(abi.encodePacked("\x19\x01", domainSeparator, dataHash));
address recoveredAddress = ECDSA.recover(eip712DataHash, signature);
require(fromAddr == recoveredAddress, "The 'fromAddr' is not the signer");
uint256 decimalsFactor = uint256(10) ** decimals();
uint256 transferAmount = uint256(amount) * decimalsFactor + uint256(amountCents) * (decimalsFactor / 100);

_transferForNetwork(fromAddr, targetNetwork, targetAddress, metadata, transferAmount);
}

// Event definitions
event CrossChainTransferLog(string account, string network);
event MetadataLog(string metadata);

// Ethereum Interflux address variable
address public interflux;

// Method to update the Ethereum Interflux address
function setInterflux(address newAddress) public onlyOwner {
interflux = newAddress;
}

function _getDomainSeparator() internal view returns(bytes32 domainSeparator) {
uint chainId;
assembly {
chainId := chainid()
}

return keccak256(abi.encode(keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(abi.encodePacked(CONTRACT_NAME)), keccak256(abi.encodePacked(CONTRACT_VERSION)), chainId, address(this)));
}
}
Loading