智能合约调取智能合约-ganache-cli测试被调取的一些说明

news/2024/9/1 2:42:22

创建一个solidity文件(包含两个智能合约)

众筹项目的智能合约

contract Funding{
    //众筹faqiren
    bool flag=false;
    address public manager;
    string public projectName;
    uint public supportMoney;
    uint public endTime;
    uint public goalMoney;
    address[] public players;
    mapping(address=>bool) playersMap;
    Request[] public requests;

    struct Request{
        string description;
        uint money;
        address shopAddress;
        bool complete;
        /*address[] voteAddress;*/
        mapping(address=>bool) voteMap;
        uint voteCount;
    }

    function createRequest(string  _description,uint _money,address _shopAddress) public onlyManger{
        // require(msg.sender==manager);
        Request memory request=Request({
            description : _description,
            money : _money,
            shopAddress : _shopAddress,
            complete : false,
            /* voteAddress: new address[](0),*/
            voteCount : 0
            });
        requests.push(request);
    }

    function approveRequest(uint index)public{
        Request storage request=requests[index];
        /*bool supporter = false;
        for(uint i=0;i<players.length;i++)
        {
            if(players[i]==msg.sender)
            supporter =true;
        }
        require(supporter);*/

        require(playersMap[msg.sender]);
        /*
         bool vote=false;
         for(uint j=0;j<request.voteAddress.length;j++)
         {
             if(request.voteAddress[j]==msg.sender)
             vote=true;
         }
         require(!vote);*/
        require(!requests[index].voteMap[msg.sender]);
        request.voteCount++;
        requests[index].voteMap[msg.sender]=true;
    }


    function finalizeRequest(uint index)public onlyManger{
        Request storage request=requests[index];
        require(!request.complete);
        require(request.voteCount*2>=players.length);
        require(this.balance>=request.money);
        request.shopAddress.transfer(request.money);
        request.complete = true;
    }

    constructor (string _projectName,uint _supportMoney,uint _goalMoney,address _address) public {
        // manager=msg.sender;
        manager=_address;
        projectName=_projectName;
        supportMoney=_supportMoney;
        goalMoney=_goalMoney;
        endTime=now+4 weeks;
    }

    function support() public payable{
        require(msg.value==supportMoney);
        players.push(msg.sender);
        playersMap[msg.sender]=true;
    }

    function getPlayerCount() public view returns(uint)
    {
        return players.length;
    }

    function getPlayers() public view returns(address[])
    {
        return players;
    }

    function getTotalBalance() public view returns (uint){
        return this.balance;
    }

    function getRemainDays() public view returns(uint){
        return (endTime-now)/24/60/60;
    }

    /* function checkStatus() {
         require(!flag);
         require(now>endTime);
         require(this.balance>goalMoney);
         flag=true;

     }*/

    modifier onlyManger()
    {
        require(msg.sender==manager);
        _;
    }

}

部署智能合约的合约创建

contract FundingFactory{

    //address[] public fundings;
    uint public numFundings = 0;
    mapping(uint => address) addrfundings;

    function deploy(string _projectName,uint _supportMoney,uint _goalMoney) public{
        addrfundings[numFundings]=new Funding(_projectName,_supportMoney,_goalMoney,msg.sender);
        numFundings++;
    }
    function getAddr()public view returns(address){//拿到本次部署的智能合约地址
        return addrfundings[numFundings - 1];
    }

}

编译文件(暴露Factory智能合约)

//编译
const path=require('path');
const fs=require('fs');
const solc=require('solc');
//contract文件夹的名字
const srcpath = path.resolve(__dirname,'contract','Funding.sol');
//console.log(srcpath);读出地址
const source = fs.readFileSync(srcpath,'utf-8');
//console.log(source);打印出智能合约,读出来了
const result=solc.compile(source,1);
//console.log(result);
//console.log(result.contracts[':FundingFactory']);
//暴露信息 contracts方法
module.exports=result.contracts[':FundingFactory'];

编译文件(暴露Funding智能合约)

//编译
const path=require('path');
const fs=require('fs');
const solc=require('solc');
//contract文件夹的名字
const srcpath = path.resolve(__dirname,'contract','Funding.sol');
//console.log(srcpath);读出地址
const source = fs.readFileSync(srcpath,'utf-8');
//console.log(source);打印出智能合约,读出来了
const result=solc.compile(source,1);
//console.log(result);
/*console.log(result.contracts[':Funding'].interface);
console.log(result.contracts[':FundingFactory'].interface);*/
//暴露信息 contracts方法
module.exports=result.contracts[':Funding'];

使用ganache-cl测试

获取的参数,以及先获得账户信息,Factory的部署

const ganache=require('ganache-cli');
const Web3=require('web3');

let{interface,bytecode}=require('../compile');

const web3=new Web3(ganache.provider());
const assert=require('assert');

