-
Notifications
You must be signed in to change notification settings - Fork 54
一段 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();