Skip to content

一段 JS 调用合约的示例代码

fushang318 edited this page Oct 26, 2019 · 1 revision


// use log4js/bignumber
var log4js = require('log4js');
var BigNumber = require('bignumber.js');

// use eth/accounts/web3
var Eth = require('web3-eth');
var Account = require("eth-lib/lib/account");
var Web3 = require('web3');

// init logger
var logger = log4js.getLogger();
logger.level = 'info';

const MAGNITUDE = 10 ** 18;

// get built-json: you-wallet, proxy, hydro, temp-match
var ywtjs = require("../build/contracts/YouWalletToken");
var proxyjs = require("../build/contracts/Proxy");
var hdjs = require("../build/contracts/HybridExchange");
var tmjs = require("../build/contracts/TempMatch");

// get address: you-wallet, proxy, hydro, temp-match
var ywtaddr = "0x0773ea04922cD5AfEc058913Facf510A933B3037";
var proxyaddr = "0x93D0ED44d969Bf11dE6E6c50aF67277a78e17ec1";
var hdaddr = "0x4ce098b6CDAD72868Cd808dB932eE70C76ADd18D";
var tmaddr = "0xce2be65Fb5e556F1A6fEcbCFB8a7C229a9291EAC";

// get addres: base-token, quote-token
var btaddr = "0x650bbF72782E2112508771141B1d40a8Eaa013d8";
var qtaddr = "0xa9C19e6e2d0728Ce95B57C1c43EB82140fCD1D38"


// get eth
var eth = new Eth("https://ropsten.infura.io/v3/99a79f80961b4db7aab7c9f54375eda7");

// get contract: you-wallet, proxy, hydro, temp-match
var ywt = new eth.Contract(ywtjs.abi, ywtaddr);
var proxy = new eth.Contract(proxyjs.abi, proxyaddr);
var hd = new eth.Contract(hdjs.abi, hdaddr);
var tm = new eth.Contract(tmjs.abi, tmaddr);

// get contract: base-token, quote-token
var bt = new eth.Contract(ywtjs.abi, btaddr);
var qt = new eth.Contract(ywtjs.abi, qtaddr);

// private keys
pks = ["0x221f92bfe83e71010de0effebc1da9c1bf689106b247c23e4e0c98a25880b43e",
       "0xd57186f6ae17c85bf939d1cc1af0c81d3c752bbd76a13e96327b422e2b36ff86",
       "0x90bcd062d1c89d478568783179d0b4c31db32bbd3c5e2b3923fc0492119f5a45",
       "0x35b78f7639985406ac34175b9374833c1ff84bf4a6e55c94760626380fcab16e",
       "0xcda82da4c2d9ec4333d3d6a0eacff0a378d0e61fe7276b75ef205f3e67a8b0b9"]


// accounts
accs= []
for (i = 0; i < pks.length; i ++){
accs[i] = eth.accounts.privateKeyToAccount(pks[i])
}

// use bignumber
var get_fixed_value = function(value) {
    v = new BigNumber(value);
    return v.toFixed();
};

// call func
async function call_func(cont_addr, func, acc){
    // get encoded transaction
    var txd = func.encodeABI();
    var tx = {
        nonce: await eth.getTransactionCount(acc.address),
        gasPrice: Web3.utils.toHex(4000000000),
        gasLimit: Web3.utils.toHex(7000000),
        from: acc.address,
        to: cont_addr,
        data: txd
    };

    // sign transaction
    stx = await eth.accounts.signTransaction(tx, acc.privateKey);
    await eth.sendSignedTransaction(stx.rawTransaction);
};

/* tmc: temp-match contract
 * rl: relayer
 * bt: base token
 * qt: quote token
 * bta: base token amount
 * qta: quote token amount
 * gta: gas token amount
 * is: is-sell
 * from: 
 * from_key:
 */
async function take_order(tmc, rl, bt, qt, bta, qta, gta, is, acc){
    // get order set
    var orderset = [bt._address, qt._address, rl];
    // get data for take-order
    var data = await tmc.methods.getConfigData(is).call();
    // get raw take-order
    var takeorder = [acc.address, get_fixed_value(bta * MAGNITUDE), get_fixed_value(qta * MAGNITUDE), get_fixed_value(gta * MAGNITUDE), data, ["0x0", "0x0", "0x0"]];
    // get hash for order and base-quote
    var hash = await tmc.methods.getBQODHash(takeorder, orderset).call();
    //  sign oder hash
    var signature = Account.sign(hash.od_hash, acc.privateKey);
    // get v/r/s
    var vrs = Account.decodeSignature(signature);
    // get signature for data
    var sig = await tmc.methods.getConfigSignature(vrs[0], vrs[1], vrs[2], 1).call();
    // make finally take-order
    takeorder[5] = sig;
    // take order
    await call_func(tmc._address, tmc.methods.takeOrder(takeorder, orderset), acc);

    return hash;
};


async function mainfunc() {

    // approve
    for (i = 0; i < pks.length; i ++){
        logger.info(1, i);
        await call_func(bt._address, bt.methods.approve(proxy._address, get_fixed_value(1e+21)), accs[i]);
        await call_func(qt._address, qt.methods.approve(proxy._address, get_fixed_value(1e+21)), accs[i]);
    }

    logger.info(2);
    // acc1's sell order: base-token/quote-token, 200/20, relayer(acc[0])
    await take_order(tm, accs[0].address, bt, qt, 200, 20, 0, true, accs[1]);
    // acc2's buy order: base-token/quote-token, 200/10, relayer(acc[0])
    await take_order(tm, accs[0].address, bt, qt, 200, 10, 0, false, accs[2]);
    // acc3's buy order: base-token/quote-token, 200/30, relayer(acc[0])
    await take_order(tm, accs[0].address, bt, qt, 200, 30, 0, false, accs[3]);
};

mainfunc();