---
title: 'Solidity WTF 102 24 單元'
lang: zh-tw
---
Solidity WTF 102 24 單元
===
:::info
:date: 2024/10/05
:::
[TOC]
# 課程學習
## 在合約中創建新合約
利用工廠合約,創建一個新合約,用來記錄對應的幣與幣相關場景。
## 使用方式
創建使用`new`,還有另一種`create2`,下一章會講到。
下方是一個簡易的`Uniswap` :
- `Pair`: 幣對合約,用於管理幣對地址、流動性、買賣。
- `PairFactory`: 工廠合約,用於創建新的幣對,並管理幣對地址。
```javascript=
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
contract Pair{
address public factory; // 工厂合约地址
address public token0; // 代币1
address public token1; // 代币2
// 建構函數,可以轉帳
constructor() payable {
// 合約地址賦值給factory
factory = msg.sender;
}
// called once by the factory at time of deployment
function initialize(address _token0, address _token1) external {
// 檢查此合約是否為工廠合約創建的。
require(msg.sender == factory); // sufficient check
// 賦值
token0 = _token0;
token1 = _token1;
}
}
contract PairFactory {
// 用來儲存新建合約的合約地址
address[] public allPair;
function createPair(address tokenA, address tokenB) external payable {
// 創建新合約並且轉帳
Pair pair = new Pair{value: msg.value}();
// 把幣傳給新合約的initialize function管理
pair.initialize(tokenA, tokenB);
// 把新合約地址化後儲存
allPair.push(address(pair));
}
}
```
:::info
:bulb:這邊有提供幣地址
:bulb:WBNB地址: 0x2c44b726ADF1963cA47Af88B284C06f30380fC78
:bulb:BSC链上的PEOPLE地址: 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
:::
:::success
在`Pair`建構函數中有`factory = msg.sender`,他會是`PairFactory`的合約地址,並不是錢包地址,因為`Pair`的發起者是`PairFactory`。
:::