let contract;
let accounts;
let contractFactory;
beforeEach (async ()=>{
    accounts = await web3.eth.getAccounts();
    contract= await new web3.eth.Contract(JSON.parse(interface))
        .deploy({
                data:bytecode,
            
            }
        ).send({
            from:accounts[0],
            gas:'1000000'
        });

});

测试

describe('测试彩票的智能合约',()=>{

   /* it('测试智能合约的部署情况',async ()=>{
       assert.ok(contract.options.address);
       console.log("部署的地址是"+contract.options.address);
    })*/
    it('测试FundingFactory智能合约的编译和部署',async ()=>{
        assert.ok(contract.options.address)
        console.log("address"+contract.options.address);
    });
    it('测试FundingFactory智能合约的deploy方法',async ()=>{
        await contract.methods.deploy('小夜灯',79,10000).send({
          from:accounts[0],
          gas:'1000000',
            //value:['小夜灯',79,10000]
        });
        //console.log((contract.methods));

        var address = await contract.methods.getAddr().call({

            //value:['小夜灯',79,10000]
        });

        console.log(address);
        interface = require('../compileFunding').interface;
       /* console.log(interface);*/
        contractFactory= await new web3.eth.Contract(JSON.parse(interface),address)
            /*.deploy({
                    data:bytecodeFunding,
                    // arguments:['小夜灯',79,10000,'0xEdb827b148DCBE9E14F03348475fA45650A7E1c5']
                }
            ).*//*send({
                from:accounts[1],
                gas:'1000000'
            });*/
           // console.log(contractFactory);
        //console.log((contractFactory.methods));
           // console.log(contractFactory.options.address);
            await contractFactory.methods.createRequest('点亮黑夜','10000',accounts[0]).send({
                from:accounts[0],
                gas:'1000000',
            });

    });

});

先使用Factory的deploy的方法部署Funding的智能合约,再通过getAddr方法获取地址---------------------

通过contractFactory= await new web3.eth.Contract(JSON.parse(interface),address)部署Factory重新实例化部署出来。
最后为测试Funding合约中createRequest成功的方法案列。


http://www.niftyadmin.cn/n/4617750.html

相关文章

Integer和String 相等判断

Integer和String 相等判断 Integer Integer 有一个缓存&#xff0c;范围为-128~127&#xff0c;Integer i1 10&#xff0c;在字节码中实质是调用了Integer.valueOf&#xff0c;在此范围内返回的就是IntergerCache中的Integer对象&#xff0c;否则会返回新的Integer对象 举例…

.ascx和网页.aspx之间的交互方式

1.aspx文件:public void SetLabel(string str) { this.Label1.Text str; ; } ascx文件;protected void Button1_Click(object sender, EventArgs e) { System.Web.UI.Page p this.Page; Type pageType p.GetType(); MethodInfo mi pa…

Python爬虫实战之爬取链家广州房价_04链家的模拟登录(记录)

问题引入 开始链家爬虫的时候&#xff0c;了解到需要实现模拟登录&#xff0c;不登录不能爬取三个月之内的数据&#xff0c;目前暂未验证这个说法是否正确&#xff0c;这一小节记录一下利用浏览器(IE11)的开发者工具去分析模拟登录网站(链家)的内部逻辑过程&#xff0c;花了一个…

JVM 中篇(1):Class 文件结构

文章目录查看二进制字节码的三种方法&#xff1a;Class 字节码文件结构Class 文件数据类型Magic Number&#xff08;魔数&#xff09;文件版本号常量池集合常量池计数器&#xff1a;constant_pool_count常量池表: constant_pool [] (常量池)字面量和符号引用补充说明&#xff1…

qs库

源代码&#xff1a;github.com/hapiman/qs Golang中querystring的处理 将结构体转化成categoryc1&categoryc2&page2&page_size50&searchmysearch的形式 -------------- ---------------->| query string ------------------ | ------------…

方法返回值类型

方法返回值类型 首先&#xff0c;在方法声明中我们必须指定返回值类型&#xff0c;如果一个方法没有返回值类型&#xff0c;则必须使用void关键字作为返回值类型&#xff0c;如果方法声明时指定了返回值类型&#xff0c;就必须在方法体中使用return语句返回相应类型的值&#…

idea 插件 better-mybatis-generator 1.5.5 在 mysql8.0以上遇到的坑

下载插件&#xff0c;重启idea 在Settings->Tools中找的Mybatis generator plugin 设置如下图&#xff1a; 一些选项含义&#xff1a; 一个是dao package&#xff1a;generator 还有dao postfix java类文件后缀 Mapperxml package xml文件存放路径&#xff1a;generatormo…

在AD中如何实现统一桌面

实验环境&#xff0c;在公司中&#xff0c;老板要求市场部电脑都用统一的桌面&#xff0c;这时可以用AD域的组策略。实验步骤&#xff1a;一&#xff1a;找到作为背景桌面的图片&#xff0c;放到文件夹&#xff0c;并且共享&#xff0c;设置共享权限。二&#xff1a;打开组策略…