diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js
index 570c36287..dd36afead 100644
--- a/js/src/api/contract/contract.js
+++ b/js/src/api/contract/contract.js
@@ -107,34 +107,26 @@ export default class Contract {
});
}
- deploy (options, values, statecb) {
- const setState = (state) => {
- if (!statecb) {
- return;
- }
-
- return statecb(null, state);
- };
-
- setState({ state: 'estimateGas' });
+ deploy (options, values, statecb = () => {}) {
+ statecb(null, { state: 'estimateGas' });
return this
.deployEstimateGas(options, values)
.then(([gasEst, gas]) => {
options.gas = gas.toFixed(0);
- setState({ state: 'postTransaction', gas });
+ statecb(null, { state: 'postTransaction', gas });
- const _options = this._encodeOptions(this.constructors[0], options, values);
+ const encodedOptions = this._encodeOptions(this.constructors[0], options, values);
return this._api.parity
- .postTransaction(_options)
+ .postTransaction(encodedOptions)
.then((requestId) => {
- setState({ state: 'checkRequest', requestId });
+ statecb(null, { state: 'checkRequest', requestId });
return this._pollCheckRequest(requestId);
})
.then((txhash) => {
- setState({ state: 'getTransactionReceipt', txhash });
+ statecb(null, { state: 'getTransactionReceipt', txhash });
return this._pollTransactionReceipt(txhash, gas);
})
.then((receipt) => {
@@ -142,23 +134,23 @@ export default class Contract {
throw new Error(`Contract not deployed, gasUsed == ${gas.toFixed(0)}`);
}
- setState({ state: 'hasReceipt', receipt });
+ statecb(null, { state: 'hasReceipt', receipt });
this._receipt = receipt;
this._address = receipt.contractAddress;
return this._address;
- });
- })
- .then((address) => {
- setState({ state: 'getCode' });
- return this._api.eth.getCode(this._address);
- })
- .then((code) => {
- if (code === '0x') {
- throw new Error('Contract not deployed, getCode returned 0x');
- }
+ })
+ .then((address) => {
+ statecb(null, { state: 'getCode' });
+ return this._api.eth.getCode(this._address);
+ })
+ .then((code) => {
+ if (code === '0x') {
+ throw new Error('Contract not deployed, getCode returned 0x');
+ }
- setState({ state: 'completed' });
- return this._address;
+ statecb(null, { state: 'completed' });
+ return this._address;
+ });
});
}
diff --git a/js/src/contracts/abi/old-wallet.json b/js/src/contracts/abi/old-wallet.json
new file mode 100644
index 000000000..930069742
--- /dev/null
+++ b/js/src/contracts/abi/old-wallet.json
@@ -0,0 +1,466 @@
+[
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "removeOwner",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_addr",
+ "type": "address"
+ }
+ ],
+ "name": "isOwner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "m_numOwners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "m_lastDay",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [],
+ "name": "resetSpentToday",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "m_spentToday",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "addOwner",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "m_required",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_h",
+ "type": "bytes32"
+ }
+ ],
+ "name": "confirm",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_newLimit",
+ "type": "uint256"
+ }
+ ],
+ "name": "setDailyLimit",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ },
+ {
+ "name": "_data",
+ "type": "bytes"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "name": "_r",
+ "type": "bytes32"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_operation",
+ "type": "bytes32"
+ }
+ ],
+ "name": "revoke",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_newRequired",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeRequirement",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_operation",
+ "type": "bytes32"
+ },
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "hasConfirmed",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "ownerIndex",
+ "type": "uint256"
+ }
+ ],
+ "name": "getOwner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ }
+ ],
+ "name": "kill",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ }
+ ],
+ "name": "changeOwner",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "m_dailyLimit",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_owners",
+ "type": "address[]"
+ },
+ {
+ "name": "_required",
+ "type": "uint256"
+ },
+ {
+ "name": "_daylimit",
+ "type": "uint256"
+ }
+ ],
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "operation",
+ "type": "bytes32"
+ }
+ ],
+ "name": "Confirmation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "operation",
+ "type": "bytes32"
+ }
+ ],
+ "name": "Revoke",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "oldOwner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerAdded",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "oldOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerRemoved",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "newRequirement",
+ "type": "uint256"
+ }
+ ],
+ "name": "RequirementChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "SingleTransact",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "operation",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "MultiTransact",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "operation",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "name": "initiator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "ConfirmationNeeded",
+ "type": "event"
+ }
+]
diff --git a/js/src/contracts/abi/wallet.json b/js/src/contracts/abi/wallet.json
index 8048d239c..752407e62 100644
--- a/js/src/contracts/abi/wallet.json
+++ b/js/src/contracts/abi/wallet.json
@@ -1 +1,476 @@
-[{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"removeOwner","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"m_numOwners","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"m_lastDay","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[],"name":"resetSpentToday","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"m_spentToday","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"addOwner","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"m_required","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_h","type":"bytes32"}],"name":"confirm","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_newLimit","type":"uint256"}],"name":"setDailyLimit","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"execute","outputs":[{"name":"_r","type":"bytes32"}],"type":"function"},{"constant":false,"inputs":[{"name":"_operation","type":"bytes32"}],"name":"revoke","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_newRequired","type":"uint256"}],"name":"changeRequirement","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_operation","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"hasConfirmed","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"ownerIndex","type":"uint256"}],"name":"getOwner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"kill","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"changeOwner","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"m_dailyLimit","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"inputs":[{"name":"_owners","type":"address[]"},{"name":"_required","type":"uint256"},{"name":"_daylimit","type":"uint256"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"}],"name":"OwnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRequirement","type":"uint256"}],"name":"RequirementChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"SingleTransact","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"MultiTransact","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"operation","type":"bytes32"},{"indexed":false,"name":"initiator","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"ConfirmationNeeded","type":"event"}]
+[
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "removeOwner",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_addr",
+ "type": "address"
+ }
+ ],
+ "name": "isOwner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "m_numOwners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "m_lastDay",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [],
+ "name": "resetSpentToday",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "m_spentToday",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "addOwner",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "m_required",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_h",
+ "type": "bytes32"
+ }
+ ],
+ "name": "confirm",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_newLimit",
+ "type": "uint256"
+ }
+ ],
+ "name": "setDailyLimit",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ },
+ {
+ "name": "_data",
+ "type": "bytes"
+ }
+ ],
+ "name": "execute",
+ "outputs": [
+ {
+ "name": "_r",
+ "type": "bytes32"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_operation",
+ "type": "bytes32"
+ }
+ ],
+ "name": "revoke",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_newRequired",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeRequirement",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_operation",
+ "type": "bytes32"
+ },
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "hasConfirmed",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "ownerIndex",
+ "type": "uint256"
+ }
+ ],
+ "name": "getOwner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ }
+ ],
+ "name": "kill",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ }
+ ],
+ "name": "changeOwner",
+ "outputs": [],
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "m_dailyLimit",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_owners",
+ "type": "address[]"
+ },
+ {
+ "name": "_required",
+ "type": "uint256"
+ },
+ {
+ "name": "_daylimit",
+ "type": "uint256"
+ }
+ ],
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "operation",
+ "type": "bytes32"
+ }
+ ],
+ "name": "Confirmation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "operation",
+ "type": "bytes32"
+ }
+ ],
+ "name": "Revoke",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "oldOwner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerAdded",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "oldOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerRemoved",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "newRequirement",
+ "type": "uint256"
+ }
+ ],
+ "name": "RequirementChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "created",
+ "type": "address"
+ }
+ ],
+ "name": "SingleTransact",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "operation",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "created",
+ "type": "address"
+ }
+ ],
+ "name": "MultiTransact",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "operation",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "name": "initiator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "ConfirmationNeeded",
+ "type": "event"
+ }
+]
diff --git a/js/src/contracts/code/wallet.js b/js/src/contracts/code/wallet.js
index 10e2c5699..381bd153f 100644
--- a/js/src/contracts/code/wallet.js
+++ b/js/src/contracts/code/wallet.js
@@ -15,15 +15,16 @@
// along with Parity. If not, see .
/**
- * @version Solidity v0.4.6
+ * @version Solidity v0.4.9 - Optimized
* @from https://github.com/ethcore/parity/blob/63137b15482344ff9df634c086abaabed452eadc/js/src/contracts/snippets/enhanced-wallet.sol
- * @date 09-Dec-2016 @ 16h00 UTC
+ * @date 07-Mar-2017 @ 16h00 UTC
*/
-export const wallet = '0x6060604052346100005760405161041b38038061041b83398101604090815281516020830151918301519201915b604080517f696e697457616c6c657428616464726573735b5d2c75696e743235362c75696e81527f7432353629000000000000000000000000000000000000000000000000000000602080830191909152915190819003602501902084516000829052909173__WalletLibrary_________________________91600281019160049182010290819038829003903960006000600483016000866127105a03f45b505050505050505b610337806100e46000396000f36060604052361561006c5760e060020a60003504632f54bf6e81146101245780634123cb6b146101485780635237509314610167578063659010e714610186578063746c9171146101a5578063c2cf7326146101c4578063c41a360a146101eb578063f1736d8614610217575b6101225b60003411156100c15760408051600160a060020a033316815234602082015281517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c929181900390910190a161011e565b600036111561011e5773__WalletLibrary_________________________600160a060020a0316600036600060405160200152604051808383808284378201915050925050506020604051808303818560325a03f4156100005750505b5b5b565b005b3461000057610134600435610236565b604080519115158252519081900360200190f35b3461000057610155610297565b60408051918252519081900360200190f35b346100005761015561029d565b60408051918252519081900360200190f35b34610000576101556102a3565b60408051918252519081900360200190f35b34610000576101556102a9565b60408051918252519081900360200190f35b34610000576101346004356024356102af565b604080519115158252519081900360200190f35b34610000576101fb600435610311565b60408051600160a060020a039092168252519081900360200190f35b3461000057610155610331565b60408051918252519081900360200190f35b600073__WalletLibrary_________________________600160a060020a0316600036600060405160200152604051808383808284378201915050925050506020604051808303818560325a03f4156100005750506040515190505b919050565b60015481565b60045481565b60035481565b60005481565b600073__WalletLibrary_________________________600160a060020a0316600036600060405160200152604051808383808284378201915050925050506020604051808303818560325a03f4156100005750506040515190505b92915050565b6000600582600101610100811015610000570160005b505490505b919050565b6002548156';
-export const walletLibrary = '0x606060405234610000575b611381806100186000396000f3606060405236156100da5760e060020a6000350463173825d981146100df5780632f54bf6e146100f157806352375093146101155780635c52c2f514610134578063659010e7146101435780637065cb4814610162578063797af627146101745780639da5e0eb14610198578063b20d30a9146101aa578063b61d27f6146101bc578063b75c7dc614610227578063ba51a6df14610239578063c2cf73261461024b578063c57c5f6014610272578063cbf0b0c0146102c6578063e46dcfeb146102d8578063f00d4b5d14610331578063f1736d8614610346575b610000565b34610000576100ef600435610365565b005b3461000057610101600435610452565b604080519115158252519081900360200190f35b3461000057610122610473565b60408051918252519081900360200190f35b34610000576100ef610479565b005b34610000576101226104b0565b60408051918252519081900360200190f35b34610000576100ef6004356104b6565b005b34610000576101016004356105a5565b604080519115158252519081900360200190f35b34610000576100ef60043561081e565b005b34610000576100ef600435610832565b005b3461000057604080516020600460443581810135601f810184900484028501840190955284845261010194823594602480359560649492939190920191819084018382808284375094965061086a95505050505050565b604080519115158252519081900360200190f35b34610000576100ef600435610bcc565b005b34610000576100ef600435610c77565b005b3461000057610101600435602435610cf9565b604080519115158252519081900360200190f35b34610000576100ef6004808035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496505093359350610d4e92505050565b005b34610000576100ef600435610e13565b005b34610000576100ef60048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965050843594602001359350610e5192505050565b005b34610000576100ef600435602435610e6a565b005b3461000057610122610f63565b60408051918252519081900360200190f35b600060003660405180838380828437820191505092505050604051809103902061038e81610f69565b1561044b57600160a060020a0383166000908152610105602052604090205491508115156103bb5761044b565b60016001540360005411156103cf5761044b565b6000600583610100811015610000570160005b5055600160a060020a03831660009081526101056020526040812055610406611108565b61040e6111dc565b60408051600160a060020a038516815290517f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da9181900360200190a15b5b5b505050565b600160a060020a03811660009081526101056020526040812054115b919050565b60045481565b6000366040518083838082843782019150509250505060405180910390206104a081610f69565b156104ab5760006003555b5b5b50565b60035481565b6000366040518083838082843782019150509250505060405180910390206104dd81610f69565b1561059f576104eb82610452565b156104f55761059f565b6104fd611108565b60015460fa9010610510576105106111dc565b5b60015460fa90106105215761059f565b60018054810190819055600160a060020a03831690600590610100811015610000570160005b5055600154600160a060020a03831660008181526101056020908152604091829020939093558051918252517f994a936646fe87ffe4f1e469d3d6aa417d6b855598397f323de5b449f765f0c3929181900390910190a15b5b5b5050565b6000816105b181610f69565b156108155760008381526101086020526040902054600160a060020a0316156108155760008381526101086020526040908190208054600180830154935160029384018054600160a060020a0390941695949093919283928592918116156101000260001901160480156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b505091505060006040518083038185876185025a03f15050506000848152610108602090815260409182902060018082015482548551600160a060020a033381811683529682018c905296810183905295166060860181905260a06080870181815260029586018054958616156101000260001901909516959095049087018190527fe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a975094958a95929491939290919060c08301908490801561076b5780601f106107405761010080835404028352916020019161076b565b820191906000526020600020905b81548152906001019060200180831161074e57829003601f168201915b5050965050505050505060405180910390a1600083815261010860205260408120805473ffffffffffffffffffffffffffffffffffffffff19168155600180820183905560028083018054858255939493909281161561010002600019011604601f8190106107da575061080c565b601f01602090049060005260206000209081019061080c91905b8082111561080857600081556001016107f4565b5090565b5b505050600191505b5b5b5b50919050565b600281905561082b61130b565b6004555b50565b60003660405180838380828437820191505092505050604051809103902061085981610f69565b1561059f5760028290555b5b5b5050565b6000600061087733610452565b15610bc05761088584611315565b156109bc577f92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004338587866040518085600160a060020a0316815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f1680156109335780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a184600160a060020a03168484604051808280519060200190808383829060006004602084601f0104600302600f01f150905090810190601f16801561099c5780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876185025a03f1925050509150610bc0565b600036436040518084848082843782019150508281526020019350505050604051809103902090506109ed816105a5565b158015610a10575060008181526101086020526040902054600160a060020a0316155b15610bc057600081815261010860209081526040822080546c01000000000000000000000000808a020473ffffffffffffffffffffffffffffffffffffffff199091161781556001808201889055865160029283018054818752958590209095601f9381161561010002600019011693909304820184900483019390929190880190839010610aaa57805160ff1916838001178555610ad7565b82800160010185558215610ad7579182015b82811115610ad7578251825591602001919060010190610abc565b5b50610af89291505b8082111561080857600081556001016107f4565b5090565b50507f1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf328133868887604051808660001916815260200185600160a060020a0316815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f168015610bae5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a15b5b5b5b5b509392505050565b600160a060020a033316600090815261010560205260408120549080821515610bf457610c70565b50506000828152610106602052604081206001810154600284900a929083161115610c705780546001908101825581018054839003905560408051600160a060020a03331681526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a15b5b50505050565b600036604051808383808284378201915050925050506040518091039020610c9e81610f69565b1561059f57600154821115610cb25761059f565b6000829055610cbf611108565b6040805183815290517facbdb084c721332ac59f9b8e392196c9eb0e4932862da8eb9beaf0dad4f550da9181900360200190a15b5b5b5050565b600082815261010660209081526040808320600160a060020a038516845261010590925282205482811515610d315760009350610d45565b8160020a9050808360010154166000141593505b50505092915050565b815160019081019055600033600160a060020a03166006825b505550600160a060020a033316600090815261010560205260408120600190558181555b825181101561044b57828181518110156100005790602001906020020151600160a060020a0316600582600201610100811015610000570160005b5081905550806002016101056000858481518110156100005790602001906020020151600160a060020a03168152602001908152602001600020819055505b600101610d8b565b5b505050565b600036604051808383808284378201915050925050506040518091039020610e3a81610f69565b1561059f5781600160a060020a0316ff5b5b5b5050565b610e5b8383610d4e565b61044b8161081e565b5b505050565b6000600036604051808383808284378201915050925050506040518091039020610e9381610f69565b15610c7057610ea183610452565b15610eab57610c70565b600160a060020a038416600090815261010560205260409020549150811515610ed357610c70565b610edb611108565b82600160a060020a0316600583610100811015610000570160005b5055600160a060020a0380851660008181526101056020908152604080832083905593871680835291849020869055835192835282015281517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c929181900390910190a15b5b5b50505050565b60025481565b600160a060020a033316600090815261010560205260408120548180821515610f91576110fe565b60008581526101066020526040902080549092501515611025576000805483556001808401919091556101078054918201808255828015829011610ffa57600083815260209020610ffa9181019083015b8082111561080857600081556001016107f4565b5090565b5b50505060028301819055610107805487929081101561000057906000526020600020900160005b50555b8260020a905080826001015416600014156110fe5760408051600160a060020a03331681526020810187905281517fe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda929181900390910190a18154600190116110eb5760008581526101066020526040902060020154610107805490919081101561000057906000526020600020900160005b5060009081905585815261010660205260408120818155600180820183905560029091019190915593506110fe566110fe565b8154600019018255600182018054821790555b5b5b505050919050565b6101075460005b818110156111855761010781815481101561000057906000526020600020900160005b50541561117c57610106600061010783815481101561000057906000526020600020900160005b505481526020810191909152604001600090812081815560018101829055600201555b5b60010161110f565b610107805460008083559190915261044b907f47c4908e245f386bfc1825973249847f4053a761ddb4880ad63c323a7b5a2a25908101905b8082111561080857600081556001016107f4565b5090565b5b505b5050565b60015b6001548110156104ab575b6001548110801561120c5750600581610100811015610000570160005b505415155b15611219576001016111ea565b5b600160015411801561123e57506005600154610100811015610000570160005b5054155b15611252576001805460001901905561121a565b6001548110801561127657506005600154610100811015610000570160005b505415155b80156112925750600581610100811015610000570160005b5054155b15611302576005600154610100811015610000570160005b5054600582610100811015610000570160005b5055806101056000600583610100811015610000570160005b505481526020019081526020016000208190555060006005600154610100811015610000570160005b50555b6111df565b5b50565b6201518042045b90565b600061132033610452565b1561046e5760045461133061130b565b111561134757600060035561134361130b565b6004555b600354828101108015906113615750600254826003540111155b1561137657506003805482019055600161046e565b5060005b5b5b91905056';
+export const wallet = '0x6060604052341561000c57fe5b60405161048538038061048583398101604090815281516020830151918301519201915b604080517f696e697457616c6c657428616464726573735b5d2c75696e743235362c75696e81527f7432353629000000000000000000000000000000000000000000000000000000602080830191909152915190819003602501902084516000829052909173_____________WalletLibrary______________91600281019160049182010290819038829003903960006000600483016000866127105a03f45b505050505050505b61039d806100e86000396000f300606060405236156100725763ffffffff60e060020a6000350416632f54bf6e811461012d5780634123cb6b1461015d578063523750931461017f578063659010e7146101a1578063746c9171146101c3578063c2cf7326146101e5578063c41a360a14610218578063f1736d8614610247575b61012b5b60003411156100c75760408051600160a060020a033316815234602082015281517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c929181900390910190a1610127565b60003611156101275773_____________WalletLibrary______________600160a060020a0316600036600060405160200152604051808383808284378201915050925050506020604051808303818560325a03f4151561012457fe5b50505b5b5b565b005b341561013557fe5b610149600160a060020a0360043516610269565b604080519115158252519081900360200190f35b341561016557fe5b61016d6102cd565b60408051918252519081900360200190f35b341561018757fe5b61016d6102d3565b60408051918252519081900360200190f35b34156101a957fe5b61016d6102d9565b60408051918252519081900360200190f35b34156101cb57fe5b61016d6102df565b60408051918252519081900360200190f35b34156101ed57fe5b610149600435600160a060020a03602435166102e5565b604080519115158252519081900360200190f35b341561022057fe5b61022b60043561034a565b60408051600160a060020a039092168252519081900360200190f35b341561024f57fe5b61016d61036b565b60408051918252519081900360200190f35b600073_____________WalletLibrary______________600160a060020a0316600036600060405160200152604051808383808284378201915050925050506020604051808303818560325a03f415156102bf57fe5b50506040515190505b919050565b60015481565b60045481565b60035481565b60005481565b600073_____________WalletLibrary______________600160a060020a0316600036600060405160200152604051808383808284378201915050925050506020604051808303818560325a03f4151561033b57fe5b50506040515190505b92915050565b6000600560018301610100811061035d57fe5b0160005b505490505b919050565b600254815600a165627a7a723058204a75c2f5c8009054bd9e9998e8bb6f4bca0b201484709f357b482793957c47130029';
+export const walletLibrary = '0x6060604052341561000c57fe5b5b6116d88061001c6000396000f300606060405236156101015763ffffffff60e060020a600035041663173825d981146101575780632f54bf6e146101755780634123cb6b146101a557806352375093146101c75780635c52c2f5146101e9578063659010e7146101fb5780637065cb481461021d578063746c91711461023b578063797af6271461025d5780639da5e0eb14610284578063b20d30a914610299578063b61d27f6146102ae578063b75c7dc6146102ec578063ba51a6df14610301578063c2cf732614610316578063c41a360a14610349578063c57c5f6014610378578063cbf0b0c0146103cf578063e46dcfeb146103ed578063f00d4b5d14610449578063f1736d861461046d575b6101555b60003411156101525760408051600160a060020a033316815234602082015281517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c929181900390910190a15b5b565b005b341561015f57fe5b610155600160a060020a036004351661048f565b005b341561017d57fe5b610191600160a060020a036004351661057d565b604080519115158252519081900360200190f35b34156101ad57fe5b6101b561059e565b60408051918252519081900360200190f35b34156101cf57fe5b6101b56105a4565b60408051918252519081900360200190f35b34156101f157fe5b6101556105aa565b005b341561020357fe5b6101b56105e1565b60408051918252519081900360200190f35b341561022557fe5b610155600160a060020a03600435166105e7565b005b341561024357fe5b6101b56106d7565b60408051918252519081900360200190f35b341561026557fe5b6101916004356106dd565b604080519115158252519081900360200190f35b341561028c57fe5b610155600435610a2f565b005b34156102a157fe5b610155600435610a43565b005b34156102b657fe5b6101b560048035600160a060020a0316906024803591604435918201910135610a7b565b60408051918252519081900360200190f35b34156102f457fe5b610155600435610d5d565b005b341561030957fe5b610155600435610e08565b005b341561031e57fe5b610191600435600160a060020a0360243516610e8a565b604080519115158252519081900360200190f35b341561035157fe5b61035c600435610edf565b60408051600160a060020a039092168252519081900360200190f35b341561038057fe5b6101556004808035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496505093359350610f0092505050565b005b34156103d757fe5b610155600160a060020a0360043516610fd4565b005b34156103f557fe5b6101556004808035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496505084359460200135935061101292505050565b005b341561045157fe5b610155600160a060020a036004358116906024351661102b565b005b341561047557fe5b6101b5611125565b60408051918252519081900360200190f35b60006000366040518083838082843782019150509250505060405180910390206104b88161112b565b1561057657600160a060020a0383166000908152610105602052604090205491508115156104e557610576565b60016001540360005411156104f957610576565b6000600583610100811061050957fe5b0160005b5055600160a060020a03831660009081526101056020526040812055610531611296565b610539611386565b60408051600160a060020a038516815290517f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da9181900360200190a15b5b5b505050565b600160a060020a03811660009081526101056020526040812054115b919050565b60015481565b60045481565b6000366040518083838082843782019150509250505060405180910390206105d18161112b565b156105dc5760006003555b5b5b50565b60035481565b60003660405180838380828437820191505092505050604051809103902061060e8161112b565b156106d15761061c8261057d565b15610626576106d1565b61062e611296565b60015460fa901061064157610641611386565b5b60015460fa9010610652576106d1565b60018054810190819055600160a060020a03831690600590610100811061067557fe5b0160005b5055600154600160a060020a03831660008181526101056020908152604091829020939093558051918252517f994a936646fe87ffe4f1e469d3d6aa417d6b855598397f323de5b449f765f0c3929181900390910190a15b5b5b5050565b60005481565b60006000826106eb8161112b565b15610a255760008481526101086020526040902054600160a060020a031615158061072757506000848152610108602052604090206001015415155b80610754575060008481526101086020526040902060029081015461010060018216150260001901160415155b15610a255760008481526101086020526040902054600160a060020a0316151561082c57600084815261010860209081526040918290206001808201546002928301805486516000199482161561010002949094011693909304601f810185900485028301850190955284825261082594909391929183018282801561081b5780601f106107f05761010080835404028352916020019161081b565b820191906000526020600020905b8154815290600101906020018083116107fe57829003601f168201915b50505050506114c2565b91506108e3565b60008481526101086020526040908190208054600180830154935160029384018054600160a060020a0390941695949093919283928592918116156101000260001901160480156108be5780601f10610893576101008083540402835291602001916108be565b820191906000526020600020905b8154815290600101906020018083116108a157829003601f168201915b505091505060006040518083038185876185025a03f19250505015156108e357610000565b5b6000848152610108602090815260409182902060018082015482548551600160a060020a033381811683529682018c90529681018390529086166060820181905295881660a082015260c06080820181815260029586018054958616156101000260001901909516959095049082018190527fe3a3a4111a84df27d76b68dc721e65c7711605ea5eee4afd3a9c58195217365c968b959394909390928a9290919060e0830190859080156109d95780601f106109ae576101008083540402835291602001916109d9565b820191906000526020600020905b8154815290600101906020018083116109bc57829003601f168201915b505097505050505050505060405180910390a16000848152610108602052604081208054600160a060020a03191681556001810182905590610a1e6002830182611557565b5050600192505b5b5b5b5050919050565b6002819055610a3c6114dc565b6004555b50565b600036604051808383808284378201915050925050506040518091039020610a6a8161112b565b156106d15760028290555b5b5b5050565b60006000610a883361057d565b15610d505782158015610a9f5750610a9f856114eb565b5b80610aad57506000546001145b15610bef57600160a060020a0386161515610b0357610afc8585858080601f016020809104026020016040519081016040528093929190818152602001838380828437506114c2945050505050565b9050610b43565b85600160a060020a03168585856040518083838082843782019150509250505060006040518083038185876185025a03f1925050501515610b4357610000565b5b7f9738cd1a8777c86b011f7b01d87d484217dc6ab5154a9d41eda5d14af8caf2923386888787866040518087600160a060020a0316600160a060020a0316815260200186815260200185600160a060020a0316600160a060020a031681526020018060200183600160a060020a0316600160a060020a0316815260200182810382528585828181526020019250808284376040519201829003995090975050505050505050a1610d50565b600036436040518084848082843791909101928352505060408051602092819003830190206000818152610108909352912054909450600160a060020a0316159150508015610c4e575060008281526101086020526040902060010154155b8015610c7b5750600082815261010860205260409020600290810154610100600182161502600019011604155b15610cbf576000828152610108602052604090208054600160a060020a031916600160a060020a03881617815560018101869055610cbd90600201858561159f565b505b610cc8826106dd565b1515610d505760408051838152600160a060020a033381811660208401529282018890528816606082015260a0608082018181529082018690527f1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32928592909189918b918a918a9160c082018484808284376040519201829003995090975050505050505050a15b5b5b5b5b50949350505050565b600160a060020a033316600090815261010560205260408120549080821515610d8557610e01565b50506000828152610106602052604081206001810154600284900a929083161115610e015780546001908101825581018054839003905560408051600160a060020a03331681526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a15b5b50505050565b600036604051808383808284378201915050925050506040518091039020610e2f8161112b565b156106d157600154821115610e43576106d1565b6000829055610e50611296565b6040805183815290517facbdb084c721332ac59f9b8e392196c9eb0e4932862da8eb9beaf0dad4f550da9181900360200190a15b5b5b5050565b600082815261010660209081526040808320600160a060020a038516845261010590925282205482811515610ec25760009350610ed6565b8160020a9050808360010154166000141593505b50505092915050565b60006005600183016101008110610ef257fe5b0160005b505490505b919050565b815160019081018155600090600160a060020a033316906005905b0160005b505550600160a060020a033316600090815261010560205260408120600190555b8251811015610fc9578281815181101515610f5757fe5b60209081029091010151600160a060020a03166005600283016101008110610f7b57fe5b0160005b50819055508060020161010560008584815181101515610f9b57fe5b90602001906020020151600160a060020a03168152602001908152602001600020819055505b600101610f40565b60008290555b505050565b600036604051808383808284378201915050925050506040518091039020610ffb8161112b565b156106d15781600160a060020a0316ff5b5b5b5050565b61101b81610a2f565b6105768383610f00565b5b505050565b60006000366040518083838082843782019150509250505060405180910390206110548161112b565b15610e01576110628361057d565b1561106c57610e01565b600160a060020a03841660009081526101056020526040902054915081151561109457610e01565b61109c611296565b600160a060020a03831660058361010081106110b457fe5b0160005b5055600160a060020a0380851660008181526101056020908152604080832083905593871680835291849020869055835192835282015281517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c929181900390910190a15b5b5b50505050565b60025481565b600160a060020a0333166000908152610105602052604081205481808215156111535761128c565b600085815261010660205260409020805490925015156111b65760008054835560018084019190915561010780549161118e9190830161161e565b60028301819055610107805487929081106111a557fe5b906000526020600020900160005b50555b8260020a9050808260010154166000141561128c5760408051600160a060020a03331681526020810187905281517fe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda929181900390910190a181546001901161127957600085815261010660205260409020600201546101078054909190811061123c57fe5b906000526020600020900160005b50600090819055858152610106602052604081208181556001808201839055600290910191909155935061128c565b8154600019018255600182018054821790555b5b5b505050919050565b6101075460005b81811015611374576101086000610107838154811015156112ba57fe5b906000526020600020900160005b50548152602081019190915260400160009081208054600160a060020a031916815560018101829055906112ff6002830182611557565b505061010780548290811061131057fe5b906000526020600020900160005b50541561136b5761010660006101078381548110151561133a57fe5b906000526020600020900160005b505481526020810191909152604001600090812081815560018101829055600201555b5b60010161129d565b6106d16101076000611648565b5b5050565b60015b6001548110156105dc575b600154811080156113b7575060058161010081106113ae57fe5b0160005b505415155b156113c457600101611394565b5b60016001541180156113eb575060015460059061010081106113e357fe5b0160005b5054155b156113ff57600180546000190190556113c4565b600154811080156114255750600154600590610100811061141c57fe5b0160005b505415155b80156114425750600581610100811061143a57fe5b0160005b5054155b156114b957600154600590610100811061145857fe5b0160005b5054600582610100811061146c57fe5b0160005b5055806101056000600583610100811061148657fe5b0160005b505481526020019081526020016000208190555060006005600154610100811015156114b257fe5b0160005b50555b611389565b5b50565b600081516020830184f09050803b15610000575b92915050565b600062015180425b0490505b90565b60006114f63361057d565b15610599576004546115066114dc565b111561151d5760006003556115196114dc565b6004555b600354828101108015906115375750600254826003540111155b1561154c575060038054820190556001610599565b5060005b5b5b919050565b50805460018160011615610100020316600290046000825580601f1061157d57506105dc565b601f0160209004906000526020600020908101906105dc919061166a565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106115e05782800160ff1982351617855561160d565b8280016001018555821561160d579182015b8281111561160d5782358255916020019190600101906115f2565b5b5061161a92915061166a565b5090565b8154818355818115116105765760008381526020902061057691810190830161166a565b5b505050565b50805460008255906000526020600020908101906105dc919061166a565b5b50565b6114e891905b8082111561161a5760008155600101611670565b5090565b90565b6114e891905b8082111561161a5760008155600101611670565b5090565b905600a165627a7a723058206560ca68304798da7e3be68397368a30b63db1453ff138ff8f765e80080025af0029';
+export const walletLibraryABI = '[{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_numOwners","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_lastDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"resetSpentToday","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_spentToday","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_required","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_h","type":"bytes32"}],"name":"confirm","outputs":[{"name":"o_success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_limit","type":"uint256"}],"name":"initDaylimit","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newLimit","type":"uint256"}],"name":"setDailyLimit","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"execute","outputs":[{"name":"o_hash","type":"bytes32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_operation","type":"bytes32"}],"name":"revoke","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newRequired","type":"uint256"}],"name":"changeRequirement","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_operation","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"hasConfirmed","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"ownerIndex","type":"uint256"}],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_owners","type":"address[]"},{"name":"_required","type":"uint256"}],"name":"initMultiowned","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"kill","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_owners","type":"address[]"},{"name":"_required","type":"uint256"},{"name":"_daylimit","type":"uint256"}],"name":"initWallet","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_dailyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"}],"name":"OwnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRequirement","type":"uint256"}],"name":"RequirementChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"},{"indexed":false,"name":"created","type":"address"}],"name":"SingleTransact","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"},{"indexed":false,"name":"created","type":"address"}],"name":"MultiTransact","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"operation","type":"bytes32"},{"indexed":false,"name":"initiator","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"ConfirmationNeeded","type":"event"}]';
export const walletSourceURL = 'https://github.com/ethcore/parity/blob/63137b15482344ff9df634c086abaabed452eadc/js/src/contracts/snippets/enhanced-wallet.sol';
export const walletLibraryRegKey = 'walletLibrary';
// Used if no Wallet Library found in registry...
-// Compiled from `wallet.sol` using Solidity v0.4.6
-export const fullWalletCode = '0x606060405234610000576040516113bb3803806113bb83398101604090815281516020830151918301519201915b805b83835b815160019081019055600033600160a060020a03166003825b505550600160a060020a033316600090815261010260205260408120600190555b82518110156100ee57828181518110156100005790602001906020020151600160a060020a0316600282600201610100811015610000570160005b5081905550806002016101026000858481518110156100005790602001906020020151600160a060020a03168152602001908152602001600020819055505b60010161006c565b60008290555b50505061010581905561011264010000000061127861012182021704565b610107555b505b50505061012b565b6201518042045b90565b611282806101396000396000f3606060405236156100da5760e060020a6000350463173825d981146101305780632f54bf6e146101425780634123cb6b1461016657806352375093146101855780635c52c2f5146101a4578063659010e7146101b35780637065cb48146101d2578063746c9171146101e4578063797af62714610203578063b20d30a914610227578063b61d27f614610239578063b75c7dc61461026b578063ba51a6df1461027d578063c2cf73261461028f578063c41a360a146102b6578063cbf0b0c0146102e2578063f00d4b5d146102f4578063f1736d8614610309575b61012e5b600034111561012b5760408051600160a060020a033316815234602082015281517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c929181900390910190a15b5b565b005b346100005761012e600435610328565b005b3461000057610152600435610415565b604080519115158252519081900360200190f35b3461000057610173610436565b60408051918252519081900360200190f35b346100005761017361043c565b60408051918252519081900360200190f35b346100005761012e610443565b005b346100005761017361047b565b60408051918252519081900360200190f35b346100005761012e600435610482565b005b3461000057610173610571565b60408051918252519081900360200190f35b3461000057610152600435610577565b604080519115158252519081900360200190f35b346100005761012e6004356107e3565b005b34610000576101736004803590602480359160443591820191013561081c565b60408051918252519081900360200190f35b346100005761012e600435610ab3565b005b346100005761012e600435610b5e565b005b3461000057610152600435602435610be0565b604080519115158252519081900360200190f35b34610000576102c6600435610c35565b60408051600160a060020a039092168252519081900360200190f35b346100005761012e600435610c55565b005b346100005761012e600435602435610c93565b005b3461000057610173610d8c565b60408051918252519081900360200190f35b600060003660405180838380828437820191505092505050604051809103902061035181610d93565b1561040e57600160a060020a03831660009081526101026020526040902054915081151561037e5761040e565b60016001540360005411156103925761040e565b6000600283610100811015610000570160005b5055600160a060020a038316600090815261010260205260408120556103c9610f32565b6103d1611002565b60408051600160a060020a038516815290517f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da9181900360200190a15b5b5b505050565b600160a060020a03811660009081526101026020526040812054115b919050565b60015481565b6101075481565b60003660405180838380828437820191505092505050604051809103902061046a81610d93565b15610476576000610106555b5b5b50565b6101065481565b6000366040518083838082843782019150509250505060405180910390206104a981610d93565b1561056b576104b782610415565b156104c15761056b565b6104c9610f32565b60015460fa90106104dc576104dc611002565b5b60015460fa90106104ed5761056b565b60018054810190819055600160a060020a03831690600290610100811015610000570160005b5055600154600160a060020a03831660008181526101026020908152604091829020939093558051918252517f994a936646fe87ffe4f1e469d3d6aa417d6b855598397f323de5b449f765f0c3929181900390910190a15b5b5b5050565b60005481565b60008161058381610d93565b156107da5760008381526101086020526040902054600160a060020a0316156107da5760008381526101086020526040908190208054600180830154935160029384018054600160a060020a0390941695949093919283928592918116156101000260001901160480156106385780601f1061060d57610100808354040283529160200191610638565b820191906000526020600020905b81548152906001019060200180831161061b57829003601f168201915b505091505060006040518083038185876185025a03f15050506000848152610108602090815260409182902060018082015482548551600160a060020a033381811683529682018c905296810183905295166060860181905260a06080870181815260029586018054958616156101000260001901909516959095049087018190527fe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a975094958a95929491939290919060c08301908490801561073d5780601f106107125761010080835404028352916020019161073d565b820191906000526020600020905b81548152906001019060200180831161072057829003601f168201915b5050965050505050505060405180910390a16000838152610108602052604081208054600160a060020a0319168155600180820183905560028083018054858255939493909281161561010002600019011604601f81901061079f57506107d1565b601f0160209004906000526020600020908101906107d191905b808211156107cd57600081556001016107b9565b5090565b5b505050600191505b5b5b5b50919050565b60003660405180838380828437820191505092505050604051809103902061080a81610d93565b1561056b576101058290555b5b5b5050565b600061082733610415565b15610aa85761083584611131565b156108f3577f92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd00433858786866040518086600160a060020a0316815260200185815260200184600160a060020a0316815260200180602001828103825284848281815260200192508082843760405192018290039850909650505050505050a184600160a060020a03168484846040518083838082843782019150509250505060006040518083038185876185025a03f15060009350610aa892505050565b6000364360405180848480828437820191505082815260200193505050506040518091039020905061092481610577565b158015610947575060008181526101086020526040902054600160a060020a0316155b15610aa857600081815261010860209081526040822080546c01000000000000000000000000808a0204600160a060020a0319909116178155600180820188905560029182018054818652948490209094601f928116156101000260001901169290920481019290920481019185919087908390106109d15782800160ff198235161785556109fe565b828001600101855582156109fe579182015b828111156109fe5782358255916020019190600101906109e3565b5b50610a1f9291505b808211156107cd57600081556001016107b9565b5090565b50507f1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32813386888787604051808760001916815260200186600160a060020a0316815260200185815260200184600160a060020a031681526020018060200182810382528484828181526020019250808284376040519201829003995090975050505050505050a15b5b5b5b949350505050565b600160a060020a033316600090815261010260205260408120549080821515610adb57610b57565b50506000828152610103602052604081206001810154600284900a929083161115610b575780546001908101825581018054839003905560408051600160a060020a03331681526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a15b5b50505050565b600036604051808383808284378201915050925050506040518091039020610b8581610d93565b1561056b57600154821115610b995761056b565b6000829055610ba6610f32565b6040805183815290517facbdb084c721332ac59f9b8e392196c9eb0e4932862da8eb9beaf0dad4f550da9181900360200190a15b5b5b5050565b600082815261010360209081526040808320600160a060020a038516845261010290925282205482811515610c185760009350610c2c565b8160020a9050808360010154166000141593505b50505092915050565b6000600282600101610100811015610000570160005b505490505b919050565b600036604051808383808284378201915050925050506040518091039020610c7c81610d93565b1561056b5781600160a060020a0316ff5b5b5b5050565b6000600036604051808383808284378201915050925050506040518091039020610cbc81610d93565b15610b5757610cca83610415565b15610cd457610b57565b600160a060020a038416600090815261010260205260409020549150811515610cfc57610b57565b610d04610f32565b82600160a060020a0316600283610100811015610000570160005b5055600160a060020a0380851660008181526101026020908152604080832083905593871680835291849020869055835192835282015281517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c929181900390910190a15b5b5b50505050565b6101055481565b600160a060020a033316600090815261010260205260408120548180821515610dbb57610f28565b60008581526101036020526040902080549092501515610e4f576000805483556001808401919091556101048054918201808255828015829011610e2457600083815260209020610e249181019083015b808211156107cd57600081556001016107b9565b5090565b5b50505060028301819055610104805487929081101561000057906000526020600020900160005b50555b8260020a90508082600101541660001415610f285760408051600160a060020a03331681526020810187905281517fe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda929181900390910190a1815460019011610f155760008581526101036020526040902060020154610104805490919081101561000057906000526020600020900160005b506000908190558581526101036020526040812081815560018082018390556002909101919091559350610f2856610f28565b8154600019018255600182018054821790555b5b5b505050919050565b6101045460005b81811015610ff557610108600061010483815481101561000057906000526020600020900160005b50548152602081019190915260400160009081208054600160a060020a0319168155600180820183905560028083018054858255939493909281161561010002600019011604601f819010610fb65750610fe8565b601f016020900490600052602060002090810190610fe891905b808211156107cd57600081556001016107b9565b5090565b5b5050505b600101610f39565b61056b6111a4565b5b5050565b60015b600154811015610476575b600154811080156110325750600281610100811015610000570160005b505415155b1561103f57600101611010565b5b600160015411801561106457506002600154610100811015610000570160005b5054155b156110785760018054600019019055611040565b6001548110801561109c57506002600154610100811015610000570160005b505415155b80156110b85750600281610100811015610000570160005b5054155b15611128576002600154610100811015610000570160005b5054600282610100811015610000570160005b5055806101026000600283610100811015610000570160005b505481526020019081526020016000208190555060006002600154610100811015610000570160005b50555b611005565b5b50565b600061113c33610415565b15610431576101075461114d611278565b111561116657600061010655611161611278565b610107555b610106548281011080159061118357506101055482610106540111155b1561119957506101068054820190556001610431565b5060005b5b5b919050565b6101045460005b818110156112215761010481815481101561000057906000526020600020900160005b50541561121857610103600061010483815481101561000057906000526020600020900160005b505481526020810191909152604001600090812081815560018101829055600201555b5b6001016111ab565b610104805460008083559190915261040e907f4c0be60200faa20559308cb7b5a1bb3255c16cb1cab91f525b5ae7a03d02fabe908101905b808211156107cd57600081556001016107b9565b5090565b5b505b5050565b6201518042045b9056';
+// Compiled from `wallet.sol` using Solidity v0.4.9 - Optimized
+export const fullWalletCode = '0x6060604052341561000c57fe5b60405161166d38038061166d83398101604090815281516020830151918301519201915b805b83835b815160019081018155600090600160a060020a033316906002905b0160005b505550600160a060020a033316600090815261010260205260408120600190555b82518110156100fd57828181518110151561008c57fe5b60209081029091010151600160a060020a0316600282810161010081106100af57fe5b0160005b508190555080600201610102600085848151811015156100cf57fe5b90602001906020020151600160a060020a03168152602001908152602001600020819055505b600101610075565b60008290555b50505061010581905561012164010000000061138f61013082021704565b610107555b505b50505061013f565b600062015180425b0490505b90565b61151f8061014e6000396000f300606060405236156100e05763ffffffff60e060020a600035041663173825d981146101365780632f54bf6e146101545780634123cb6b1461018457806352375093146101a65780635c52c2f5146101c8578063659010e7146101da5780637065cb48146101fc578063746c91711461021a578063797af6271461023c578063b20d30a914610263578063b61d27f614610278578063b75c7dc6146102b6578063ba51a6df146102cb578063c2cf7326146102e0578063c41a360a14610313578063cbf0b0c014610342578063f00d4b5d14610360578063f1736d8614610384575b6101345b60003411156101315760408051600160a060020a033316815234602082015281517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c929181900390910190a15b5b565b005b341561013e57fe5b610134600160a060020a03600435166103a6565b005b341561015c57fe5b610170600160a060020a0360043516610494565b604080519115158252519081900360200190f35b341561018c57fe5b6101946104b5565b60408051918252519081900360200190f35b34156101ae57fe5b6101946104bb565b60408051918252519081900360200190f35b34156101d057fe5b6101346104c2565b005b34156101e257fe5b6101946104fa565b60408051918252519081900360200190f35b341561020457fe5b610134600160a060020a0360043516610501565b005b341561022257fe5b6101946105f1565b60408051918252519081900360200190f35b341561024457fe5b6101706004356105f7565b604080519115158252519081900360200190f35b341561026b57fe5b610134600435610949565b005b341561028057fe5b61019460048035600160a060020a0316906024803591604435918201910135610982565b60408051918252519081900360200190f35b34156102be57fe5b610134600435610c64565b005b34156102d357fe5b610134600435610d0f565b005b34156102e857fe5b610170600435600160a060020a0360243516610d91565b604080519115158252519081900360200190f35b341561031b57fe5b610326600435610de6565b60408051600160a060020a039092168252519081900360200190f35b341561034a57fe5b610134600160a060020a0360043516610e07565b005b341561036857fe5b610134600160a060020a0360043581169060243516610e45565b005b341561038c57fe5b610194610f3f565b60408051918252519081900360200190f35b60006000366040518083838082843782019150509250505060405180910390206103cf81610f46565b1561048d57600160a060020a0383166000908152610102602052604090205491508115156103fc5761048d565b60016001540360005411156104105761048d565b6000600283610100811061042057fe5b0160005b5055600160a060020a038316600090815261010260205260408120556104486110b1565b610450611132565b60408051600160a060020a038516815290517f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da9181900360200190a15b5b5b505050565b600160a060020a03811660009081526101026020526040812054115b919050565b60015481565b6101075481565b6000366040518083838082843782019150509250505060405180910390206104e981610f46565b156104f5576000610106555b5b5b50565b6101065481565b60003660405180838380828437820191505092505050604051809103902061052881610f46565b156105eb5761053682610494565b15610540576105eb565b6105486110b1565b60015460fa901061055b5761055b611132565b5b60015460fa901061056c576105eb565b60018054810190819055600160a060020a03831690600290610100811061058f57fe5b0160005b5055600154600160a060020a03831660008181526101026020908152604091829020939093558051918252517f994a936646fe87ffe4f1e469d3d6aa417d6b855598397f323de5b449f765f0c3929181900390910190a15b5b5b5050565b60005481565b600060008261060581610f46565b1561093f5760008481526101086020526040902054600160a060020a031615158061064157506000848152610108602052604090206001015415155b8061066e575060008481526101086020526040902060029081015461010060018216150260001901160415155b1561093f5760008481526101086020526040902054600160a060020a0316151561074657600084815261010860209081526040918290206001808201546002928301805486516000199482161561010002949094011693909304601f810185900485028301850190955284825261073f9490939192918301828280156107355780601f1061070a57610100808354040283529160200191610735565b820191906000526020600020905b81548152906001019060200180831161071857829003601f168201915b505050505061126e565b91506107fd565b60008481526101086020526040908190208054600180830154935160029384018054600160a060020a0390941695949093919283928592918116156101000260001901160480156107d85780601f106107ad576101008083540402835291602001916107d8565b820191906000526020600020905b8154815290600101906020018083116107bb57829003601f168201915b505091505060006040518083038185876185025a03f19250505015156107fd57610000565b5b6000848152610108602090815260409182902060018082015482548551600160a060020a033381811683529682018c90529681018390529086166060820181905295881660a082015260c06080820181815260029586018054958616156101000260001901909516959095049082018190527fe3a3a4111a84df27d76b68dc721e65c7711605ea5eee4afd3a9c58195217365c968b959394909390928a9290919060e0830190859080156108f35780601f106108c8576101008083540402835291602001916108f3565b820191906000526020600020905b8154815290600101906020018083116108d657829003601f168201915b505097505050505050505060405180910390a16000848152610108602052604081208054600160a060020a03191681556001810182905590610938600283018261139e565b5050600192505b5b5b5b5050919050565b60003660405180838380828437820191505092505050604051809103902061097081610f46565b156105eb576101058290555b5b5b5050565b6000600061098f33610494565b15610c5757821580156109a657506109a685611288565b5b806109b457506000546001145b15610af657600160a060020a0386161515610a0a57610a038585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375061126e945050505050565b9050610a4a565b85600160a060020a03168585856040518083838082843782019150509250505060006040518083038185876185025a03f1925050501515610a4a57610000565b5b7f9738cd1a8777c86b011f7b01d87d484217dc6ab5154a9d41eda5d14af8caf2923386888787866040518087600160a060020a0316600160a060020a0316815260200186815260200185600160a060020a0316600160a060020a031681526020018060200183600160a060020a0316600160a060020a0316815260200182810382528585828181526020019250808284376040519201829003995090975050505050505050a1610c57565b600036436040518084848082843791909101928352505060408051602092819003830190206000818152610108909352912054909450600160a060020a0316159150508015610b55575060008281526101086020526040902060010154155b8015610b825750600082815261010860205260409020600290810154610100600182161502600019011604155b15610bc6576000828152610108602052604090208054600160a060020a031916600160a060020a03881617815560018101869055610bc49060020185856113e6565b505b610bcf826105f7565b1515610c575760408051838152600160a060020a033381811660208401529282018890528816606082015260a0608082018181529082018690527f1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32928592909189918b918a918a9160c082018484808284376040519201829003995090975050505050505050a15b5b5b5b5b50949350505050565b600160a060020a033316600090815261010260205260408120549080821515610c8c57610d08565b50506000828152610103602052604081206001810154600284900a929083161115610d085780546001908101825581018054839003905560408051600160a060020a03331681526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a15b5b50505050565b600036604051808383808284378201915050925050506040518091039020610d3681610f46565b156105eb57600154821115610d4a576105eb565b6000829055610d576110b1565b6040805183815290517facbdb084c721332ac59f9b8e392196c9eb0e4932862da8eb9beaf0dad4f550da9181900360200190a15b5b5b5050565b600082815261010360209081526040808320600160a060020a038516845261010290925282205482811515610dc95760009350610ddd565b8160020a9050808360010154166000141593505b50505092915050565b60006002600183016101008110610df957fe5b0160005b505490505b919050565b600036604051808383808284378201915050925050506040518091039020610e2e81610f46565b156105eb5781600160a060020a0316ff5b5b5b5050565b6000600036604051808383808284378201915050925050506040518091039020610e6e81610f46565b15610d0857610e7c83610494565b15610e8657610d08565b600160a060020a038416600090815261010260205260409020549150811515610eae57610d08565b610eb66110b1565b600160a060020a0383166002836101008110610ece57fe5b0160005b5055600160a060020a0380851660008181526101026020908152604080832083905593871680835291849020869055835192835282015281517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c929181900390910190a15b5b5b50505050565b6101055481565b600160a060020a033316600090815261010260205260408120548180821515610f6e576110a7565b60008581526101036020526040902080549092501515610fd157600080548355600180840191909155610104805491610fa991908301611465565b6002830181905561010480548792908110610fc057fe5b906000526020600020900160005b50555b8260020a905080826001015416600014156110a75760408051600160a060020a03331681526020810187905281517fe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda929181900390910190a181546001901161109457600085815261010360205260409020600201546101048054909190811061105757fe5b906000526020600020900160005b5060009081905585815261010360205260408120818155600180820183905560029091019190915593506110a7565b8154600019018255600182018054821790555b5b5b505050919050565b6101045460005b81811015611125576101086000610104838154811015156110d557fe5b906000526020600020900160005b50548152602081019190915260400160009081208054600160a060020a0319168155600181018290559061111a600283018261139e565b50505b6001016110b8565b6105eb6112fb565b5b5050565b60015b6001548110156104f5575b600154811080156111635750600281610100811061115a57fe5b0160005b505415155b1561117057600101611140565b5b60016001541180156111975750600154600290610100811061118f57fe5b0160005b5054155b156111ab5760018054600019019055611170565b600154811080156111d1575060015460029061010081106111c857fe5b0160005b505415155b80156111ee575060028161010081106111e657fe5b0160005b5054155b1561126557600154600290610100811061120457fe5b0160005b5054600282610100811061121857fe5b0160005b5055806101026000600283610100811061123257fe5b0160005b5054815260200190815260200160002081905550600060026001546101008110151561125e57fe5b0160005b50555b611135565b5b50565b600081516020830184f09050803b15610000575b92915050565b600061129333610494565b156104b057610107546112a461138f565b11156112bd576000610106556112b861138f565b610107555b61010654828101108015906112da57506101055482610106540111155b156112f0575061010680548201905560016104b0565b5060005b5b5b919050565b6101045460005b8181101561137d5761010480548290811061131957fe5b906000526020600020900160005b5054156113745761010360006101048381548110151561134357fe5b906000526020600020900160005b505481526020810191909152604001600090812081815560018101829055600201555b5b600101611302565b6105eb610104600061148f565b5b5050565b600062015180425b0490505b90565b50805460018160011615610100020316600290046000825580601f106113c457506104f5565b601f0160209004906000526020600020908101906104f591906114b1565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114275782800160ff19823516178555611454565b82800160010185558215611454579182015b82811115611454578235825591602001919060010190611439565b5b506114619291506114b1565b5090565b81548183558181151161048d5760008381526020902061048d9181019083016114b1565b5b505050565b50805460008255906000526020600020908101906104f591906114b1565b5b50565b61139b91905b8082111561146157600081556001016114b7565b5090565b90565b61139b91905b8082111561146157600081556001016114b7565b5090565b905600a165627a7a723058203a7ac7072dc640002704b704af82b742650362cd55debf72fca105c2b916e01d0029';
diff --git a/js/src/contracts/snippets/enhanced-wallet.sol b/js/src/contracts/snippets/enhanced-wallet.sol
index 374eb595f..1f89b1f6f 100644
--- a/js/src/contracts/snippets/enhanced-wallet.sol
+++ b/js/src/contracts/snippets/enhanced-wallet.sol
@@ -8,453 +8,454 @@
// use modifiers onlyowner (just own owned) or onlymanyowners(hash), whereby the same hash must be provided by
// some number (specified in constructor) of the set of owners (specified in the constructor, modifiable) before the
// interior is executed.
-pragma solidity ^0.4.6;
-contract multisig {
- // EVENTS
+pragma solidity ^0.4.9;
- // this contract can accept a confirmation, in which case
- // we record owner and operation (hash) alongside it.
- event Confirmation(address owner, bytes32 operation);
- event Revoke(address owner, bytes32 operation);
+contract WalletEvents {
+ // EVENTS
- // some others are in the case of an owner changing.
- event OwnerChanged(address oldOwner, address newOwner);
- event OwnerAdded(address newOwner);
- event OwnerRemoved(address oldOwner);
+ // this contract only has six types of events: it can accept a confirmation, in which case
+ // we record owner and operation (hash) alongside it.
+ event Confirmation(address owner, bytes32 operation);
+ event Revoke(address owner, bytes32 operation);
- // the last one is emitted if the required signatures change
- event RequirementChanged(uint newRequirement);
+ // some others are in the case of an owner changing.
+ event OwnerChanged(address oldOwner, address newOwner);
+ event OwnerAdded(address newOwner);
+ event OwnerRemoved(address oldOwner);
- // Funds has arrived into the wallet (record how much).
- event Deposit(address _from, uint value);
- // Single transaction going out of the wallet (record who signed for it, how much, and to whom it's going).
- event SingleTransact(address owner, uint value, address to, bytes data);
- // Multi-sig transaction going out of the wallet (record who signed for it last, the operation hash, how much, and to whom it's going).
- event MultiTransact(address owner, bytes32 operation, uint value, address to, bytes data);
- // Confirmation still needed for a transaction.
- event ConfirmationNeeded(bytes32 operation, address initiator, uint value, address to, bytes data);
+ // the last one is emitted if the required signatures change
+ event RequirementChanged(uint newRequirement);
+
+ // Funds has arrived into the wallet (record how much).
+ event Deposit(address _from, uint value);
+ // Single transaction going out of the wallet (record who signed for it, how much, and to whom it's going).
+ event SingleTransact(address owner, uint value, address to, bytes data, address created);
+ // Multi-sig transaction going out of the wallet (record who signed for it last, the operation hash, how much, and to whom it's going).
+ event MultiTransact(address owner, bytes32 operation, uint value, address to, bytes data, address created);
+ // Confirmation still needed for a transaction.
+ event ConfirmationNeeded(bytes32 operation, address initiator, uint value, address to, bytes data);
}
-contract multisigAbi is multisig {
- function isOwner(address _addr) returns (bool);
+contract WalletAbi {
+ // Revokes a prior confirmation of the given operation
+ function revoke(bytes32 _operation) external;
- function hasConfirmed(bytes32 _operation, address _owner) constant returns (bool);
+ // Replaces an owner `_from` with another `_to`.
+ function changeOwner(address _from, address _to) external;
- function confirm(bytes32 _h) returns(bool);
+ function addOwner(address _owner) external;
- // (re)sets the daily limit. needs many of the owners to confirm. doesn't alter the amount already spent today.
- function setDailyLimit(uint _newLimit);
+ function removeOwner(address _owner) external;
- function addOwner(address _owner);
+ function changeRequirement(uint _newRequired) external;
- function removeOwner(address _owner);
+ function isOwner(address _addr) constant returns (bool);
- function changeRequirement(uint _newRequired);
+ function hasConfirmed(bytes32 _operation, address _owner) external constant returns (bool);
- // Revokes a prior confirmation of the given operation
- function revoke(bytes32 _operation);
+ // (re)sets the daily limit. needs many of the owners to confirm. doesn't alter the amount already spent today.
+ function setDailyLimit(uint _newLimit) external;
- function changeOwner(address _from, address _to);
-
- function execute(address _to, uint _value, bytes _data) returns(bool);
+ function execute(address _to, uint _value, bytes _data) external returns (bytes32 o_hash);
+ function confirm(bytes32 _h) returns (bool o_success);
}
-contract WalletLibrary is multisig {
- // TYPES
+contract WalletLibrary is WalletEvents {
+ // TYPES
- // struct for the status of a pending operation.
- struct PendingState {
- uint yetNeeded;
- uint ownersDone;
- uint index;
+ // struct for the status of a pending operation.
+ struct PendingState {
+ uint yetNeeded;
+ uint ownersDone;
+ uint index;
+ }
+
+ // Transaction structure to remember details of transaction lest it need be saved for a later call.
+ struct Transaction {
+ address to;
+ uint value;
+ bytes data;
+ }
+
+ // MODIFIERS
+
+ // simple single-sig function modifier.
+ modifier onlyowner {
+ if (isOwner(msg.sender))
+ _;
+ }
+ // multi-sig function modifier: the operation must have an intrinsic hash in order
+ // that later attempts can be realised as the same underlying operation and
+ // thus count as confirmations.
+ modifier onlymanyowners(bytes32 _operation) {
+ if (confirmAndCheck(_operation))
+ _;
+ }
+
+ // METHODS
+
+ // gets called when no other function matches
+ function() payable {
+ // just being sent some cash?
+ if (msg.value > 0)
+ Deposit(msg.sender, msg.value);
+ }
+
+ // constructor is given number of sigs required to do protected "onlymanyowners" transactions
+ // as well as the selection of addresses capable of confirming them.
+ function initMultiowned(address[] _owners, uint _required) {
+ m_numOwners = _owners.length + 1;
+ m_owners[1] = uint(msg.sender);
+ m_ownerIndex[uint(msg.sender)] = 1;
+ for (uint i = 0; i < _owners.length; ++i)
+ {
+ m_owners[2 + i] = uint(_owners[i]);
+ m_ownerIndex[uint(_owners[i])] = 2 + i;
+ }
+ m_required = _required;
+ }
+
+ // Revokes a prior confirmation of the given operation
+ function revoke(bytes32 _operation) external {
+ uint ownerIndex = m_ownerIndex[uint(msg.sender)];
+ // make sure they're an owner
+ if (ownerIndex == 0) return;
+ uint ownerIndexBit = 2**ownerIndex;
+ var pending = m_pending[_operation];
+ if (pending.ownersDone & ownerIndexBit > 0) {
+ pending.yetNeeded++;
+ pending.ownersDone -= ownerIndexBit;
+ Revoke(msg.sender, _operation);
+ }
+ }
+
+ // Replaces an owner `_from` with another `_to`.
+ function changeOwner(address _from, address _to) onlymanyowners(sha3(msg.data)) external {
+ if (isOwner(_to)) return;
+ uint ownerIndex = m_ownerIndex[uint(_from)];
+ if (ownerIndex == 0) return;
+
+ clearPending();
+ m_owners[ownerIndex] = uint(_to);
+ m_ownerIndex[uint(_from)] = 0;
+ m_ownerIndex[uint(_to)] = ownerIndex;
+ OwnerChanged(_from, _to);
+ }
+
+ function addOwner(address _owner) onlymanyowners(sha3(msg.data)) external {
+ if (isOwner(_owner)) return;
+
+ clearPending();
+ if (m_numOwners >= c_maxOwners)
+ reorganizeOwners();
+ if (m_numOwners >= c_maxOwners)
+ return;
+ m_numOwners++;
+ m_owners[m_numOwners] = uint(_owner);
+ m_ownerIndex[uint(_owner)] = m_numOwners;
+ OwnerAdded(_owner);
+ }
+
+ function removeOwner(address _owner) onlymanyowners(sha3(msg.data)) external {
+ uint ownerIndex = m_ownerIndex[uint(_owner)];
+ if (ownerIndex == 0) return;
+ if (m_required > m_numOwners - 1) return;
+
+ m_owners[ownerIndex] = 0;
+ m_ownerIndex[uint(_owner)] = 0;
+ clearPending();
+ reorganizeOwners(); //make sure m_numOwner is equal to the number of owners and always points to the optimal free slot
+ OwnerRemoved(_owner);
+ }
+
+ function changeRequirement(uint _newRequired) onlymanyowners(sha3(msg.data)) external {
+ if (_newRequired > m_numOwners) return;
+ m_required = _newRequired;
+ clearPending();
+ RequirementChanged(_newRequired);
+ }
+
+ // Gets an owner by 0-indexed position (using numOwners as the count)
+ function getOwner(uint ownerIndex) external constant returns (address) {
+ return address(m_owners[ownerIndex + 1]);
+ }
+
+ function isOwner(address _addr) constant returns (bool) {
+ return m_ownerIndex[uint(_addr)] > 0;
+ }
+
+ function hasConfirmed(bytes32 _operation, address _owner) external constant returns (bool) {
+ var pending = m_pending[_operation];
+ uint ownerIndex = m_ownerIndex[uint(_owner)];
+
+ // make sure they're an owner
+ if (ownerIndex == 0) return false;
+
+ // determine the bit to set for this owner.
+ uint ownerIndexBit = 2**ownerIndex;
+ return !(pending.ownersDone & ownerIndexBit == 0);
+ }
+
+ // constructor - stores initial daily limit and records the present day's index.
+ function initDaylimit(uint _limit) {
+ m_dailyLimit = _limit;
+ m_lastDay = today();
+ }
+ // (re)sets the daily limit. needs many of the owners to confirm. doesn't alter the amount already spent today.
+ function setDailyLimit(uint _newLimit) onlymanyowners(sha3(msg.data)) external {
+ m_dailyLimit = _newLimit;
+ }
+ // resets the amount already spent today. needs many of the owners to confirm.
+ function resetSpentToday() onlymanyowners(sha3(msg.data)) external {
+ m_spentToday = 0;
+ }
+
+ // constructor - just pass on the owner array to the multiowned and
+ // the limit to daylimit
+ function initWallet(address[] _owners, uint _required, uint _daylimit) {
+ initDaylimit(_daylimit);
+ initMultiowned(_owners, _required);
+ }
+
+ // kills the contract sending everything to `_to`.
+ function kill(address _to) onlymanyowners(sha3(msg.data)) external {
+ suicide(_to);
+ }
+
+ // Outside-visible transact entry point. Executes transaction immediately if below daily spend limit.
+ // If not, goes into multisig process. We provide a hash on return to allow the sender to provide
+ // shortcuts for the other confirmations (allowing them to avoid replicating the _to, _value
+ // and _data arguments). They still get the option of using them if they want, anyways.
+ function execute(address _to, uint _value, bytes _data) external onlyowner returns (bytes32 o_hash) {
+ // first, take the opportunity to check that we're under the daily limit.
+ if ((_data.length == 0 && underLimit(_value)) || m_required == 1) {
+ // yes - just execute the call.
+ address created;
+ if (_to == 0) {
+ created = create(_value, _data);
+ } else {
+ if (!_to.call.value(_value)(_data))
+ throw;
+ }
+ SingleTransact(msg.sender, _value, _to, _data, created);
+ } else {
+ // determine our operation hash.
+ o_hash = sha3(msg.data, block.number);
+ // store if it's new
+ if (m_txs[o_hash].to == 0 && m_txs[o_hash].value == 0 && m_txs[o_hash].data.length == 0) {
+ m_txs[o_hash].to = _to;
+ m_txs[o_hash].value = _value;
+ m_txs[o_hash].data = _data;
+ }
+ if (!confirm(o_hash)) {
+ ConfirmationNeeded(o_hash, msg.sender, _value, _to, _data);
+ }
+ }
+ }
+
+ function create(uint _value, bytes _code) internal returns (address o_addr) {
+ assembly {
+ o_addr := create(_value, add(_code, 0x20), mload(_code))
+ jumpi(invalidJumpLabel, iszero(extcodesize(o_addr)))
+ }
+ }
+
+ // confirm a transaction through just the hash. we use the previous transactions map, m_txs, in order
+ // to determine the body of the transaction from the hash provided.
+ function confirm(bytes32 _h) onlymanyowners(_h) returns (bool o_success) {
+ if (m_txs[_h].to != 0 || m_txs[_h].value != 0 || m_txs[_h].data.length != 0) {
+ address created;
+ if (m_txs[_h].to == 0) {
+ created = create(m_txs[_h].value, m_txs[_h].data);
+ } else {
+ if (!m_txs[_h].to.call.value(m_txs[_h].value)(m_txs[_h].data))
+ throw;
+ }
+
+ MultiTransact(msg.sender, _h, m_txs[_h].value, m_txs[_h].to, m_txs[_h].data, created);
+ delete m_txs[_h];
+ return true;
+ }
+ }
+
+ // INTERNAL METHODS
+
+ function confirmAndCheck(bytes32 _operation) internal returns (bool) {
+ // determine what index the present sender is:
+ uint ownerIndex = m_ownerIndex[uint(msg.sender)];
+ // make sure they're an owner
+ if (ownerIndex == 0) return;
+
+ var pending = m_pending[_operation];
+ // if we're not yet working on this operation, switch over and reset the confirmation status.
+ if (pending.yetNeeded == 0) {
+ // reset count of confirmations needed.
+ pending.yetNeeded = m_required;
+ // reset which owners have confirmed (none) - set our bitmap to 0.
+ pending.ownersDone = 0;
+ pending.index = m_pendingIndex.length++;
+ m_pendingIndex[pending.index] = _operation;
+ }
+ // determine the bit to set for this owner.
+ uint ownerIndexBit = 2**ownerIndex;
+ // make sure we (the message sender) haven't confirmed this operation previously.
+ if (pending.ownersDone & ownerIndexBit == 0) {
+ Confirmation(msg.sender, _operation);
+ // ok - check if count is enough to go ahead.
+ if (pending.yetNeeded <= 1) {
+ // enough confirmations: reset and run interior.
+ delete m_pendingIndex[m_pending[_operation].index];
+ delete m_pending[_operation];
+ return true;
+ }
+ else
+ {
+ // not enough: record that this owner in particular confirmed.
+ pending.yetNeeded--;
+ pending.ownersDone |= ownerIndexBit;
+ }
+ }
+ }
+
+ function reorganizeOwners() private {
+ uint free = 1;
+ while (free < m_numOwners)
+ {
+ while (free < m_numOwners && m_owners[free] != 0) free++;
+ while (m_numOwners > 1 && m_owners[m_numOwners] == 0) m_numOwners--;
+ if (free < m_numOwners && m_owners[m_numOwners] != 0 && m_owners[free] == 0)
+ {
+ m_owners[free] = m_owners[m_numOwners];
+ m_ownerIndex[m_owners[free]] = free;
+ m_owners[m_numOwners] = 0;
+ }
+ }
+ }
+
+ // checks to see if there is at least `_value` left from the daily limit today. if there is, subtracts it and
+ // returns true. otherwise just returns false.
+ function underLimit(uint _value) internal onlyowner returns (bool) {
+ // reset the spend limit if we're on a different day to last time.
+ if (today() > m_lastDay) {
+ m_spentToday = 0;
+ m_lastDay = today();
+ }
+ // check to see if there's enough left - if so, subtract and return true.
+ // overflow protection // dailyLimit check
+ if (m_spentToday + _value >= m_spentToday && m_spentToday + _value <= m_dailyLimit) {
+ m_spentToday += _value;
+ return true;
+ }
+ return false;
+ }
+
+ // determines today's index.
+ function today() private constant returns (uint) { return now / 1 days; }
+
+ function clearPending() internal {
+ uint length = m_pendingIndex.length;
+
+ for (uint i = 0; i < length; ++i) {
+ delete m_txs[m_pendingIndex[i]];
+
+ if (m_pendingIndex[i] != 0)
+ delete m_pending[m_pendingIndex[i]];
}
- // Transaction structure to remember details of transaction lest it need be saved for a later call.
- struct Transaction {
- address to;
- uint value;
- bytes data;
- }
+ delete m_pendingIndex;
+ }
- /******************************
- ***** MULTI OWNED SECTION ****
- ******************************/
+ // FIELDS
+ address constant _walletLibrary = 0xcafecafecafecafecafecafecafecafecafecafe;
- // MODIFIERS
+ // the number of owners that must confirm the same operation before it is run.
+ uint public m_required;
+ // pointer used to find a free slot in m_owners
+ uint public m_numOwners;
- // simple single-sig function modifier.
- modifier onlyowner {
- if (isOwner(msg.sender))
- _;
- }
- // multi-sig function modifier: the operation must have an intrinsic hash in order
- // that later attempts can be realised as the same underlying operation and
- // thus count as confirmations.
- modifier onlymanyowners(bytes32 _operation) {
- if (confirmAndCheck(_operation))
- _;
- }
+ uint public m_dailyLimit;
+ uint public m_spentToday;
+ uint public m_lastDay;
- // METHODS
+ // list of owners
+ uint[256] m_owners;
- // constructor is given number of sigs required to do protected "onlymanyowners" transactions
- // as well as the selection of addresses capable of confirming them.
- function initMultiowned(address[] _owners, uint _required) {
- m_numOwners = _owners.length + 1;
- m_owners[1] = uint(msg.sender);
- m_ownerIndex[uint(msg.sender)] = 1;
- m_required = _required;
+ uint constant c_maxOwners = 250;
+ // index on the list of owners to allow reverse lookup
+ mapping(uint => uint) m_ownerIndex;
+ // the ongoing operations.
+ mapping(bytes32 => PendingState) m_pending;
+ bytes32[] m_pendingIndex;
- for (uint i = 0; i < _owners.length; ++i)
- {
- m_owners[2 + i] = uint(_owners[i]);
- m_ownerIndex[uint(_owners[i])] = 2 + i;
- }
- }
-
- // Revokes a prior confirmation of the given operation
- function revoke(bytes32 _operation) {
- uint ownerIndex = m_ownerIndex[uint(msg.sender)];
- // make sure they're an owner
- if (ownerIndex == 0) return;
- uint ownerIndexBit = 2**ownerIndex;
- var pending = m_pending[_operation];
- if (pending.ownersDone & ownerIndexBit > 0) {
- pending.yetNeeded++;
- pending.ownersDone -= ownerIndexBit;
- Revoke(msg.sender, _operation);
- }
- }
-
- // Replaces an owner `_from` with another `_to`.
- function changeOwner(address _from, address _to) onlymanyowners(sha3(msg.data)) {
- if (isOwner(_to)) return;
- uint ownerIndex = m_ownerIndex[uint(_from)];
- if (ownerIndex == 0) return;
-
- clearPending();
- m_owners[ownerIndex] = uint(_to);
- m_ownerIndex[uint(_from)] = 0;
- m_ownerIndex[uint(_to)] = ownerIndex;
- OwnerChanged(_from, _to);
- }
-
- function addOwner(address _owner) onlymanyowners(sha3(msg.data)) {
- if (isOwner(_owner)) return;
-
- clearPending();
- if (m_numOwners >= c_maxOwners)
- reorganizeOwners();
- if (m_numOwners >= c_maxOwners)
- return;
- m_numOwners++;
- m_owners[m_numOwners] = uint(_owner);
- m_ownerIndex[uint(_owner)] = m_numOwners;
- OwnerAdded(_owner);
- }
-
- function removeOwner(address _owner) onlymanyowners(sha3(msg.data)) {
- uint ownerIndex = m_ownerIndex[uint(_owner)];
- if (ownerIndex == 0) return;
- if (m_required > m_numOwners - 1) return;
-
- m_owners[ownerIndex] = 0;
- m_ownerIndex[uint(_owner)] = 0;
- clearPending();
- reorganizeOwners(); //make sure m_numOwner is equal to the number of owners and always points to the optimal free slot
- OwnerRemoved(_owner);
- }
-
- function changeRequirement(uint _newRequired) onlymanyowners(sha3(msg.data)) {
- if (_newRequired > m_numOwners) return;
- m_required = _newRequired;
- clearPending();
- RequirementChanged(_newRequired);
- }
-
- function isOwner(address _addr) returns (bool) {
- return m_ownerIndex[uint(_addr)] > 0;
- }
-
-
- function hasConfirmed(bytes32 _operation, address _owner) constant returns (bool) {
- var pending = m_pending[_operation];
- uint ownerIndex = m_ownerIndex[uint(_owner)];
-
- // make sure they're an owner
- if (ownerIndex == 0) return false;
-
- // determine the bit to set for this owner.
- uint ownerIndexBit = 2**ownerIndex;
- return !(pending.ownersDone & ownerIndexBit == 0);
- }
-
- // INTERNAL METHODS
-
- function confirmAndCheck(bytes32 _operation) internal returns (bool) {
- // determine what index the present sender is:
- uint ownerIndex = m_ownerIndex[uint(msg.sender)];
- // make sure they're an owner
- if (ownerIndex == 0) return;
-
- var pending = m_pending[_operation];
- // if we're not yet working on this operation, switch over and reset the confirmation status.
- if (pending.yetNeeded == 0) {
- // reset count of confirmations needed.
- pending.yetNeeded = m_required;
- // reset which owners have confirmed (none) - set our bitmap to 0.
- pending.ownersDone = 0;
- pending.index = m_pendingIndex.length++;
- m_pendingIndex[pending.index] = _operation;
- }
- // determine the bit to set for this owner.
- uint ownerIndexBit = 2**ownerIndex;
- // make sure we (the message sender) haven't confirmed this operation previously.
- if (pending.ownersDone & ownerIndexBit == 0) {
- Confirmation(msg.sender, _operation);
- // ok - check if count is enough to go ahead.
- if (pending.yetNeeded <= 1) {
- // enough confirmations: reset and run interior.
- delete m_pendingIndex[m_pending[_operation].index];
- delete m_pending[_operation];
- return true;
- }
- else
- {
- // not enough: record that this owner in particular confirmed.
- pending.yetNeeded--;
- pending.ownersDone |= ownerIndexBit;
- }
- }
- }
-
- function reorganizeOwners() private {
- uint free = 1;
- while (free < m_numOwners)
- {
- while (free < m_numOwners && m_owners[free] != 0) free++;
- while (m_numOwners > 1 && m_owners[m_numOwners] == 0) m_numOwners--;
- if (free < m_numOwners && m_owners[m_numOwners] != 0 && m_owners[free] == 0)
- {
- m_owners[free] = m_owners[m_numOwners];
- m_ownerIndex[m_owners[free]] = free;
- m_owners[m_numOwners] = 0;
- }
- }
- }
-
- function clearPending() internal {
- uint length = m_pendingIndex.length;
- for (uint i = 0; i < length; ++i)
- if (m_pendingIndex[i] != 0)
- delete m_pending[m_pendingIndex[i]];
- delete m_pendingIndex;
- }
-
-
- /******************************
- ****** DAY LIMIT SECTION *****
- ******************************/
-
- // MODIFIERS
-
- // simple modifier for daily limit.
- modifier limitedDaily(uint _value) {
- if (underLimit(_value))
- _;
- }
-
- // METHODS
-
- // constructor - stores initial daily limit and records the present day's index.
- function initDaylimit(uint _limit) {
- m_dailyLimit = _limit;
- m_lastDay = today();
- }
- // (re)sets the daily limit. needs many of the owners to confirm. doesn't alter the amount already spent today.
- function setDailyLimit(uint _newLimit) onlymanyowners(sha3(msg.data)) {
- m_dailyLimit = _newLimit;
- }
- // resets the amount already spent today. needs many of the owners to confirm.
- function resetSpentToday() onlymanyowners(sha3(msg.data)) {
- m_spentToday = 0;
- }
-
- // INTERNAL METHODS
-
- // checks to see if there is at least `_value` left from the daily limit today. if there is, subtracts it and
- // returns true. otherwise just returns false.
- function underLimit(uint _value) internal onlyowner returns (bool) {
- // reset the spend limit if we're on a different day to last time.
- if (today() > m_lastDay) {
- m_spentToday = 0;
- m_lastDay = today();
- }
- // check to see if there's enough left - if so, subtract and return true.
- // overflow protection // dailyLimit check
- if (m_spentToday + _value >= m_spentToday && m_spentToday + _value <= m_dailyLimit) {
- m_spentToday += _value;
- return true;
- }
- return false;
- }
-
- // determines today's index.
- function today() private constant returns (uint) { return now / 1 days; }
-
-
- /******************************
- ********* WALLET SECTION *****
- ******************************/
-
- // METHODS
-
- // constructor - just pass on the owner array to the multiowned and
- // the limit to daylimit
- function initWallet(address[] _owners, uint _required, uint _daylimit) {
- initMultiowned(_owners, _required);
- initDaylimit(_daylimit) ;
- }
-
- // kills the contract sending everything to `_to`.
- function kill(address _to) onlymanyowners(sha3(msg.data)) {
- suicide(_to);
- }
-
- // Outside-visible transact entry point. Executes transaction immediately if below daily spend limit.
- // If not, goes into multisig process. We provide a hash on return to allow the sender to provide
- // shortcuts for the other confirmations (allowing them to avoid replicating the _to, _value
- // and _data arguments). They still get the option of using them if they want, anyways.
- function execute(address _to, uint _value, bytes _data) onlyowner returns(bool _callValue) {
- // first, take the opportunity to check that we're under the daily limit.
- if (underLimit(_value)) {
- SingleTransact(msg.sender, _value, _to, _data);
- // yes - just execute the call.
- _callValue =_to.call.value(_value)(_data);
- } else {
- // determine our operation hash.
- bytes32 _r = sha3(msg.data, block.number);
- if (!confirm(_r) && m_txs[_r].to == 0) {
- m_txs[_r].to = _to;
- m_txs[_r].value = _value;
- m_txs[_r].data = _data;
- ConfirmationNeeded(_r, msg.sender, _value, _to, _data);
- }
- }
- }
-
- // confirm a transaction through just the hash. we use the previous transactions map, m_txs, in order
- // to determine the body of the transaction from the hash provided.
- function confirm(bytes32 _h) onlymanyowners(_h) returns (bool) {
- if (m_txs[_h].to != 0) {
- m_txs[_h].to.call.value(m_txs[_h].value)(m_txs[_h].data);
- MultiTransact(msg.sender, _h, m_txs[_h].value, m_txs[_h].to, m_txs[_h].data);
- delete m_txs[_h];
- return true;
- }
- }
-
- // INTERNAL METHODS
-
- function clearWalletPending() internal {
- uint length = m_pendingIndex.length;
- for (uint i = 0; i < length; ++i)
- delete m_txs[m_pendingIndex[i]];
- clearPending();
- }
-
- // FIELDS
- address constant _walletLibrary = 0xcafecafecafecafecafecafecafecafecafecafe;
-
- // the number of owners that must confirm the same operation before it is run.
- uint m_required;
- // pointer used to find a free slot in m_owners
- uint m_numOwners;
-
- uint public m_dailyLimit;
- uint public m_spentToday;
- uint public m_lastDay;
-
- // list of owners
- uint[256] m_owners;
- uint constant c_maxOwners = 250;
-
- // index on the list of owners to allow reverse lookup
- mapping(uint => uint) m_ownerIndex;
- // the ongoing operations.
- mapping(bytes32 => PendingState) m_pending;
- bytes32[] m_pendingIndex;
-
- // pending transactions we have at present.
- mapping (bytes32 => Transaction) m_txs;
+ // pending transactions we have at present.
+ mapping (bytes32 => Transaction) m_txs;
}
+contract Wallet is WalletEvents {
-contract Wallet is multisig {
+ // WALLET CONSTRUCTOR
+ // calls the `initWallet` method of the Library in this context
+ function Wallet(address[] _owners, uint _required, uint _daylimit) {
+ // Signature of the Wallet Library's init function
+ bytes4 sig = bytes4(sha3("initWallet(address[],uint256,uint256)"));
+ address target = _walletLibrary;
- // WALLET CONSTRUCTOR
- // calls the `initWallet` method of the Library in this context
- function Wallet(address[] _owners, uint _required, uint _daylimit) {
- // Signature of the Wallet Library's init function
- bytes4 sig = bytes4(sha3("initWallet(address[],uint256,uint256)"));
- address target = _walletLibrary;
+ // Compute the size of the call data : arrays has 2
+ // 32bytes for offset and length, plus 32bytes per element ;
+ // plus 2 32bytes for each uint
+ uint argarraysize = (2 + _owners.length);
+ uint argsize = (2 + argarraysize) * 32;
- // Compute the size of the call data : arrays has 2
- // 32bytes for offset and length, plus 32bytes per element ;
- // plus 2 32bytes for each uint
- uint argarraysize = (2 + _owners.length);
- uint argsize = (2 + argarraysize) * 32;
-
- assembly {
- // Add the signature first to memory
- mstore(0x0, sig)
- // Add the call data, which is at the end of the
- // code
- codecopy(0x4, sub(codesize, argsize), argsize)
- // Delegate call to the library
- delegatecall(sub(gas, 10000), target, 0x0, add(argsize, 0x4), 0x0, 0x0)
- }
+ assembly {
+ // Add the signature first to memory
+ mstore(0x0, sig)
+ // Add the call data, which is at the end of the
+ // code
+ codecopy(0x4, sub(codesize, argsize), argsize)
+ // Delegate call to the library
+ delegatecall(sub(gas, 10000), target, 0x0, add(argsize, 0x4), 0x0, 0x0)
}
+ }
- // METHODS
+ // METHODS
- // gets called when no other function matches
- function() payable {
- // just being sent some cash?
- if (msg.value > 0)
- Deposit(msg.sender, msg.value);
- else if (msg.data.length > 0)
- _walletLibrary.delegatecall(msg.data);
- }
+ // gets called when no other function matches
+ function() payable {
+ // just being sent some cash?
+ if (msg.value > 0)
+ Deposit(msg.sender, msg.value);
+ else if (msg.data.length > 0)
+ _walletLibrary.delegatecall(msg.data);
+ }
- // Gets an owner by 0-indexed position (using numOwners as the count)
- function getOwner(uint ownerIndex) constant returns (address) {
- return address(m_owners[ownerIndex + 1]);
- }
+ // Gets an owner by 0-indexed position (using numOwners as the count)
+ function getOwner(uint ownerIndex) constant returns (address) {
+ return address(m_owners[ownerIndex + 1]);
+ }
- // As return statement unavailable in fallback, explicit the method here
+ // As return statement unavailable in fallback, explicit the method here
- function hasConfirmed(bytes32 _operation, address _owner) constant returns (bool) {
- return _walletLibrary.delegatecall(msg.data);
- }
+ function hasConfirmed(bytes32 _operation, address _owner) external constant returns (bool) {
+ return _walletLibrary.delegatecall(msg.data);
+ }
- function isOwner(address _addr) returns (bool) {
- return _walletLibrary.delegatecall(msg.data);
- }
+ function isOwner(address _addr) constant returns (bool) {
+ return _walletLibrary.delegatecall(msg.data);
+ }
- // FIELDS
- address constant _walletLibrary = 0xcafecafecafecafecafecafecafecafecafecafe;
+ // FIELDS
+ address constant _walletLibrary = 0xcafecafecafecafecafecafecafecafecafecafe;
- // the number of owners that must confirm the same operation before it is run.
- uint public m_required;
- // pointer used to find a free slot in m_owners
- uint public m_numOwners;
+ // the number of owners that must confirm the same operation before it is run.
+ uint public m_required;
+ // pointer used to find a free slot in m_owners
+ uint public m_numOwners;
- uint public m_dailyLimit;
- uint public m_spentToday;
- uint public m_lastDay;
+ uint public m_dailyLimit;
+ uint public m_spentToday;
+ uint public m_lastDay;
- // list of owners
- uint[256] m_owners;
+ // list of owners
+ uint[256] m_owners;
}
diff --git a/js/src/contracts/snippets/wallet.sol b/js/src/contracts/snippets/wallet.sol
index b369eea76..18de9df68 100644
--- a/js/src/contracts/snippets/wallet.sol
+++ b/js/src/contracts/snippets/wallet.sol
@@ -8,221 +8,222 @@
// use modifiers onlyowner (just own owned) or onlymanyowners(hash), whereby the same hash must be provided by
// some number (specified in constructor) of the set of owners (specified in the constructor, modifiable) before the
// interior is executed.
-pragma solidity ^0.4.6;
+
+pragma solidity ^0.4.9;
contract multiowned {
- // TYPES
+ // TYPES
- // struct for the status of a pending operation.
- struct PendingState {
- uint yetNeeded;
- uint ownersDone;
- uint index;
+ // struct for the status of a pending operation.
+ struct PendingState {
+ uint yetNeeded;
+ uint ownersDone;
+ uint index;
+ }
+
+ // EVENTS
+
+ // this contract only has six types of events: it can accept a confirmation, in which case
+ // we record owner and operation (hash) alongside it.
+ event Confirmation(address owner, bytes32 operation);
+ event Revoke(address owner, bytes32 operation);
+ // some others are in the case of an owner changing.
+ event OwnerChanged(address oldOwner, address newOwner);
+ event OwnerAdded(address newOwner);
+ event OwnerRemoved(address oldOwner);
+ // the last one is emitted if the required signatures change
+ event RequirementChanged(uint newRequirement);
+
+ // MODIFIERS
+
+ // simple single-sig function modifier.
+ modifier onlyowner {
+ if (isOwner(msg.sender))
+ _;
+ }
+ // multi-sig function modifier: the operation must have an intrinsic hash in order
+ // that later attempts can be realised as the same underlying operation and
+ // thus count as confirmations.
+ modifier onlymanyowners(bytes32 _operation) {
+ if (confirmAndCheck(_operation))
+ _;
+ }
+
+ // METHODS
+
+ // constructor is given number of sigs required to do protected "onlymanyowners" transactions
+ // as well as the selection of addresses capable of confirming them.
+ function multiowned(address[] _owners, uint _required) {
+ m_numOwners = _owners.length + 1;
+ m_owners[1] = uint(msg.sender);
+ m_ownerIndex[uint(msg.sender)] = 1;
+ for (uint i = 0; i < _owners.length; ++i)
+ {
+ m_owners[2 + i] = uint(_owners[i]);
+ m_ownerIndex[uint(_owners[i])] = 2 + i;
}
+ m_required = _required;
+ }
- // EVENTS
-
- // this contract only has six types of events: it can accept a confirmation, in which case
- // we record owner and operation (hash) alongside it.
- event Confirmation(address owner, bytes32 operation);
- event Revoke(address owner, bytes32 operation);
- // some others are in the case of an owner changing.
- event OwnerChanged(address oldOwner, address newOwner);
- event OwnerAdded(address newOwner);
- event OwnerRemoved(address oldOwner);
- // the last one is emitted if the required signatures change
- event RequirementChanged(uint newRequirement);
-
- // MODIFIERS
-
- // simple single-sig function modifier.
- modifier onlyowner {
- if (isOwner(msg.sender))
- _;
+ // Revokes a prior confirmation of the given operation
+ function revoke(bytes32 _operation) external {
+ uint ownerIndex = m_ownerIndex[uint(msg.sender)];
+ // make sure they're an owner
+ if (ownerIndex == 0) return;
+ uint ownerIndexBit = 2**ownerIndex;
+ var pending = m_pending[_operation];
+ if (pending.ownersDone & ownerIndexBit > 0) {
+ pending.yetNeeded++;
+ pending.ownersDone -= ownerIndexBit;
+ Revoke(msg.sender, _operation);
}
- // multi-sig function modifier: the operation must have an intrinsic hash in order
- // that later attempts can be realised as the same underlying operation and
- // thus count as confirmations.
- modifier onlymanyowners(bytes32 _operation) {
- if (confirmAndCheck(_operation))
- _;
+ }
+
+ // Replaces an owner `_from` with another `_to`.
+ function changeOwner(address _from, address _to) onlymanyowners(sha3(msg.data)) external {
+ if (isOwner(_to)) return;
+ uint ownerIndex = m_ownerIndex[uint(_from)];
+ if (ownerIndex == 0) return;
+
+ clearPending();
+ m_owners[ownerIndex] = uint(_to);
+ m_ownerIndex[uint(_from)] = 0;
+ m_ownerIndex[uint(_to)] = ownerIndex;
+ OwnerChanged(_from, _to);
+ }
+
+ function addOwner(address _owner) onlymanyowners(sha3(msg.data)) external {
+ if (isOwner(_owner)) return;
+
+ clearPending();
+ if (m_numOwners >= c_maxOwners)
+ reorganizeOwners();
+ if (m_numOwners >= c_maxOwners)
+ return;
+ m_numOwners++;
+ m_owners[m_numOwners] = uint(_owner);
+ m_ownerIndex[uint(_owner)] = m_numOwners;
+ OwnerAdded(_owner);
+ }
+
+ function removeOwner(address _owner) onlymanyowners(sha3(msg.data)) external {
+ uint ownerIndex = m_ownerIndex[uint(_owner)];
+ if (ownerIndex == 0) return;
+ if (m_required > m_numOwners - 1) return;
+
+ m_owners[ownerIndex] = 0;
+ m_ownerIndex[uint(_owner)] = 0;
+ clearPending();
+ reorganizeOwners(); //make sure m_numOwner is equal to the number of owners and always points to the optimal free slot
+ OwnerRemoved(_owner);
+ }
+
+ function changeRequirement(uint _newRequired) onlymanyowners(sha3(msg.data)) external {
+ if (_newRequired > m_numOwners) return;
+ m_required = _newRequired;
+ clearPending();
+ RequirementChanged(_newRequired);
+ }
+
+ // Gets an owner by 0-indexed position (using numOwners as the count)
+ function getOwner(uint ownerIndex) external constant returns (address) {
+ return address(m_owners[ownerIndex + 1]);
+ }
+
+ function isOwner(address _addr) constant returns (bool) {
+ return m_ownerIndex[uint(_addr)] > 0;
+ }
+
+ function hasConfirmed(bytes32 _operation, address _owner) constant returns (bool) {
+ var pending = m_pending[_operation];
+ uint ownerIndex = m_ownerIndex[uint(_owner)];
+
+ // make sure they're an owner
+ if (ownerIndex == 0) return false;
+
+ // determine the bit to set for this owner.
+ uint ownerIndexBit = 2**ownerIndex;
+ return !(pending.ownersDone & ownerIndexBit == 0);
+ }
+
+ // INTERNAL METHODS
+
+ function confirmAndCheck(bytes32 _operation) internal returns (bool) {
+ // determine what index the present sender is:
+ uint ownerIndex = m_ownerIndex[uint(msg.sender)];
+ // make sure they're an owner
+ if (ownerIndex == 0) return;
+
+ var pending = m_pending[_operation];
+ // if we're not yet working on this operation, switch over and reset the confirmation status.
+ if (pending.yetNeeded == 0) {
+ // reset count of confirmations needed.
+ pending.yetNeeded = m_required;
+ // reset which owners have confirmed (none) - set our bitmap to 0.
+ pending.ownersDone = 0;
+ pending.index = m_pendingIndex.length++;
+ m_pendingIndex[pending.index] = _operation;
}
-
- // METHODS
-
- // constructor is given number of sigs required to do protected "onlymanyowners" transactions
- // as well as the selection of addresses capable of confirming them.
- function multiowned(address[] _owners, uint _required) {
- m_numOwners = _owners.length + 1;
- m_owners[1] = uint(msg.sender);
- m_ownerIndex[uint(msg.sender)] = 1;
- for (uint i = 0; i < _owners.length; ++i)
- {
- m_owners[2 + i] = uint(_owners[i]);
- m_ownerIndex[uint(_owners[i])] = 2 + i;
- }
- m_required = _required;
+ // determine the bit to set for this owner.
+ uint ownerIndexBit = 2**ownerIndex;
+ // make sure we (the message sender) haven't confirmed this operation previously.
+ if (pending.ownersDone & ownerIndexBit == 0) {
+ Confirmation(msg.sender, _operation);
+ // ok - check if count is enough to go ahead.
+ if (pending.yetNeeded <= 1) {
+ // enough confirmations: reset and run interior.
+ delete m_pendingIndex[m_pending[_operation].index];
+ delete m_pending[_operation];
+ return true;
+ }
+ else
+ {
+ // not enough: record that this owner in particular confirmed.
+ pending.yetNeeded--;
+ pending.ownersDone |= ownerIndexBit;
+ }
}
+ }
- // Revokes a prior confirmation of the given operation
- function revoke(bytes32 _operation) external {
- uint ownerIndex = m_ownerIndex[uint(msg.sender)];
- // make sure they're an owner
- if (ownerIndex == 0) return;
- uint ownerIndexBit = 2**ownerIndex;
- var pending = m_pending[_operation];
- if (pending.ownersDone & ownerIndexBit > 0) {
- pending.yetNeeded++;
- pending.ownersDone -= ownerIndexBit;
- Revoke(msg.sender, _operation);
- }
+ function reorganizeOwners() private {
+ uint free = 1;
+ while (free < m_numOwners)
+ {
+ while (free < m_numOwners && m_owners[free] != 0) free++;
+ while (m_numOwners > 1 && m_owners[m_numOwners] == 0) m_numOwners--;
+ if (free < m_numOwners && m_owners[m_numOwners] != 0 && m_owners[free] == 0)
+ {
+ m_owners[free] = m_owners[m_numOwners];
+ m_ownerIndex[m_owners[free]] = free;
+ m_owners[m_numOwners] = 0;
+ }
}
+ }
- // Replaces an owner `_from` with another `_to`.
- function changeOwner(address _from, address _to) onlymanyowners(sha3(msg.data)) external {
- if (isOwner(_to)) return;
- uint ownerIndex = m_ownerIndex[uint(_from)];
- if (ownerIndex == 0) return;
+ function clearPending() internal {
+ uint length = m_pendingIndex.length;
+ for (uint i = 0; i < length; ++i)
+ if (m_pendingIndex[i] != 0)
+ delete m_pending[m_pendingIndex[i]];
+ delete m_pendingIndex;
+ }
- clearPending();
- m_owners[ownerIndex] = uint(_to);
- m_ownerIndex[uint(_from)] = 0;
- m_ownerIndex[uint(_to)] = ownerIndex;
- OwnerChanged(_from, _to);
- }
+ // FIELDS
- function addOwner(address _owner) onlymanyowners(sha3(msg.data)) external {
- if (isOwner(_owner)) return;
+ // the number of owners that must confirm the same operation before it is run.
+ uint public m_required;
+ // pointer used to find a free slot in m_owners
+ uint public m_numOwners;
- clearPending();
- if (m_numOwners >= c_maxOwners)
- reorganizeOwners();
- if (m_numOwners >= c_maxOwners)
- return;
- m_numOwners++;
- m_owners[m_numOwners] = uint(_owner);
- m_ownerIndex[uint(_owner)] = m_numOwners;
- OwnerAdded(_owner);
- }
-
- function removeOwner(address _owner) onlymanyowners(sha3(msg.data)) external {
- uint ownerIndex = m_ownerIndex[uint(_owner)];
- if (ownerIndex == 0) return;
- if (m_required > m_numOwners - 1) return;
-
- m_owners[ownerIndex] = 0;
- m_ownerIndex[uint(_owner)] = 0;
- clearPending();
- reorganizeOwners(); //make sure m_numOwner is equal to the number of owners and always points to the optimal free slot
- OwnerRemoved(_owner);
- }
-
- function changeRequirement(uint _newRequired) onlymanyowners(sha3(msg.data)) external {
- if (_newRequired > m_numOwners) return;
- m_required = _newRequired;
- clearPending();
- RequirementChanged(_newRequired);
- }
-
- // Gets an owner by 0-indexed position (using numOwners as the count)
- function getOwner(uint ownerIndex) external constant returns (address) {
- return address(m_owners[ownerIndex + 1]);
- }
-
- function isOwner(address _addr) returns (bool) {
- return m_ownerIndex[uint(_addr)] > 0;
- }
-
- function hasConfirmed(bytes32 _operation, address _owner) constant returns (bool) {
- var pending = m_pending[_operation];
- uint ownerIndex = m_ownerIndex[uint(_owner)];
-
- // make sure they're an owner
- if (ownerIndex == 0) return false;
-
- // determine the bit to set for this owner.
- uint ownerIndexBit = 2**ownerIndex;
- return !(pending.ownersDone & ownerIndexBit == 0);
- }
-
- // INTERNAL METHODS
-
- function confirmAndCheck(bytes32 _operation) internal returns (bool) {
- // determine what index the present sender is:
- uint ownerIndex = m_ownerIndex[uint(msg.sender)];
- // make sure they're an owner
- if (ownerIndex == 0) return;
-
- var pending = m_pending[_operation];
- // if we're not yet working on this operation, switch over and reset the confirmation status.
- if (pending.yetNeeded == 0) {
- // reset count of confirmations needed.
- pending.yetNeeded = m_required;
- // reset which owners have confirmed (none) - set our bitmap to 0.
- pending.ownersDone = 0;
- pending.index = m_pendingIndex.length++;
- m_pendingIndex[pending.index] = _operation;
- }
- // determine the bit to set for this owner.
- uint ownerIndexBit = 2**ownerIndex;
- // make sure we (the message sender) haven't confirmed this operation previously.
- if (pending.ownersDone & ownerIndexBit == 0) {
- Confirmation(msg.sender, _operation);
- // ok - check if count is enough to go ahead.
- if (pending.yetNeeded <= 1) {
- // enough confirmations: reset and run interior.
- delete m_pendingIndex[m_pending[_operation].index];
- delete m_pending[_operation];
- return true;
- }
- else
- {
- // not enough: record that this owner in particular confirmed.
- pending.yetNeeded--;
- pending.ownersDone |= ownerIndexBit;
- }
- }
- }
-
- function reorganizeOwners() private {
- uint free = 1;
- while (free < m_numOwners)
- {
- while (free < m_numOwners && m_owners[free] != 0) free++;
- while (m_numOwners > 1 && m_owners[m_numOwners] == 0) m_numOwners--;
- if (free < m_numOwners && m_owners[m_numOwners] != 0 && m_owners[free] == 0)
- {
- m_owners[free] = m_owners[m_numOwners];
- m_ownerIndex[m_owners[free]] = free;
- m_owners[m_numOwners] = 0;
- }
- }
- }
-
- function clearPending() internal {
- uint length = m_pendingIndex.length;
- for (uint i = 0; i < length; ++i)
- if (m_pendingIndex[i] != 0)
- delete m_pending[m_pendingIndex[i]];
- delete m_pendingIndex;
- }
-
- // FIELDS
-
- // the number of owners that must confirm the same operation before it is run.
- uint public m_required;
- // pointer used to find a free slot in m_owners
- uint public m_numOwners;
-
- // list of owners
- uint[256] m_owners;
- uint constant c_maxOwners = 250;
- // index on the list of owners to allow reverse lookup
- mapping(uint => uint) m_ownerIndex;
- // the ongoing operations.
- mapping(bytes32 => PendingState) m_pending;
- bytes32[] m_pendingIndex;
+ // list of owners
+ uint[256] m_owners;
+ uint constant c_maxOwners = 250;
+ // index on the list of owners to allow reverse lookup
+ mapping(uint => uint) m_ownerIndex;
+ // the ongoing operations.
+ mapping(bytes32 => PendingState) m_pending;
+ bytes32[] m_pendingIndex;
}
// inheritable "property" contract that enables methods to be protected by placing a linear limit (specifiable)
@@ -230,79 +231,70 @@ contract multiowned {
// uses is specified in the modifier.
contract daylimit is multiowned {
- // MODIFIERS
+ // METHODS
- // simple modifier for daily limit.
- modifier limitedDaily(uint _value) {
- if (underLimit(_value))
- _;
+ // constructor - stores initial daily limit and records the present day's index.
+ function daylimit(uint _limit) {
+ m_dailyLimit = _limit;
+ m_lastDay = today();
+ }
+ // (re)sets the daily limit. needs many of the owners to confirm. doesn't alter the amount already spent today.
+ function setDailyLimit(uint _newLimit) onlymanyowners(sha3(msg.data)) external {
+ m_dailyLimit = _newLimit;
+ }
+ // resets the amount already spent today. needs many of the owners to confirm.
+ function resetSpentToday() onlymanyowners(sha3(msg.data)) external {
+ m_spentToday = 0;
+ }
+
+ // INTERNAL METHODS
+
+ // checks to see if there is at least `_value` left from the daily limit today. if there is, subtracts it and
+ // returns true. otherwise just returns false.
+ function underLimit(uint _value) internal onlyowner returns (bool) {
+ // reset the spend limit if we're on a different day to last time.
+ if (today() > m_lastDay) {
+ m_spentToday = 0;
+ m_lastDay = today();
}
-
- // METHODS
-
- // constructor - stores initial daily limit and records the present day's index.
- function daylimit(uint _limit) {
- m_dailyLimit = _limit;
- m_lastDay = today();
- }
- // (re)sets the daily limit. needs many of the owners to confirm. doesn't alter the amount already spent today.
- function setDailyLimit(uint _newLimit) onlymanyowners(sha3(msg.data)) external {
- m_dailyLimit = _newLimit;
- }
- // resets the amount already spent today. needs many of the owners to confirm.
- function resetSpentToday() onlymanyowners(sha3(msg.data)) external {
- m_spentToday = 0;
+ // check to see if there's enough left - if so, subtract and return true.
+ // overflow protection // dailyLimit check
+ if (m_spentToday + _value >= m_spentToday && m_spentToday + _value <= m_dailyLimit) {
+ m_spentToday += _value;
+ return true;
}
+ return false;
+ }
+ // determines today's index.
+ function today() private constant returns (uint) { return now / 1 days; }
- // INTERNAL METHODS
+ // FIELDS
- // checks to see if there is at least `_value` left from the daily limit today. if there is, subtracts it and
- // returns true. otherwise just returns false.
- function underLimit(uint _value) internal onlyowner returns (bool) {
- // reset the spend limit if we're on a different day to last time.
- if (today() > m_lastDay) {
- m_spentToday = 0;
- m_lastDay = today();
- }
- // check to see if there's enough left - if so, subtract and return true.
- // overflow protection // dailyLimit check
- if (m_spentToday + _value >= m_spentToday && m_spentToday + _value <= m_dailyLimit) {
- m_spentToday += _value;
- return true;
- }
- return false;
- }
- // determines today's index.
- function today() private constant returns (uint) { return now / 1 days; }
-
- // FIELDS
-
- uint public m_dailyLimit;
- uint public m_spentToday;
- uint public m_lastDay;
+ uint public m_dailyLimit;
+ uint public m_spentToday;
+ uint public m_lastDay;
}
// interface contract for multisig proxy contracts; see below for docs.
contract multisig {
- // EVENTS
+ // EVENTS
- // logged events:
- // Funds has arrived into the wallet (record how much).
- event Deposit(address _from, uint value);
- // Single transaction going out of the wallet (record who signed for it, how much, and to whom it's going).
- event SingleTransact(address owner, uint value, address to, bytes data);
- // Multi-sig transaction going out of the wallet (record who signed for it last, the operation hash, how much, and to whom it's going).
- event MultiTransact(address owner, bytes32 operation, uint value, address to, bytes data);
- // Confirmation still needed for a transaction.
- event ConfirmationNeeded(bytes32 operation, address initiator, uint value, address to, bytes data);
+ // logged events:
+ // Funds has arrived into the wallet (record how much).
+ event Deposit(address _from, uint value);
+ // Single transaction going out of the wallet (record who signed for it, how much, and to whom it's going).
+ event SingleTransact(address owner, uint value, address to, bytes data, address created);
+ // Multi-sig transaction going out of the wallet (record who signed for it last, the operation hash, how much, and to whom it's going).
+ event MultiTransact(address owner, bytes32 operation, uint value, address to, bytes data, address created);
+ // Confirmation still needed for a transaction.
+ event ConfirmationNeeded(bytes32 operation, address initiator, uint value, address to, bytes data);
- // FUNCTIONS
+ // FUNCTIONS
- // TODO: document
- function changeOwner(address _from, address _to) external;
- function execute(address _to, uint _value, bytes _data) external returns (bytes32);
- function confirm(bytes32 _h) returns (bool);
+ // TODO: document
+ function execute(address _to, uint _value, bytes _data) external returns (bytes32 o_hash);
+ function confirm(bytes32 _h) external returns (bool o_success);
}
// usage:
@@ -310,79 +302,102 @@ contract multisig {
// Wallet(w).from(anotherOwner).confirm(h);
contract Wallet is multisig, multiowned, daylimit {
- // TYPES
+ // TYPES
- // Transaction structure to remember details of transaction lest it need be saved for a later call.
- struct Transaction {
- address to;
- uint value;
- bytes data;
+ // Transaction structure to remember details of transaction lest it need be saved for a later call.
+ struct Transaction {
+ address to;
+ uint value;
+ bytes data;
+ }
+
+ // METHODS
+
+ // constructor - just pass on the owner array to the multiowned and
+ // the limit to daylimit
+ function Wallet(address[] _owners, uint _required, uint _daylimit)
+ multiowned(_owners, _required) daylimit(_daylimit) {
+ }
+
+ // kills the contract sending everything to `_to`.
+ function kill(address _to) onlymanyowners(sha3(msg.data)) external {
+ suicide(_to);
+ }
+
+ // gets called when no other function matches
+ function() payable {
+ // just being sent some cash?
+ if (msg.value > 0)
+ Deposit(msg.sender, msg.value);
+ }
+
+ // Outside-visible transact entry point. Executes transaction immediately if below daily spend limit.
+ // If not, goes into multisig process. We provide a hash on return to allow the sender to provide
+ // shortcuts for the other confirmations (allowing them to avoid replicating the _to, _value
+ // and _data arguments). They still get the option of using them if they want, anyways.
+ function execute(address _to, uint _value, bytes _data) external onlyowner returns (bytes32 o_hash) {
+ // first, take the opportunity to check that we're under the daily limit.
+ if ((_data.length == 0 && underLimit(_value)) || m_required == 1) {
+ // yes - just execute the call.
+ address created;
+ if (_to == 0) {
+ created = create(_value, _data);
+ } else {
+ if (!_to.call.value(_value)(_data))
+ throw;
+ }
+ SingleTransact(msg.sender, _value, _to, _data, created);
+ } else {
+ // determine our operation hash.
+ o_hash = sha3(msg.data, block.number);
+ // store if it's new
+ if (m_txs[o_hash].to == 0 && m_txs[o_hash].value == 0 && m_txs[o_hash].data.length == 0) {
+ m_txs[o_hash].to = _to;
+ m_txs[o_hash].value = _value;
+ m_txs[o_hash].data = _data;
+ }
+ if (!confirm(o_hash)) {
+ ConfirmationNeeded(o_hash, msg.sender, _value, _to, _data);
+ }
}
+ }
- // METHODS
-
- // constructor - just pass on the owner array to the multiowned and
- // the limit to daylimit
- function Wallet(address[] _owners, uint _required, uint _daylimit)
- multiowned(_owners, _required) daylimit(_daylimit) {
+ function create(uint _value, bytes _code) internal returns (address o_addr) {
+ assembly {
+ o_addr := create(_value, add(_code, 0x20), mload(_code))
+ jumpi(invalidJumpLabel, iszero(extcodesize(o_addr)))
}
+ }
- // kills the contract sending everything to `_to`.
- function kill(address _to) onlymanyowners(sha3(msg.data)) external {
- suicide(_to);
+ // confirm a transaction through just the hash. we use the previous transactions map, m_txs, in order
+ // to determine the body of the transaction from the hash provided.
+ function confirm(bytes32 _h) onlymanyowners(_h) returns (bool o_success) {
+ if (m_txs[_h].to != 0 || m_txs[_h].value != 0 || m_txs[_h].data.length != 0) {
+ address created;
+ if (m_txs[_h].to == 0) {
+ created = create(m_txs[_h].value, m_txs[_h].data);
+ } else {
+ if (!m_txs[_h].to.call.value(m_txs[_h].value)(m_txs[_h].data))
+ throw;
+ }
+
+ MultiTransact(msg.sender, _h, m_txs[_h].value, m_txs[_h].to, m_txs[_h].data, created);
+ delete m_txs[_h];
+ return true;
}
+ }
- // gets called when no other function matches
- function() payable {
- // just being sent some cash?
- if (msg.value > 0)
- Deposit(msg.sender, msg.value);
- }
+ // INTERNAL METHODS
- // Outside-visible transact entry point. Executes transaction immediately if below daily spend limit.
- // If not, goes into multisig process. We provide a hash on return to allow the sender to provide
- // shortcuts for the other confirmations (allowing them to avoid replicating the _to, _value
- // and _data arguments). They still get the option of using them if they want, anyways.
- function execute(address _to, uint _value, bytes _data) external onlyowner returns (bytes32 _r) {
- // first, take the opportunity to check that we're under the daily limit.
- if (underLimit(_value)) {
- SingleTransact(msg.sender, _value, _to, _data);
- // yes - just execute the call.
- _to.call.value(_value)(_data);
- return 0;
- }
- // determine our operation hash.
- _r = sha3(msg.data, block.number);
- if (!confirm(_r) && m_txs[_r].to == 0) {
- m_txs[_r].to = _to;
- m_txs[_r].value = _value;
- m_txs[_r].data = _data;
- ConfirmationNeeded(_r, msg.sender, _value, _to, _data);
- }
- }
+ function clearPending() internal {
+ uint length = m_pendingIndex.length;
+ for (uint i = 0; i < length; ++i)
+ delete m_txs[m_pendingIndex[i]];
+ super.clearPending();
+ }
- // confirm a transaction through just the hash. we use the previous transactions map, m_txs, in order
- // to determine the body of the transaction from the hash provided.
- function confirm(bytes32 _h) onlymanyowners(_h) returns (bool) {
- if (m_txs[_h].to != 0) {
- m_txs[_h].to.call.value(m_txs[_h].value)(m_txs[_h].data);
- MultiTransact(msg.sender, _h, m_txs[_h].value, m_txs[_h].to, m_txs[_h].data);
- delete m_txs[_h];
- return true;
- }
- }
+ // FIELDS
- // INTERNAL METHODS
-
- function clearPending() internal {
- uint length = m_pendingIndex.length;
- for (uint i = 0; i < length; ++i)
- delete m_txs[m_pendingIndex[i]];
- super.clearPending();
- }
-
- // FIELDS
-
- // pending transactions we have at present.
- mapping (bytes32 => Transaction) m_txs;
+ // pending transactions we have at present.
+ mapping (bytes32 => Transaction) m_txs;
}
diff --git a/js/src/dapps/tokenreg/Chip/chip.js b/js/src/dapps/tokenreg/Chip/chip.js
index 1fa16c774..7c19a671c 100644
--- a/js/src/dapps/tokenreg/Chip/chip.js
+++ b/js/src/dapps/tokenreg/Chip/chip.js
@@ -18,7 +18,7 @@ import React, { Component, PropTypes } from 'react';
import { Chip } from 'material-ui';
-import IdentityIcon from '../IdentityIcon' ;
+import IdentityIcon from '../IdentityIcon';
import styles from './chip.css';
diff --git a/js/src/modals/CreateWallet/WalletDetails/walletDetails.js b/js/src/modals/CreateWallet/WalletDetails/walletDetails.js
index 6b0ed7e1a..d3776e2cb 100644
--- a/js/src/modals/CreateWallet/WalletDetails/walletDetails.js
+++ b/js/src/modals/CreateWallet/WalletDetails/walletDetails.js
@@ -14,7 +14,6 @@
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see .
-import { omitBy } from 'lodash';
import React, { Component, PropTypes } from 'react';
import { FormattedMessage } from 'react-intl';
@@ -106,9 +105,6 @@ export default class WalletDetails extends Component {
renderMultisigDetails () {
const { accounts, wallet, errors } = this.props;
- // Wallets cannot create contracts
- const _accounts = omitBy(accounts, (a) => a.wallet);
-
return (