经济下行阶段,一个 37 岁失业程序员的独白(经历/经验分享)
警告:区块链投资高风险,需要谨慎,谨慎,再谨慎!
实战案例四:DeFi 去中心化交易所
现实情况是期望代币可以在去中心化的交易场所中交换,这篇文章就是从一个简单案例来说明交换,流动性该如何实现。 我们需要先梳理一下,期望这个应用具备哪些功能:只用一个代币对建立交易场所交易收取 1% 的费用用户可以为 UseWeb3Token 添加或删除流动性为用户提供 LP 代币说明:实现会比这个例子复杂的多// SPDX-License-Identifier: SEE LICENSE IN LICENSE pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract UseWeb3Exchange is ERC20 { address public useweb3TokenAddress; constructor(address useweb3TokenContract) ERC20("LP Token", "LP") { useweb3TokenAddress = useweb3TokenContract; } function getReserve() publ...
初识 Solidity 和 OpenZeppelin
Solidity 是一种面向对象的高级静态语言,用于实现智能合约,运行于 以太坊虚拟机,它支持继承,库和自定义类型等。pragma solidity ^0.8.0; contract HelloWorld { } Solidity 有三种类型的变量,熟悉它是因为变量的范围是由它们声明的位置所决定的:Local在函数内部声明且不存储在区块链上State存储在区块链上Global提供区块链相关的信息,它在运行时由以太坊虚拟机注入包括交易发送者,区块时间戳,区块哈希等全局变量语法知识,请阅读:https://docs.soliditylang.org/en/v0.8.9/index.html初识 OpenZeppelin说明:OpenZeppelin 是一家以太坊安全公司,其为流行的智能合约标准开发了一组合约,这些合约经过了大量的测试和安全审查,所以如果我们需要实现这些标准合约时,应该尝试找到 OpenZeppelin 提供的合约,而不是重头开始重写整个标准。https://github.com/OpenZeppelin/openzeppelin-contracts在 useweb3 ...
Dev
经济下行阶段,一个 37 岁失业程序员的独白(经历/经验分享)
警告:区块链投资高风险,需要谨慎,谨慎,再谨慎!
实战案例四:DeFi 去中心化交易所
现实情况是期望代币可以在去中心化的交易场所中交换,这篇文章就是从一个简单案例来说明交换,流动性该如何实现。 我们需要先梳理一下,期望这个应用具备哪些功能:只用一个代币对建立交易场所交易收取 1% 的费用用户可以为 UseWeb3Token 添加或删除流动性为用户提供 LP 代币说明:实现会比这个例子复杂的多// SPDX-License-Identifier: SEE LICENSE IN LICENSE pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract UseWeb3Exchange is ERC20 { address public useweb3TokenAddress; constructor(address useweb3TokenContract) ERC20("LP Token", "LP") { useweb3TokenAddress = useweb3TokenContract; } function getReserve() publ...
初识 Solidity 和 OpenZeppelin
Solidity 是一种面向对象的高级静态语言,用于实现智能合约,运行于 以太坊虚拟机,它支持继承,库和自定义类型等。pragma solidity ^0.8.0; contract HelloWorld { } Solidity 有三种类型的变量,熟悉它是因为变量的范围是由它们声明的位置所决定的:Local在函数内部声明且不存储在区块链上State存储在区块链上Global提供区块链相关的信息,它在运行时由以太坊虚拟机注入包括交易发送者,区块时间戳,区块哈希等全局变量语法知识,请阅读:https://docs.soliditylang.org/en/v0.8.9/index.html初识 OpenZeppelin说明:OpenZeppelin 是一家以太坊安全公司,其为流行的智能合约标准开发了一组合约,这些合约经过了大量的测试和安全审查,所以如果我们需要实现这些标准合约时,应该尝试找到 OpenZeppelin 提供的合约,而不是重头开始重写整个标准。https://github.com/OpenZeppelin/openzeppelin-contracts在 useweb3 ...
Dev

Subscribe to icepy

