--- 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`。 :::