web3.js/test/contract.js

547 lines
23 KiB
JavaScript
Raw Normal View History

var chai = require('chai');
var assert = chai.assert;
2015-10-08 04:09:51 +02:00
var Web3 = require('../index');
var FakeHttpProvider = require('./helpers/FakeHttpProvider');
var FakeHttpProvider2 = require('./helpers/FakeHttpProvider2');
var utils = require('../lib/utils/utils');
2015-04-26 10:27:21 +02:00
var BigNumber = require('bignumber.js');
2015-05-16 17:03:27 +02:00
var sha3 = require('../lib/utils/sha3');
2015-10-08 08:41:55 +02:00
var desc = [{
"name": "balance(address)",
"type": "function",
"inputs": [{
"name": "who",
"type": "address"
}],
"constant": true,
"outputs": [{
"name": "value",
"type": "uint256"
}]
}, {
"name": "send(address,uint256)",
"type": "function",
"inputs": [{
"name": "to",
"type": "address"
}, {
"name": "value",
"type": "uint256"
}],
"outputs": []
}, {
"name": "testArr(int[])",
"type": "function",
"inputs": [{
"name": "value",
"type": "int[]"
}],
"constant": true,
"outputs": [{
"name": "d",
"type": "int"
}]
}, {
"name":"Changed",
"type":"event",
"inputs": [
{"name":"from","type":"address","indexed":true},
{"name":"amount","type":"uint256","indexed":true},
{"name":"t1","type":"uint256","indexed":false},
{"name":"t2","type":"uint256","indexed":false}
],
}];
2015-10-15 14:46:47 +08:00
var address = '0x1234567890123456789012345678901234567891';
2015-08-08 21:22:01 +02:00
describe('contract', function () {
describe('event', function () {
it('should create event subscription', function (done) {
var provider = new FakeHttpProvider();
var web3 = new Web3(provider);
2015-05-16 17:03:27 +02:00
var signature = 'Changed(address,uint256,uint256,uint256)';
var step = 0;
provider.injectValidation(function (payload) {
if (step === 0) {
provider.injectResult('0x123');
assert.equal(payload.jsonrpc, '2.0');
assert.equal(payload.method, 'eth_subscribe');
assert.deepEqual(payload.params[1], {
topics: [
2015-05-16 17:03:27 +02:00
'0x' + sha3(signature),
2015-10-15 14:46:47 +08:00
'0x0000000000000000000000001234567890123456789012345678901234567891',
2015-04-20 21:59:35 +02:00
null
],
2015-10-15 14:46:47 +08:00
address: '0x1234567890123456789012345678901234567891'
});
step++;
2015-05-16 17:03:27 +02:00
} else if (step === 1) {
provider.injectResult(true);
2015-04-09 09:15:04 +02:00
assert.equal(payload.jsonrpc, '2.0');
assert.equal(payload.method, 'eth_unsubscribe');
}
});
var contract = web3.eth.contract(desc).at(address);
2015-04-09 09:15:04 +02:00
var res = 0;
var event = contract.Changed({filter: {from: address}}, function(err, result) {
assert.equal(result.returnValues.from, address);
assert.equal(result.returnValues.amount, 1);
assert.equal(result.returnValues.t1, 1);
assert.equal(result.returnValues.t2, 8);
2015-04-09 09:15:04 +02:00
res++;
if (res === 1) {
event.unsubscribe();
2015-04-09 09:15:04 +02:00
done();
}
});
provider.injectNotification({
method: 'eth_subscription',
params: {
subscription: '0x123',
result: {
address: address,
topics: [
'0x' + sha3(signature),
'0x0000000000000000000000001234567890123456789012345678901234567891',
'0x0000000000000000000000000000000000000000000000000000000000000001'
],
blockNumber: 2,
data: '0x0000000000000000000000000000000000000000000000000000000000000001' +
'0000000000000000000000000000000000000000000000000000000000000008'
}
}
});
});
2015-03-31 09:34:06 +02:00
2015-06-24 10:28:12 +02:00
it('should create event filter and watch immediately', function (done) {
var provider = new FakeHttpProvider();
var web3 = new Web3(provider);
2015-06-24 10:28:12 +02:00
var signature = 'Changed(address,uint256,uint256,uint256)';
var step = 0;
provider.injectValidation(function (payload) {
if (step === 0) {
provider.injectResult('0x321');
2015-06-24 10:28:12 +02:00
assert.equal(payload.jsonrpc, '2.0');
assert.equal(payload.method, 'eth_subscribe');
assert.deepEqual(payload.params[1], {
2015-06-24 10:28:12 +02:00
topics: [
'0x' + sha3(signature),
2015-10-15 14:46:47 +08:00
'0x0000000000000000000000001234567890123456789012345678901234567891',
2015-06-24 10:28:12 +02:00
null
],
2015-10-15 14:46:47 +08:00
address: '0x1234567890123456789012345678901234567891'
2015-06-24 10:28:12 +02:00
});
step++;
2015-06-24 10:28:12 +02:00
} else if (step === 1) {
provider.injectResult(true);
assert.equal(payload.jsonrpc, '2.0');
assert.equal(payload.method, 'eth_unsubscribe');
}
});
var contract = web3.eth.contract(desc).at(address);
var res = 0;
var event = contract.Changed({filter: {from: address}}, function(err, result) {
assert.equal(result.returnValues.from, address);
assert.equal(result.returnValues.amount, 1);
assert.equal(result.returnValues.t1, 1);
assert.equal(result.returnValues.t2, 8);
res++;
if (res === 2) {
event.unsubscribe();
done();
}
});
provider.injectNotification({
method: 'eth_subscription',
params: {
subscription: '0x321',
result: {
2015-06-24 10:28:12 +02:00
address: address,
topics: [
'0x' + sha3(signature),
2015-10-15 14:46:47 +08:00
'0x0000000000000000000000001234567890123456789012345678901234567891',
2015-06-24 10:28:12 +02:00
'0x0000000000000000000000000000000000000000000000000000000000000001'
],
number: 2,
data: '0x0000000000000000000000000000000000000000000000000000000000000001' +
'0000000000000000000000000000000000000000000000000000000000000008'
}
}
});
provider.injectNotification({
method: 'eth_subscription',
params: {
subscription: '0x321',
result: {
2015-06-24 10:28:12 +02:00
address: address,
topics: [
'0x' + sha3(signature),
2015-10-15 14:46:47 +08:00
'0x0000000000000000000000001234567890123456789012345678901234567891',
2015-06-24 10:28:12 +02:00
'0x0000000000000000000000000000000000000000000000000000000000000001'
],
number: 2,
data: '0x0000000000000000000000000000000000000000000000000000000000000001' +
'0000000000000000000000000000000000000000000000000000000000000008'
}
2015-06-24 10:28:12 +02:00
}
});
});
2015-06-24 08:50:19 +02:00
it('should create all event filter', function (done) {
var provider = new FakeHttpProvider();
var web3 = new Web3(provider);
2015-06-24 08:50:19 +02:00
var signature = 'Changed(address,uint256,uint256,uint256)';
var step = 0;
provider.injectValidation(function (payload) {
if (step === 0) {
provider.injectResult('0x333');
2015-06-24 08:50:19 +02:00
assert.equal(payload.jsonrpc, '2.0');
assert.equal(payload.method, 'eth_subscribe');
assert.deepEqual(payload.params[1], {
topics: [],
2015-10-15 14:46:47 +08:00
address: '0x1234567890123456789012345678901234567891'
2015-06-24 08:50:19 +02:00
});
step++;
2015-06-24 08:50:19 +02:00
} else if (step === 1) {
provider.injectResult(true);
2015-06-24 08:50:19 +02:00
assert.equal(payload.jsonrpc, '2.0');
assert.equal(payload.method, 'eth_unsubscribe');
}
});
var contract = web3.eth.contract(desc).at(address);
var res = 0;
var event = contract.allEvents(function(err, result) {
assert.equal(result.returnValues.from, address);
assert.equal(result.returnValues.amount, 1);
assert.equal(result.returnValues.t1, 1);
assert.equal(result.returnValues.t2, 8);
res++;
if (res === 1) {
event.unsubscribe();
done();
}
});
provider.injectNotification({
method: 'eth_subscription',
params: {
subscription: '0x333',
result: {
2015-06-24 08:50:19 +02:00
address: address,
topics: [
'0x' + sha3(signature),
2015-10-15 14:46:47 +08:00
'0x0000000000000000000000001234567890123456789012345678901234567891',
2015-06-24 08:50:19 +02:00
'0x0000000000000000000000000000000000000000000000000000000000000001'
],
number: 2,
data: '0x0000000000000000000000000000000000000000000000000000000000000001' +
'0000000000000000000000000000000000000000000000000000000000000008'
}
2015-06-24 08:50:19 +02:00
}
});
});
2015-03-31 09:34:06 +02:00
it('should call constant function', function () {
var provider = new FakeHttpProvider();
var web3 = new Web3(provider);
2015-05-16 17:03:27 +02:00
provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032');
var signature = 'balance(address)'
2015-10-15 14:46:47 +08:00
var address = '0x1234567890123456789012345678901234567891';
2015-03-31 09:34:06 +02:00
provider.injectValidation(function (payload) {
2015-05-16 17:03:27 +02:00
assert.equal(payload.method, 'eth_call');
assert.deepEqual(payload.params, [{
2015-10-15 14:46:47 +08:00
data: '0x' + sha3(signature).slice(0, 8) + '0000000000000000000000001234567890123456789012345678901234567891',
2015-05-16 17:03:27 +02:00
to: address
}, 'latest']);
2015-03-31 09:34:06 +02:00
});
var contract = web3.eth.contract(desc).at(address);
2015-03-31 09:34:06 +02:00
2015-05-16 17:03:27 +02:00
var r = contract.balance(address);
assert.deepEqual(new BigNumber(0x32), r);
2015-03-31 09:34:06 +02:00
});
it('should call constant function with default block', function () {
var provider = new FakeHttpProvider();
var web3 = new Web3(provider);
provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032');
var signature = 'balance(address)'
2015-10-15 14:46:47 +08:00
var address = '0x1234567890123456789012345678901234567891';
provider.injectValidation(function (payload) {
assert.equal(payload.method, 'eth_call');
assert.deepEqual(payload.params, [{
2015-10-15 14:46:47 +08:00
data: '0x' + sha3(signature).slice(0, 8) + '0000000000000000000000001234567890123456789012345678901234567891',
to: address
}, '0xb']);
});
var contract = web3.eth.contract(desc).at(address);
var r = contract.balance(address, 11);
assert.deepEqual(new BigNumber(0x32), r);
});
2015-03-31 09:42:03 +02:00
it('should sendTransaction to contract function', function () {
2015-03-31 09:34:06 +02:00
var provider = new FakeHttpProvider();
var web3 = new Web3(provider);
2015-05-16 17:03:27 +02:00
var signature = 'send(address,uint256)';
2015-10-15 14:46:47 +08:00
var address = '0x1234567890123456789012345678901234567891';
2015-03-31 09:34:06 +02:00
provider.injectValidation(function (payload) {
2015-05-16 17:03:27 +02:00
assert.equal(payload.method, 'eth_sendTransaction');
assert.deepEqual(payload.params, [{
data: '0x' + sha3(signature).slice(0, 8) +
2015-10-15 14:46:47 +08:00
'0000000000000000000000001234567890123456789012345678901234567891' +
2015-05-16 17:03:27 +02:00
'0000000000000000000000000000000000000000000000000000000000000011' ,
2015-08-08 21:22:01 +02:00
from: address,
2015-05-16 17:03:27 +02:00
to: address
}]);
2015-03-31 09:34:06 +02:00
});
var contract = web3.eth.contract(desc).at(address);
2015-03-31 09:34:06 +02:00
2015-08-08 21:22:01 +02:00
contract.send(address, 17, {from: address});
2015-03-31 09:34:06 +02:00
});
2015-03-31 09:42:03 +02:00
it('should make a call with optional params', function () {
var provider = new FakeHttpProvider();
var web3 = new Web3(provider);
2015-05-16 17:03:27 +02:00
provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032');
var signature = 'balance(address)';
2015-10-15 14:46:47 +08:00
var address = '0x1234567890123456789012345678901234567891';
2015-03-31 09:42:03 +02:00
provider.injectValidation(function (payload) {
2015-05-16 17:03:27 +02:00
assert.equal(payload.method, 'eth_call');
assert.deepEqual(payload.params, [{
2015-10-15 14:46:47 +08:00
data: '0x' + sha3(signature).slice(0, 8) + '0000000000000000000000001234567890123456789012345678901234567891',
2015-05-16 17:03:27 +02:00
to: address,
from: address,
gas: '0xc350'
}, 'latest']);
2015-03-31 09:42:03 +02:00
});
var contract = web3.eth.contract(desc).at(address);
2015-03-31 09:42:03 +02:00
2015-05-16 17:03:27 +02:00
var r = contract.balance(address, {from: address, gas: 50000});
assert.deepEqual(new BigNumber(0x32), r);
2015-03-31 09:42:03 +02:00
});
it('should explicitly make a call with optional params', function () {
var provider = new FakeHttpProvider();
var web3 = new Web3(provider);
2015-05-16 17:03:27 +02:00
provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032');
var signature = 'balance(address)';
2015-10-15 14:46:47 +08:00
var address = '0x1234567890123456789012345678901234567891';
provider.injectValidation(function (payload) {
2015-05-16 17:03:27 +02:00
assert.equal(payload.method, 'eth_call');
assert.deepEqual(payload.params, [{
2015-10-15 14:46:47 +08:00
data: '0x' + sha3(signature).slice(0, 8) + '0000000000000000000000001234567890123456789012345678901234567891',
2015-05-16 17:03:27 +02:00
to: address,
from: address,
gas: '0xc350'
}, 'latest']);
});
var contract = web3.eth.contract(desc).at(address);
2015-05-16 17:03:27 +02:00
var r = contract.balance.call(address, {from: address, gas: 50000});
assert.deepEqual(new BigNumber(0x32), r);
2015-03-31 09:42:03 +02:00
});
it('should explicitly make a call with optional params and defaultBlock', function () {
var provider = new FakeHttpProvider();
var web3 = new Web3(provider);
provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032');
var signature = 'balance(address)';
2015-10-15 14:46:47 +08:00
var address = '0x1234567890123456789012345678901234567891';
provider.injectValidation(function (payload) {
assert.equal(payload.method, 'eth_call');
assert.deepEqual(payload.params, [{
2015-10-15 14:46:47 +08:00
data: '0x' + sha3(signature).slice(0, 8) + '0000000000000000000000001234567890123456789012345678901234567891',
to: address,
from: address,
gas: '0xc350'
}, '0xb']);
});
var contract = web3.eth.contract(desc).at(address);
var r = contract.balance.call(address, {from: address, gas: 50000}, 11);
assert.deepEqual(new BigNumber(0x32), r);
});
it('should sendTransaction with optional params', function () {
var provider = new FakeHttpProvider();
var web3 = new Web3(provider);
2015-05-16 17:03:27 +02:00
var signature = 'send(address,uint256)';
2015-10-15 14:46:47 +08:00
var address = '0x1234567890123456789012345678901234567891';
provider.injectValidation(function (payload) {
2015-05-16 17:03:27 +02:00
assert.equal(payload.method, 'eth_sendTransaction');
assert.deepEqual(payload.params, [{
data: '0x' + sha3(signature).slice(0, 8) +
2015-10-15 14:46:47 +08:00
'0000000000000000000000001234567890123456789012345678901234567891' +
2015-05-16 17:03:27 +02:00
'0000000000000000000000000000000000000000000000000000000000000011' ,
to: address,
from: address,
gas: '0xc350',
gasPrice: '0xbb8',
value: '0x2710'
}]);
});
var contract = web3.eth.contract(desc).at(address);
contract.send(address, 17, {from: address, gas: 50000, gasPrice: 3000, value: 10000});
});
it('should explicitly sendTransaction with optional params', function () {
var provider = new FakeHttpProvider();
var web3 = new Web3(provider);
2015-05-16 17:03:27 +02:00
var signature = 'send(address,uint256)';
2015-10-15 14:46:47 +08:00
var address = '0x1234567890123456789012345678901234567891';
provider.injectValidation(function (payload) {
2015-05-16 17:03:27 +02:00
assert.equal(payload.method, 'eth_sendTransaction');
assert.deepEqual(payload.params, [{
data: '0x' + sha3(signature).slice(0, 8) +
2015-10-15 14:46:47 +08:00
'0000000000000000000000001234567890123456789012345678901234567891' +
2015-05-16 17:03:27 +02:00
'0000000000000000000000000000000000000000000000000000000000000011' ,
to: address,
from: address,
gas: '0xc350',
gasPrice: '0xbb8',
value: '0x2710'
}]);
});
var contract = web3.eth.contract(desc).at(address);
contract.send.sendTransaction(address, 17, {from: address, gas: 50000, gasPrice: 3000, value: 10000});
});
2015-05-11 18:59:46 +02:00
it('should explicitly sendTransaction with optional params and call callback without error', function (done) {
var provider = new FakeHttpProvider();
var web3 = new Web3(provider);
2015-10-15 14:46:47 +08:00
var address = '0x1234567890123456789012345678901234567891';
2015-05-16 17:03:27 +02:00
var signature = 'send(address,uint256)';
2015-05-11 18:59:46 +02:00
provider.injectValidation(function (payload) {
2015-05-16 17:03:27 +02:00
assert.equal(payload.method, 'eth_sendTransaction');
assert.deepEqual(payload.params, [{
data: '0x' + sha3(signature).slice(0, 8) +
2015-10-15 14:46:47 +08:00
'0000000000000000000000001234567890123456789012345678901234567891' +
2015-05-16 17:03:27 +02:00
'0000000000000000000000000000000000000000000000000000000000000011' ,
to: address,
from: address,
gas: '0xc350',
gasPrice: '0xbb8',
value: '0x2710'
}]);
2015-05-11 18:59:46 +02:00
});
var contract = web3.eth.contract(desc).at(address);
contract.send.sendTransaction(address, 17, {from: address, gas: 50000, gasPrice: 3000, value: 10000}, function (err) {
assert.equal(err, null);
done();
});
});
it('should explicitly estimateGas with optional params', function () {
var provider = new FakeHttpProvider();
var web3 = new Web3(provider);
var signature = 'send(address,uint256)';
2015-10-15 14:46:47 +08:00
var address = '0x1234567890123456789012345678901234567891';
provider.injectValidation(function (payload) {
assert.equal(payload.method, 'eth_estimateGas');
assert.deepEqual(payload.params, [{
data: '0x' + sha3(signature).slice(0, 8) +
2015-10-15 14:46:47 +08:00
'0000000000000000000000001234567890123456789012345678901234567891' +
'0000000000000000000000000000000000000000000000000000000000000011' ,
to: address,
from: address,
gas: '0xc350',
gasPrice: '0xbb8',
value: '0x2710'
}]);
});
var contract = web3.eth.contract(desc).at(address);
contract.send.estimateGas(address, 17, {from: address, gas: 50000, gasPrice: 3000, value: 10000});
});
it('should call testArr method and properly parse result', function () {
var provider = new FakeHttpProvider2();
var web3 = new Web3(provider);
2015-05-16 17:03:27 +02:00
var signature = 'testArr(int[])';
2015-10-15 14:46:47 +08:00
var address = '0x1234567890123456789012345678901234567891';
provider.injectResultList([{
result: '0x0000000000000000000000000000000000000000000000000000000000000005'
}]);
2015-05-16 17:03:27 +02:00
provider.injectValidation(function (payload) {
2015-05-16 17:03:27 +02:00
assert.equal(payload.method, 'eth_call');
assert.deepEqual(payload.params, [{
data: '0x' + sha3(signature).slice(0, 8) +
'0000000000000000000000000000000000000000000000000000000000000020' +
'0000000000000000000000000000000000000000000000000000000000000001' +
'0000000000000000000000000000000000000000000000000000000000000003',
to: address
},
'latest'
]);
});
var contract = web3.eth.contract(desc).at(address);
2015-04-26 10:27:21 +02:00
var result = contract.testArr([3]);
assert.deepEqual(new BigNumber(5), result);
});
2015-05-11 18:59:46 +02:00
it('should call testArr method, properly parse result and return the result async', function (done) {
var provider = new FakeHttpProvider2();
var web3 = new Web3(provider);
2015-05-16 17:03:27 +02:00
var signature = 'testArr(int[])';
2015-10-15 14:46:47 +08:00
var address = '0x1234567890123456789012345678901234567891';
2015-05-11 18:59:46 +02:00
provider.injectResultList([{
result: '0x0000000000000000000000000000000000000000000000000000000000000005'
}]);
provider.injectValidation(function (payload) {
2015-05-16 17:03:27 +02:00
assert.equal(payload.method, 'eth_call');
assert.deepEqual(payload.params, [{
data: '0x' + sha3(signature).slice(0, 8) +
'0000000000000000000000000000000000000000000000000000000000000020' +
'0000000000000000000000000000000000000000000000000000000000000001' +
'0000000000000000000000000000000000000000000000000000000000000003',
to: address
},
'latest'
]);
2015-05-11 18:59:46 +02:00
});
var contract = web3.eth.contract(desc).at(address);
contract.testArr([3], function (err, result) {
assert.deepEqual(new BigNumber(5), result);
done();
});
});
});
});
2015-05-12 07:01:33 +02:00