Subscribe to icepy
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers
最近 APE 空投这么火,是时候说到如何为我们之前做的 UseWeb3NFT 发行代币,在进入编码之前,我们先梳理一下具体的需求:
假设令牌的最大数量为 10000 个
每一个 UseWeb3NFT 持有者可以免费领取 10个
ICO 时每一个令牌的初始价格为 0.0001 eth
ERC-20
由于空投部分需要依赖 UseWeb3NFT,所以我们需要写一个接口,使用外部调用的方式获取一些数据
interface IUseWeb3NFT {
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address ownerAddress);
}
首先,我们需要去定义价格
uint256 public constant tokenPrice = 0.0001 ether;
uint256 public constant tokenMax = 10000 * 10**18;
uint256 public constant nftClaimTokenValue = 10 * 10**18;
初始代币销售的价格为 0.0001 eth,代币总数为 10000 个,一个 NFT 可以获取空投的数量为 10 个
接下来我们需要一个 map 去存储已经 Claim 的 tokenId,你总不希望每一个 tokenId 都能重复获取空投吧?
mapping (uint256 => bool) claimed;
对于销售部分:
function mint(uint256 amount) public payable{
uint256 requireAmount = tokenPrice * amount;
require(msg.value >= requireAmount, "sent is incorrect");
uint256 amountAll = amount * 10**18;
require((totalSupply() + amountAll) <= tokenMax, "! max");
_mint(msg.sender, amountAll);
}
对于空投部分:
function claim(uint256[] calldata tokenIds) external{
require(tokenIds.length > 0, "Shortage TokenId");
address sender = msg.sender;
uint256 balance = useweb3NFT.balanceOf(sender);
require(balance > 0, "Not Balance");
uint256 amount = 0;
for (uint i = 0; i < tokenIds.length; i++) {
address ownerAddress = useweb3NFT.ownerOf(tokenIds[i]);
if (sender == ownerAddress && !claimed[tokenIds[i]]) {
amount++;
claimed[tokenIds[i]] = true;
}
}
require(amount > 0, "claimed all the tokens");
_mint(sender, amount * nftClaimTokenValue);
}
提款方法:
function withdraw() public onlyOwner {
address _owner = owner();
uint256 amount = address(this).balance;
(bool sendStatus, ) = _owner.call{value: amount}("");
require(sendStatus, "Failed send");
}
最近 APE 空投这么火,是时候说到如何为我们之前做的 UseWeb3NFT 发行代币,在进入编码之前,我们先梳理一下具体的需求:
假设令牌的最大数量为 10000 个
每一个 UseWeb3NFT 持有者可以免费领取 10个
ICO 时每一个令牌的初始价格为 0.0001 eth
ERC-20
由于空投部分需要依赖 UseWeb3NFT,所以我们需要写一个接口,使用外部调用的方式获取一些数据
interface IUseWeb3NFT {
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address ownerAddress);
}
首先,我们需要去定义价格
uint256 public constant tokenPrice = 0.0001 ether;
uint256 public constant tokenMax = 10000 * 10**18;
uint256 public constant nftClaimTokenValue = 10 * 10**18;
初始代币销售的价格为 0.0001 eth,代币总数为 10000 个,一个 NFT 可以获取空投的数量为 10 个
接下来我们需要一个 map 去存储已经 Claim 的 tokenId,你总不希望每一个 tokenId 都能重复获取空投吧?
mapping (uint256 => bool) claimed;
对于销售部分:
function mint(uint256 amount) public payable{
uint256 requireAmount = tokenPrice * amount;
require(msg.value >= requireAmount, "sent is incorrect");
uint256 amountAll = amount * 10**18;
require((totalSupply() + amountAll) <= tokenMax, "! max");
_mint(msg.sender, amountAll);
}
对于空投部分:
function claim(uint256[] calldata tokenIds) external{
require(tokenIds.length > 0, "Shortage TokenId");
address sender = msg.sender;
uint256 balance = useweb3NFT.balanceOf(sender);
require(balance > 0, "Not Balance");
uint256 amount = 0;
for (uint i = 0; i < tokenIds.length; i++) {
address ownerAddress = useweb3NFT.ownerOf(tokenIds[i]);
if (sender == ownerAddress && !claimed[tokenIds[i]]) {
amount++;
claimed[tokenIds[i]] = true;
}
}
require(amount > 0, "claimed all the tokens");
_mint(sender, amount * nftClaimTokenValue);
}
提款方法:
function withdraw() public onlyOwner {
address _owner = owner();
uint256 amount = address(this).balance;
(bool sendStatus, ) = _owner.call{value: amount}("");
require(sendStatus, "Failed send");
}
No activity yet