mirror of
https://github.com/status-im/web3.js.git
synced 2025-02-23 03:28:07 +00:00
added contract.clone()
This commit is contained in:
parent
e6b89d4d38
commit
e94a0a00a1
@ -197,6 +197,44 @@ Example
|
|||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
clone
|
||||||
|
=====================
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
myContract.clone()
|
||||||
|
|
||||||
|
Clones the current contract instance.
|
||||||
|
|
||||||
|
----------
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
|
||||||
|
none
|
||||||
|
|
||||||
|
-------
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
|
||||||
|
|
||||||
|
``Object``: The new contract instance.
|
||||||
|
|
||||||
|
-------
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
var contract1 = new eth.Contract(abi, address, {gasPrice: '12345678', from: fromAddress});
|
||||||
|
|
||||||
|
var contract2 = contract1.clone();
|
||||||
|
contract2.options.address = address2;
|
||||||
|
|
||||||
|
(contract1.options.address !== contract2.options.address);
|
||||||
|
> true
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
.. _contract-deploy:
|
.. _contract-deploy:
|
||||||
|
|
||||||
|
@ -51,27 +51,27 @@ var Contract = function(jsonInterface, address, options) {
|
|||||||
var _this = this,
|
var _this = this,
|
||||||
args = Array.prototype.slice.call(arguments);
|
args = Array.prototype.slice.call(arguments);
|
||||||
|
|
||||||
if(!(this instanceof Contract))
|
if(!(this instanceof Contract)) {
|
||||||
throw new Error('Please use the "new" keyword to instantiate a web3.eth.contract() object!');
|
throw new Error('Please use the "new" keyword to instantiate a web3.eth.contract() object!');
|
||||||
|
}
|
||||||
|
|
||||||
if(!jsonInterface || !(jsonInterface instanceof Array))
|
if(!jsonInterface || !(jsonInterface instanceof Array)) {
|
||||||
throw new Error('You must provide the json interface of the contract when instatiating a contract object.');
|
throw new Error('You must provide the json interface of the contract when instatiating a contract object.');
|
||||||
|
}
|
||||||
|
|
||||||
// get the options object
|
|
||||||
|
// create the options object
|
||||||
this.options = {};
|
this.options = {};
|
||||||
|
|
||||||
if(utils.isObject(args[args.length - 1])) {
|
if(utils.isObject(args[args.length - 1])) {
|
||||||
options = args[args.length - 1];
|
options = args[args.length - 1];
|
||||||
this.options.data = options.data;
|
|
||||||
this.options.from = options.from;
|
|
||||||
this.options.gasPrice = options.gasPrice;
|
|
||||||
this.options.gas = options.gas || options.gasLimit;
|
|
||||||
|
|
||||||
|
this.options = _.extend(this.options, this._fillWithDefaultOptions(options));
|
||||||
if(utils.isObject(address)) {
|
if(utils.isObject(address)) {
|
||||||
address = null;
|
address = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// set address
|
// set address
|
||||||
Object.defineProperty(this.options, 'address', {
|
Object.defineProperty(this.options, 'address', {
|
||||||
set: function(value){
|
set: function(value){
|
||||||
@ -203,15 +203,17 @@ Contract.prototype._checkListener = function(type, event){
|
|||||||
* @return {Object} the options with gaps filled by defaults
|
* @return {Object} the options with gaps filled by defaults
|
||||||
*/
|
*/
|
||||||
Contract.prototype._fillWithDefaultOptions = function fillWithDefaultOptions(options) {
|
Contract.prototype._fillWithDefaultOptions = function fillWithDefaultOptions(options) {
|
||||||
|
var gasPrice = options.gasPrice ? String(options.gasPrice): null;
|
||||||
|
|
||||||
options.data = options.data || this.options.data;
|
options.data = options.data || this.options.data;
|
||||||
options.from = options.from || this.options.from;
|
|
||||||
|
|
||||||
if(utils.isAddress(options.from))
|
if(utils.isAddress(options.from))
|
||||||
options.from = options.from.toLowerCase();
|
options.from = options.from.toLowerCase();
|
||||||
|
|
||||||
options.gasPrice = options.gasPrice || this.options.gasPrice;
|
options.from = options.from || this.options.from;
|
||||||
|
options.gasPrice = gasPrice || this.options.gasPrice;
|
||||||
options.gas = options.gas || options.gasLimit || this.options.gas;
|
options.gas = options.gas || options.gasLimit || this.options.gas;
|
||||||
|
|
||||||
// TODO replace with only gasLimit?
|
// TODO replace with only gasLimit?
|
||||||
delete options.gasLimit;
|
delete options.gasLimit;
|
||||||
|
|
||||||
@ -508,7 +510,18 @@ Contract.prototype._generateEventOptions = function() {
|
|||||||
/**
|
/**
|
||||||
* Adds event listeners and creates a subscription, and remove it once its fired.
|
* Adds event listeners and creates a subscription, and remove it once its fired.
|
||||||
*
|
*
|
||||||
* @method on
|
* @method clone
|
||||||
|
* @return {Object} the event subscription
|
||||||
|
*/
|
||||||
|
Contract.prototype.clone = function() {
|
||||||
|
return new Contract(this.options.jsonInterface, this.options.address, this.options);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds event listeners and creates a subscription, and remove it once its fired.
|
||||||
|
*
|
||||||
|
* @method once
|
||||||
* @param {String} event
|
* @param {String} event
|
||||||
* @param {Object} options
|
* @param {Object} options
|
||||||
* @param {Function} callback
|
* @param {Function} callback
|
||||||
@ -540,7 +553,7 @@ Contract.prototype.once = function(event, options, callback) {
|
|||||||
/**
|
/**
|
||||||
* Adds event listeners and creates a subscription.
|
* Adds event listeners and creates a subscription.
|
||||||
*
|
*
|
||||||
* @method on
|
* @method _on
|
||||||
* @param {String} event
|
* @param {String} event
|
||||||
* @param {Object} options
|
* @param {Object} options
|
||||||
* @param {Function} callback
|
* @param {Function} callback
|
||||||
|
@ -113,6 +113,44 @@ describe('contract', function () {
|
|||||||
|
|
||||||
assert.throws(test);
|
assert.throws(test);
|
||||||
});
|
});
|
||||||
|
it('.clone() should properly clone the contract instance', function () {
|
||||||
|
var provider = new FakeHttpProvider();
|
||||||
|
var eth = new Eth(provider);
|
||||||
|
var fromAddress = '0xDDfFD0A3C12e86b4b5f39B213f7e19d048276daE';
|
||||||
|
var abi2 = [{
|
||||||
|
"name": "ballerRo",
|
||||||
|
"type": "function",
|
||||||
|
"inputs": [{
|
||||||
|
"name": "So",
|
||||||
|
"type": "address"
|
||||||
|
}],
|
||||||
|
"constant": true,
|
||||||
|
"outputs": [{
|
||||||
|
"name": "man",
|
||||||
|
"type": "uint256"
|
||||||
|
}]
|
||||||
|
}];
|
||||||
|
|
||||||
|
var contract1 = new eth.Contract(abi, address, {gas: 1222, gasPrice: 12345678, from: fromAddress});
|
||||||
|
var contract2 = contract1.clone();
|
||||||
|
|
||||||
|
assert.equal(contract1.options.address, address);
|
||||||
|
assert.equal(contract1.options.gas, 1222);
|
||||||
|
assert.equal(contract1.options.gasPrice, '12345678');
|
||||||
|
assert.deepEqual(contract1.options.jsonInterface, abi);
|
||||||
|
|
||||||
|
|
||||||
|
contract2.options.jsonInterface = abi2;
|
||||||
|
contract2.options.address = fromAddress;
|
||||||
|
contract2.options.gas = 300;
|
||||||
|
contract2.options.gasPrice = '234234';
|
||||||
|
|
||||||
|
assert.isFunction(contract2.methods.ballerRo);
|
||||||
|
assert.equal(contract2.options.address, fromAddress);
|
||||||
|
assert.equal(contract2.options.gas, 300);
|
||||||
|
assert.equal(contract2.options.gasPrice, '234234');
|
||||||
|
assert.deepEqual(contract2.options.jsonInterface, abi2);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
describe('internal method', function () {
|
describe('internal method', function () {
|
||||||
it('_encodeEventABI should return the encoded event object without topics', function () {
|
it('_encodeEventABI should return the encoded event object without topics', function () {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user