Skip to content

Commit

Permalink
SFS integraated in other contracts too
Browse files Browse the repository at this point in the history
  • Loading branch information
tempe-techie committed Jan 30, 2024
1 parent 88218a5 commit bd64a8c
Show file tree
Hide file tree
Showing 16 changed files with 205 additions and 39 deletions.
9 changes: 8 additions & 1 deletion contracts/nft/early-stakers/EarlyStakerMetadata.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ pragma solidity ^0.8.17;
import { OwnableWithManagers } from "../../access/OwnableWithManagers.sol";
import { Base64 } from "@openzeppelin/contracts/utils/Base64.sol";

interface ISFS {
function assign(uint256 _tokenId) external returns (uint256);
}

contract EarlyStakerMetadata is OwnableWithManagers {
string public description;
string public externalUrl;
Expand All @@ -17,8 +21,11 @@ contract EarlyStakerMetadata is OwnableWithManagers {
string memory externalUrl_,
string memory image_,
string memory name_,
string memory video_
string memory video_,
address sfsAddress_,
uint256 sfsNftId_
) {
ISFS(sfsAddress_).assign(sfsNftId_);
description = description_;
externalUrl = externalUrl_;
image = image_;
Expand Down
9 changes: 8 additions & 1 deletion contracts/nft/early-stakers/EarlyStakerNft.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ interface IEarlyStakerMetadata {
function getMetadata(uint256 _tokenId) external view returns (string memory);
}

interface ISFS {
function assign(uint256 _tokenId) external returns (uint256);
}

/**
* @title EarlyStakerNft
* @author Tempe Techie
Expand All @@ -25,8 +29,11 @@ contract EarlyStakerNft is ERC5192, OwnableWithManagers {
constructor (
address _metadataAddress,
string memory _name,
string memory _symbol
string memory _symbol,
address _sfsAddress,
uint256 _sfsNftId
) ERC5192(_name, _symbol, true) {
ISFS(_sfsAddress).assign(_sfsNftId);
metadataAddress = _metadataAddress;
}

Expand Down
10 changes: 9 additions & 1 deletion contracts/post/IggyPostMinterV2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ interface IIggyPostStats {
function addMintedPostId(address _user, uint256 _postId) external;
}

interface ISFS {
function assign(uint256 _tokenId) external returns (uint256);
}

/**
@title IggyPostMinterV2
@notice This contract allows users to mint IggyPost NFTs and paying with ETH.
Expand Down Expand Up @@ -63,11 +67,15 @@ contract IggyPostMinterV2 is OwnableWithManagers, ReentrancyGuard {
address _devFeeUpdaterAddress,
address _postAddress,
uint256 _chatEthRatio, // e.g. 1_000, which means 1 ETH (or payment token) = 1,000 CHAT
uint256 _chatRewardsDuration // CHAT rewards duration in seconds
uint256 _chatRewardsDuration, // CHAT rewards duration in seconds
address _sfsAddress,
uint256 _sfsNftId
) {
require(_chatTokenMinterAddress != address(0), "IggyPostMinterV2: CHAT token cannot be zero address");
require(_postAddress != address(0), "IggyPostMinterV2: Post address cannot be zero address");

ISFS(_sfsAddress).assign(_sfsNftId);

chatTokenMinterAddress = _chatTokenMinterAddress;
daoAddress = _daoAddress;
devAddress = _devAddress;
Expand Down
13 changes: 12 additions & 1 deletion contracts/token/ChatToken.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,22 @@ import { ERC20, ERC20Burnable } from "@openzeppelin/contracts/token/ERC20/extens
import { ERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";

interface ISFS {
function assign(uint256 _tokenId) external returns (uint256);
}

contract ChatToken is ERC20Burnable, Ownable, ERC20Permit {
address public minter;

// CONSTRUCTOR
constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) ERC20Permit(_name) {}
constructor(
string memory _name,
string memory _symbol,
address _sfsAddress,
uint256 _sfsNftId
) ERC20(_name, _symbol) ERC20Permit(_name) {
ISFS(_sfsAddress).assign(_sfsNftId);
}

// EVENTS
event MinterAddressChanged(address indexed _owner, address indexed _minter);
Expand Down
14 changes: 11 additions & 3 deletions contracts/token/ChatTokenClaimActivityPoints.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,16 @@ pragma solidity ^0.8.17;
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";

interface IActivityPoints {
function getTotalWeiSpent(address _address) external view returns (uint256);
}

interface IChatTokenMinter is IERC20 {
function mint(address to, uint256 amount) external;
}

interface IActivityPoints {
function getTotalWeiSpent(address _address) external view returns (uint256);
interface ISFS {
function assign(uint256 _tokenId) external returns (uint256);
}

/**
Expand All @@ -30,12 +34,16 @@ contract ChatTokenClaimActivityPoints is Ownable {
constructor(
address _chatTokenMinter,
address _apAddress,
uint256 _chatEthRatio
uint256 _chatEthRatio,
address _sfsAddress,
uint256 _sfsNftId
) {
require(_chatEthRatio > 0, "ChatTokenClaimActivityPoints: chatEthRatio must be greater than 0");
require(_chatTokenMinter != address(0), "ChatTokenClaimActivityPoints: chatTokenMinter cannot be zero address");
require(_apAddress != address(0), "ChatTokenClaimActivityPoints: apAddress cannot be zero address");

ISFS(_sfsAddress).assign(_sfsNftId);

chatTokenMinter = _chatTokenMinter;
apAddress = _apAddress;
chatEthRatio = _chatEthRatio;
Expand Down
16 changes: 12 additions & 4 deletions contracts/token/ChatTokenClaimDomains.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@ pragma solidity ^0.8.17;
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";

interface IBasePunkTLD {
function domains(string calldata _domainName) external view returns(string memory, uint256, address, string memory);
function getDomainHolder(string calldata _domainName) external view returns(address);
}

interface IChatTokenMinter is IERC20 {
function mint(address to, uint256 amount) external;
}

interface IBasePunkTLD {
function domains(string calldata _domainName) external view returns(string memory, uint256, address, string memory);
function getDomainHolder(string calldata _domainName) external view returns(address);
interface ISFS {
function assign(uint256 _tokenId) external returns (uint256);
}

/**
Expand All @@ -33,12 +37,16 @@ contract ChatTokenClaimDomains is Ownable {
address _chatTokenMinter,
address _domainAddress,
uint256 _chatReward,
uint256 _maxIdEligible
uint256 _maxIdEligible,
address _sfsAddress,
uint256 _sfsNftId
) {
require(_chatReward > 0, "ChatTokenClaimDomains: chatReward must be greater than 0");
require(_chatTokenMinter != address(0), "ChatTokenClaimDomains: chatTokenMinter cannot be zero address");
require(_domainAddress != address(0), "ChatTokenClaimDomains: domain contract cannot be zero address");

ISFS(_sfsAddress).assign(_sfsNftId);

chatTokenMinter = _chatTokenMinter;
domainAddress = _domainAddress;
chatReward = _chatReward;
Expand Down
12 changes: 11 additions & 1 deletion contracts/token/ChatTokenMinter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,24 @@ interface IChatToken is IERC20 {
function mint(address to, uint256 amount) external;
}

interface ISFS {
function assign(uint256 _tokenId) external returns (uint256);
}

contract ChatTokenMinter is Ownable {
address public immutable chatToken;
bool public paused = false;

mapping(address => bool) public isMinter; // addresses that have minting privileges

// CONSTRUCTOR
constructor(address _chatToken) {
constructor(
address _chatToken,
address _sfsAddress,
uint256 _sfsNftId
) {
ISFS(_sfsAddress).assign(_sfsNftId);

chatToken = _chatToken;
}

Expand Down
24 changes: 19 additions & 5 deletions scripts/nft/early-stakers/earlyStakerNft.deploy.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@ const merkleRoot = String(tree.root);

console.log("Merkle root: " + merkleRoot);

const sfsAddress = (network.name == "modeTestnet") ? "0xBBd707815a7F7eb6897C7686274AFabd7B579Ff6" : "0x8680CEaBcb9b56913c519c069Add6Bc3494B7020";
const sfsNftTokenId = 0; // TODO: Enter SFS NFT token ID!!!

if (sfsNftTokenId == 0) {
console.log("Please enter SFS NFT token ID!!!");
return;
}

async function main() {
const [deployer] = await ethers.getSigners();

Expand All @@ -37,34 +45,40 @@ async function main() {
externalUrl,
image,
mdName,
video
video,
sfsAddress,
sfsNftTokenId
);
await metadataInstance.deployed();

console.log(metadataContractName + " contract address:", metadataInstance.address);

console.log("Wait a minute and then run this command to verify contracts on block explorer:");
console.log("npx hardhat verify --network " + network.name + " " + metadataInstance.address + ' "' + description + '" "' + externalUrl + '" "' + image + '" "' + mdName + '" "' + video + '"');
console.log("npx hardhat verify --network " + network.name + " " + metadataInstance.address + ' "' + description + '" "' + externalUrl + '" "' + image + '" "' + mdName + '" "' + video + '" ' + sfsAddress + ' "' + sfsNftTokenId + '"');

// deploy NFT contract
console.log("Deploying " + nftContractName + " contract");
const nftContract = await ethers.getContractFactory(nftContractName);
const nftInstance = await nftContract.deploy(
metadataInstance.address,
nftName,
nftSymbol
nftSymbol,
sfsAddress,
sfsNftTokenId
);
await nftInstance.deployed();

console.log(nftContractName + " contract address:", nftInstance.address);

console.log("Wait a minute and then run this command to verify contracts on block explorer:");
console.log("npx hardhat verify --network " + network.name + " " + nftInstance.address + " " + metadataInstance.address + ' "' + nftName + '" "' + nftSymbol + '"');
console.log("npx hardhat verify --network " + network.name + " " + nftInstance.address + " " + metadataInstance.address + ' "' + nftName + '" "' + nftSymbol + '" ' + sfsAddress + ' "' + sfsNftTokenId + '"');

// deploy claimer contract
console.log("Deploying " + claimerContractName + " contract");
const claimerContract = await ethers.getContractFactory(claimerContractName);
const claimerInstance = await claimerContract.deploy(
sfsAddress,
sfsNftTokenId,
nftInstance.address,
merkleRoot
);
Expand All @@ -77,7 +91,7 @@ async function main() {
await nftInstance.changeMinterAddress(claimerInstance.address);

console.log("Wait a minute and then run this command to verify contracts on block explorer:");
console.log("npx hardhat verify --network " + network.name + " " + claimerInstance.address + " " + nftInstance.address + " " + merkleRoot);
console.log("npx hardhat verify --network " + network.name + " " + claimerInstance.address + " " + sfsAddress + ' "' + sfsNftTokenId + '" ' + nftInstance.address + " " + merkleRoot);
}

main()
Expand Down
14 changes: 12 additions & 2 deletions scripts/post/IggyPostNft1155/minterV2.deploy.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@ const postAddress = "0x63FE8216a66737CFE474DF3949F9081EbD4Bd800";
const chatEthRatio = 10; // 1 ETH/SGB = 10 CHAT
const chatRewardsDuration = 60 * 60 * 24 * 30 * 11; // 30 days * 12 months = 1 year

const sfsAddress = (network.name == "modeTestnet") ? "0xBBd707815a7F7eb6897C7686274AFabd7B579Ff6" : "0x8680CEaBcb9b56913c519c069Add6Bc3494B7020";
const sfsNftTokenId = 0; // TODO: Enter SFS NFT token ID!!!

if (sfsNftTokenId == 0) {
console.log("Please enter SFS NFT token ID!!!");
return;
}

// stats contract
const statsEnabled = false; // have it enabled by default so that users can see minted posts on their profile
const statsAddress = "";
Expand All @@ -38,7 +46,9 @@ async function main() {
devFeeUpdaterAddress,
postAddress,
chatEthRatio,
chatRewardsDuration
chatRewardsDuration,
sfsAddress,
sfsNftTokenId
);

console.log(contractName + " contract address:", instance.address);
Expand Down Expand Up @@ -124,7 +134,7 @@ async function main() {

// verify contract
console.log("Wait a minute and then run this command to verify contract on block explorer:");
console.log("npx hardhat verify --network " + network.name + " " + instance.address + " " + chatTokenMinterAddress + " " + daoAddress + " " + devAddress + " " + devFeeUpdaterAddress + " " + postAddress + ' "' + chatEthRatio + '" "' + chatRewardsDuration + '"');
console.log("npx hardhat verify --network " + network.name + " " + instance.address + " " + chatTokenMinterAddress + " " + daoAddress + " " + devAddress + " " + devFeeUpdaterAddress + " " + postAddress + ' "' + chatEthRatio + '" "' + chatRewardsDuration + '" ' + sfsAddress + ' "' + sfsNftTokenId + '"');
}

main()
Expand Down
19 changes: 15 additions & 4 deletions scripts/token/ChatToken/chatToken.deploy.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,16 @@

const contractName = "ChatToken";

const tokenName = "CHIRP";
const symbol = "CHIRP";
const tokenName = "ModeChat";
const symbol = "MCHAT";

const sfsAddress = (network.name == "modeTestnet") ? "0xBBd707815a7F7eb6897C7686274AFabd7B579Ff6" : "0x8680CEaBcb9b56913c519c069Add6Bc3494B7020";
const sfsNftTokenId = 0; // TODO: Enter SFS NFT token ID!!!

if (sfsNftTokenId == 0) {
console.log("Please enter SFS NFT token ID!!!");
return;
}

async function main() {
const [deployer] = await ethers.getSigners();
Expand All @@ -14,13 +22,16 @@ async function main() {
// deploy contract
const contract = await ethers.getContractFactory(contractName);
const instance = await contract.deploy(
tokenName, symbol
tokenName,
symbol,
sfsAddress,
sfsNftTokenId
);

console.log(contractName + " contract address:", instance.address);

console.log("Wait a minute and then run this command to verify contracts on block explorer:");
console.log("npx hardhat verify --network " + network.name + " " + instance.address + ' "' + tokenName + '" "' + symbol + '"');
console.log("npx hardhat verify --network " + network.name + " " + instance.address + ' "' + tokenName + '" "' + symbol + '" ' + sfsAddress + ' "' + sfsNftTokenId + '"');
}

main()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@ const chatTokenMinterAddress = "0x2C6A9F47a2B1BA7976ACd14CDd8f6f35d27C1e28"; //
const activityPointsAddress = "0x7d20A0E75B1ac519f500a51351bcb01A07fE3D7d"; // TODO
const chatEthRatio = 1_000_000; // TODO: 1 ETH = 1,000 CHAT

const sfsAddress = (network.name == "modeTestnet") ? "0xBBd707815a7F7eb6897C7686274AFabd7B579Ff6" : "0x8680CEaBcb9b56913c519c069Add6Bc3494B7020";
const sfsNftTokenId = 0; // TODO: Enter SFS NFT token ID!!!

if (sfsNftTokenId == 0) {
console.log("Please enter SFS NFT token ID!!!");
return;
}

async function main() {
const [deployer] = await ethers.getSigners();

Expand All @@ -19,7 +27,9 @@ async function main() {
const instance = await contract.deploy(
chatTokenMinterAddress,
activityPointsAddress,
chatEthRatio
chatEthRatio,
sfsAddress,
sfsNftTokenId
);

console.log(contractName + " contract address:", instance.address);
Expand All @@ -42,7 +52,7 @@ async function main() {
console.log("Lastly, verify the Minter contract on block explorer");

console.log("Wait a minute and then run this command to verify contract on block explorer:");
console.log("npx hardhat verify --network " + network.name + " " + instance.address + " " + chatTokenMinterAddress + " " + activityPointsAddress + ' "' + chatEthRatio + '"');
console.log("npx hardhat verify --network " + network.name + " " + instance.address + " " + chatTokenMinterAddress + " " + activityPointsAddress + ' "' + chatEthRatio + '" ' + sfsAddress + ' "' + sfsNftTokenId + '"');
}

main()
Expand Down
Loading

0 comments on commit bd64a8c

Please sign in to comment.