Skip to content

Commit

Permalink
MOD: separate aime and power
Browse files Browse the repository at this point in the history
  • Loading branch information
cctv2206 committed Apr 23, 2024
1 parent f0d0e13 commit fe8d97a
Show file tree
Hide file tree
Showing 10 changed files with 331 additions and 331 deletions.
187 changes: 79 additions & 108 deletions contracts/aime/AIMeFactoryV4.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,143 +5,114 @@ import "./AIMeNFTV4.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";

struct AIMeParams {
address creator;
string name;
string avatar;
string bio;
string image;
string socialKey;
string socialId;
uint256 minPrice;
uint256 priceIncrement;
}

contract AIMeFactoryV4 is Ownable {
uint256 public protocolFee = 0.001 ether;
address public protocolSigner;

constructor() {}

event AIMeCreated(address creator, address aimeAddress);

mapping(address => uint256) public addressNonce;
mapping(address => address) public aimeSigners;
mapping(string => address) public aimeAddresses;

function updateProtocolSigner(address _protocolSigner) public onlyOwner {
protocolSigner = _protocolSigner;
}

function updateProtocolFee(uint256 _protocolFee) public onlyOwner {
protocolFee = _protocolFee;
}

function createAIMeVerified(
address creator_,
string memory name_,
string memory avatar_,
string memory bio_,
string memory image_,
string memory socialKey_,
string memory socialId_,
uint256 minPrice_,
uint256 priceIncrement_,
function createAIMe(
AIMeParams memory params,
address aimePowerAddress,
address aimeSigner,
bytes memory signature
) public payable {
require(protocolSigner != address(0), "Invalid protocol signer");
uint256 nonce = addressNonce[creator_];
bytes32 _msgHash = ECDSA.toEthSignedMessageHash(
keccak256(
abi.encodePacked(
creator_,
name_,
avatar_,
bio_,
image_,
if (aimeSigner != address(0)) {
uint256 nonce = addressNonce[params.creator];
bytes32 _msgHash = ECDSA.toEthSignedMessageHash(
keccak256(
abi.encodePacked(
socialKey_,
socialId_,
minPrice_,
priceIncrement_,
nonce
params.creator,
params.name,
params.avatar,
params.bio,
params.image,
abi.encodePacked(
params.socialKey,
params.socialId,
params.minPrice,
params.priceIncrement,
nonce
)
)
)
)
);
require(
ECDSA.recover(_msgHash, signature) == protocolSigner,
"Invalid signature"
);
addressNonce[creator_] += 1;

address aimeAddress = _createAIME(
creator_,
name_,
avatar_,
bio_,
image_,
minPrice_,
priceIncrement_,
protocolSigner,
aimePowerAddress
);
require(
ECDSA.recover(_msgHash, signature) == aimeSigner,
"Invalid signature"
);
addressNonce[params.creator] = nonce + 1;
}

require(msg.value >= protocolFee * 10, "Insufficient payment");
require(aimeAddresses[params.name] == address(0), "AIME already exists");
AIMeNFTV4 aime = new AIMeNFTV4(
string(abi.encodePacked("AIME:", params.name)),
params.name,
params.avatar,
params.bio,
params.image,
params.minPrice,
params.priceIncrement
);
address aimeAddress = address(aime);
aimeAddresses[params.name] = aimeAddress;
aimeSigners[aimeAddress] = aimeSigner;

emit AIMeCreated(params.creator, address(aime));

if (bytes(socialKey_).length != 0 && bytes(socialId_).length != 0) {
if (aimePowerAddress != address(0)) {
AIMeNFTV4(aimeAddress).setAIMePower(aimePowerAddress);
}

if (bytes(params.socialKey).length != 0 && bytes(params.socialId).length != 0) {
require(aimeSigner != address(0), "Invalid signer");
AIMeNFTV4(aimeAddress).safeMint(
aimeAddress,
socialKey_,
params.socialKey,
"static",
socialId_,
image_,
params.socialId,
params.image,
0
);
}
}

function createAIME(
address creator_,
string memory name_,
string memory avatar_,
string memory bio_,
string memory image_,
uint256 minPrice_,
uint256 priceIncrement_,
address aimeSigner,
address aimePowerAddress
) public payable {
_createAIME(
creator_,
name_,
avatar_,
bio_,
image_,
minPrice_,
priceIncrement_,
aimeSigner,
aimePowerAddress
);
}

function _createAIME(
address creator_,
string memory name_,
string memory avatar_,
string memory bio_,
string memory image_,
uint256 minPrice_,
uint256 priceIncrement_,
address aimeSigner,
address aimePowerAddress
) internal returns (address) {
require(msg.value >= protocolFee * 10, "Insufficient payment");
require(aimeAddresses[name_] == address(0), "AIME already exists");

AIMeNFTV4 aime = new AIMeNFTV4(
string(abi.encodePacked("AIME:", name_)),
name_,
avatar_,
bio_,
image_,
minPrice_,
priceIncrement_,
aimePowerAddress
);
address aimeAddress = address(aime);
aimeAddresses[name_] = aimeAddress;
aimeSigners[aimeAddress] = aimeSigner;

emit AIMeCreated(creator_, address(aime));
return aimeAddress;
function setAIMePower(
address aimeAddress,
address aimePowerAddress,
bytes memory signature
) public {
address signer = aimeSigners[aimeAddress];
if (signer != address(0)) {
bytes32 _msgHash = ECDSA.toEthSignedMessageHash(
keccak256(abi.encodePacked(aimeAddress, aimePowerAddress))
);
require(
ECDSA.recover(_msgHash, signature) == signer,
"Invalid signature"
);
}
AIMeNFTV4(aimeAddress).setAIMePower(aimePowerAddress);
}

function mintAIMeNFT(
Expand Down
18 changes: 14 additions & 4 deletions contracts/aime/AIMeNFTV4.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import "@openzeppelin/contracts/utils/Strings.sol";

contract AIMeNFTV4 is ERC721, Ownable, ERC721Holder {
using Strings for uint256;
IERC20 public immutable aimePower;
IERC20 public aimePower;
uint256 public constant NFT_HOLDING_PERIOD = 30 days;
uint256 public aimePowerReserved;
uint256 public minPrice;
Expand All @@ -22,6 +22,7 @@ contract AIMeNFTV4 is ERC721, Ownable, ERC721Holder {

error AIMeNFTUnauthorizedAccount(address account);

event AIMePowerSet(address aimePowerAddress);
event AIMeNFTMinted(
address creator,
address aimeAddress,
Expand Down Expand Up @@ -62,11 +63,11 @@ contract AIMeNFTV4 is ERC721, Ownable, ERC721Holder {
string memory bio_,
string memory image_,
uint256 minPrice_,
uint256 nftPriceIncrement_,
address aimePowerAddress
uint256 nftPriceIncrement_
// address aimePowerAddress
) ERC721(name_, symbol_) {
_factory = _msgSender();
aimePower = IERC20(aimePowerAddress);
// aimePower = IERC20(aimePowerAddress);
avatar = avatar_;
minPrice = minPrice_;
nftPriceIncrement = nftPriceIncrement_;
Expand All @@ -79,7 +80,14 @@ contract AIMeNFTV4 is ERC721, Ownable, ERC721Holder {
return _factory;
}

function setAIMePower(address aimePowerAddress) public onlyFactory {
require(address(aimePower) == address(0), "AIME Power already set");
aimePower = IERC20(aimePowerAddress);
emit AIMePowerSet(aimePowerAddress);
}

function addAIMePowerReserved(uint256 amount) public {
require(address(aimePower) != address(0), "No AIME Power");
require(
aimePower.balanceOf(msg.sender) >= amount,
"balance not enough"
Expand All @@ -102,6 +110,7 @@ contract AIMeNFTV4 is ERC721, Ownable, ERC721Holder {
) public onlyFactory returns (uint256) {
uint256 timestamp = 0;
if (to != address(this)) {
require(address(aimePower) != address(0), "No AIME Power");
require(amount >= minPrice, "price too low");
if (
aimePowerReserved >= amount &&
Expand Down Expand Up @@ -164,6 +173,7 @@ contract AIMeNFTV4 is ERC721, Ownable, ERC721Holder {
}

function buyNFT(uint256 tokenId) external {
require(address(aimePower) != address(0), "No AIME Power");
address owner = ownerOf(tokenId);
require(owner != address(0), "Invalid token owner");
uint256 amount;
Expand Down
8 changes: 0 additions & 8 deletions contracts/aime/AIMePowerFairLaunchV2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -174,14 +174,6 @@ contract AIMePowerFairLaunchV2 is ERC20, ReentrancyGuard, IERC721Receiver {
// todo: launch event
}

function testPrice() public view returns (uint160) {
uint160 sqrtPriceX96 = uint160(
((2 ** 96) * MathUtil.SquareRoot(30000000000000000)) /
MathUtil.SquareRoot(10000000000000000000000)
);
return sqrtPriceX96;
}

function _createPool(
address token0,
address token1,
Expand Down
62 changes: 62 additions & 0 deletions contracts/aime/AIMePowerLauncherSepolia.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol";
import "@uniswap/v3-periphery/contracts/interfaces/INonfungiblePositionManager.sol";
import "./AIMePowerFairLaunchV2.sol";

contract AIMePowerLauncherSepolia {
// uniswap v3 addresses on base
ISwapRouter public swapRouter = ISwapRouter(0x94cC0AaC535CCDB3C01d6787D6413C739ae12bc4);
INonfungiblePositionManager public nonfungiblePositionManager =
INonfungiblePositionManager(0x27F971cb582BF9E50F397e4d29a5C7A34f11faA2);

event PowerLaunched(address indexed power, address indexed launcher);

function launchPower(
uint256 _price,
uint256 _amountPerUnits,
uint256 _totalSupply,
uint256 _reservedAmount,
uint256 _deadline,
uint24 _poolFee,
string memory _name,
string memory _symbol
) external returns (address) {
AIMePowerFairLaunchV2 power = new AIMePowerFairLaunchV2(
_price,
_amountPerUnits,
_totalSupply,
_reservedAmount,
msg.sender,
_deadline,
_poolFee,
nonfungiblePositionManager,
swapRouter,
_name,
_symbol
);

emit PowerLaunched(address(power), msg.sender);
return address(power);
}

function launchPowerSimple(string memory _name) external returns (address) {
AIMePowerFairLaunchV2 power = new AIMePowerFairLaunchV2(
1000000000000000, // 0.001 eth
50000000000000000000000, // 5w
200000000000000000000000, // 20w
0,
msg.sender,
block.timestamp + 1 hours,
3000,
nonfungiblePositionManager,
swapRouter,
_name,
_name
);

emit PowerLaunched(address(power), msg.sender);
return address(power);
}
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loading

0 comments on commit fe8d97a

Please sign in to comment.