# web3py第二课：web3合约交互IFO 

By [ourens.eth](https://paragraph.com/@ourens) · 2022-01-02

---

因为今天就要进行IFO，所以时间比较紧急。我这次只讲一下存入和取出的交互方法，会省略一些内容，这些会在以后再讲。

必看
--

首先我要说一点，这次IFO基本不会赚钱，只能让你回本一些，也不能完全回本。

我有一个朋友，参加了很多很多次IFO了，大约打了半年了吧，目前也才刚回本几期，才开始赚钱。所以参与的风险是极大的，我先把风险跟大家讲清楚。

IFO分为两个池子，大户池和阳光普照池，我们用脚本批量参与的就是阳光普照的池子。如果要参与IFO，你的地址必须要花1.5CAKE去设置一个头像，这个头像是个NFT，加入战队和起个名字。所以不算投入打新的100刀，你首先就要有每个地址1.5CAKE的成本。据我估计，参与一次IFO，这1.5CAKE都比较难赚回来。感觉要2期才能回本…

但是有很多已经回本的地址，这期还会参与，所以会越来越卷。而且一直传言要取消阳光普照这种分发方式，所以下一期可能你的多地址就直接废了，回本无望…

所以一定要想清楚，多地址打新不是稳赚的事情！千万别上头！了解这些再往下看。

教程
--

再强调一点哈，因为我之前也没参与过IFO，所以教程可能会有些错误，希望大家如果发现，及时告诉我。

虽然我没参与过，但是我请教了我一位常年打新的朋友，说一下流程。

一个崭新的地址，准备好CAKE和BNB，转账方法可以用我之前教过的代码来写，非常简单。

然后就是要花1.5CAKE去设置头像了，这里需要授权CAKE、生成头像、设置用户名、加入战队的操作。

这几步操作随时都可以做，不受时间限制，我希望你在网页上一步一步进行，每一步进行完毕之后，去查看区块链上的记录。

去看调用了哪个合约，哪个方法，参数是什么：

![](https://storage.googleapis.com/papyrus_images/d4acb951c9d7a0a1f7eaea5e9007cc38f8c7f099eeb535dbd623ce97922ad1c7.png)

你需要记录下每一步的操作，用代码去调用合约。下面用存入IFO的合约举例：

![](https://storage.googleapis.com/papyrus_images/be9fbab0c8e13609e5abddc2f3961bf1644b025abad55e3a34201d67ca5a261b.png)

可以看到，存入就是调用depositPool即可。代码如下：

    from web3 import Web3, HTTPProvider
    
    cake_address = # cake合约地址
    cake_abi =  # cake abi
    ifo_address = # ifo 合约地址
    ifo_abi = # ifo abi
    ifo_cake_amount = # 投入cake数量
    wallet_address = '' # 你的地址
    private_key = '' # 你的私钥
    rpc = 'https://bsc-dataseed1.binance.org:443'
    web3 = Web3(HTTPProvider(rpc))
    address = Web3.toChecksumAddress(wallet_address)
    
    ifo_contract = web3.eth.contract(address=ifo_address, abi=ifo_abi)
    func = ifo_contract.functions.depositPool(web3.toWei(ifo_cake_amount, 'ether'), 0)
    nonce = web3.eth.getTransactionCount(wallet_address)
    params = {
        "from": wallet_address,
        "value": web3.toWei(0, 'ether'),
        'gasPrice': web3.toWei(5, 'gwei'),
        "gas": 500000,
        "nonce": nonce,
    }
    try:
        tx = func.buildTransaction(params)
        signed_tx = web3.eth.account.sign_transaction(tx, private_key=private_key)
        tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)
        print(f"交易发送成功：{tx_hash.hex()}")
    except Exception as e:
        print(f"{address}交易发送失败：", e)
    

这段代码感觉不用多解释，跟第一节课的转账十分类似，就是改了一下方法名。

记住，我们参与的池子ID是0即可！提取的方法大同小异：harvestPool(0) 。基本也是换个方法名就行！

你看到这里会发现，其实所有合约的交互，只要有合约地址、合约ABI、方法名和参数，就可以调用了。其实就是这样！之所以前面设置头像那些没讲，也是希望你们自己探索一下，看看遇到什么问题没有。

比如授权就是调用approve方法，传入授权合约地址和数量即可。如果要铸造NFT，就是调用mint方法。当然可能不同合约名字不一样，我们去区块链浏览器看一下即可。

最后
--

有了第一课的基础，再看第二课就觉得比较简单。一定要看全哦~

因为今天时间紧张，所以可能写的有些凌乱，如果遇到问题一定要在discord中问我！

还有就是任何投资都有风险，切勿盲目跟风，多思考！

---

*Originally published on [ourens.eth](https://paragraph.com/@ourens/web3py-web3-ifo)*
