@aeternity/aepp-sdk 9.0.1 → 10.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aepp-sdk.browser-script.js +1 -1
- package/dist/aepp-sdk.browser-script.js.LICENSE.txt +0 -9
- package/dist/aepp-sdk.browser-script.js.map +1 -1
- package/dist/aepp-sdk.browser.js +1 -1
- package/dist/aepp-sdk.browser.js.map +1 -1
- package/dist/aepp-sdk.js +1 -1
- package/dist/aepp-sdk.js.map +1 -1
- package/es/account/base.js +30 -122
- package/es/account/base.js.map +1 -1
- package/es/account/memory.js +17 -19
- package/es/account/memory.js.map +1 -1
- package/es/account/multiple.js +73 -164
- package/es/account/multiple.js.map +1 -1
- package/es/ae/aens.js +164 -599
- package/es/ae/aens.js.map +1 -1
- package/es/ae/contract.js +82 -759
- package/es/ae/contract.js.map +1 -1
- package/es/ae/index.js +78 -315
- package/es/ae/index.js.map +1 -1
- package/es/ae/oracle.js +130 -498
- package/es/ae/oracle.js.map +1 -1
- package/es/chain/index.js +1 -1
- package/es/chain/index.js.map +1 -1
- package/es/chain/node.js +288 -1008
- package/es/chain/node.js.map +1 -1
- package/es/channel/handlers.js +597 -1086
- package/es/channel/handlers.js.map +1 -1
- package/es/channel/index.js +203 -451
- package/es/channel/index.js.map +1 -1
- package/es/channel/internal.js +129 -301
- package/es/channel/internal.js.map +1 -1
- package/es/contract/aci/index.js +319 -480
- package/es/contract/aci/index.js.map +1 -1
- package/es/contract/aci/transformation.js +35 -711
- package/es/contract/aci/transformation.js.map +1 -1
- package/es/contract/compiler.js +129 -203
- package/es/contract/compiler.js.map +1 -1
- package/es/contract/ga/helpers.js +16 -114
- package/es/contract/ga/helpers.js.map +1 -1
- package/es/contract/ga/index.js +101 -242
- package/es/contract/ga/index.js.map +1 -1
- package/es/contract/index.js +1 -1
- package/es/contract/index.js.map +1 -1
- package/es/index.js +1 -2
- package/es/index.js.map +1 -1
- package/es/node-pool/index.js +54 -73
- package/es/node-pool/index.js.map +1 -1
- package/es/node.js +56 -157
- package/es/node.js.map +1 -1
- package/es/other.d.ts +1 -1
- package/es/tx/builder/helpers.js +38 -75
- package/es/tx/builder/helpers.js.map +1 -1
- package/es/tx/builder/index.js +196 -294
- package/es/tx/builder/index.js.map +1 -1
- package/es/tx/builder/schema.js +577 -459
- package/es/tx/builder/schema.js.map +1 -1
- package/es/tx/index.js +1 -1
- package/es/tx/index.js.map +1 -1
- package/es/tx/tx-object.js +105 -132
- package/es/tx/tx-object.js.map +1 -1
- package/es/tx/tx.js +808 -1628
- package/es/tx/tx.js.map +1 -1
- package/es/tx/validator.js +132 -268
- package/es/tx/validator.js.map +1 -1
- package/es/utils/aepp-wallet-communication/connection/browser-runtime.js +17 -21
- package/es/utils/aepp-wallet-communication/connection/browser-runtime.js.map +1 -1
- package/es/utils/aepp-wallet-communication/connection/browser-window-message.js +38 -74
- package/es/utils/aepp-wallet-communication/connection/browser-window-message.js.map +1 -1
- package/es/utils/aepp-wallet-communication/content-script-bridge.js +14 -15
- package/es/utils/aepp-wallet-communication/content-script-bridge.js.map +1 -1
- package/es/utils/aepp-wallet-communication/helpers.js +60 -105
- package/es/utils/aepp-wallet-communication/helpers.js.map +1 -1
- package/es/utils/aepp-wallet-communication/rpc/aepp-rpc.js +179 -510
- package/es/utils/aepp-wallet-communication/rpc/aepp-rpc.js.map +1 -1
- package/es/utils/aepp-wallet-communication/rpc/rpc-client.js +70 -89
- package/es/utils/aepp-wallet-communication/rpc/rpc-client.js.map +1 -1
- package/es/utils/aepp-wallet-communication/rpc/wallet-rpc.js +353 -600
- package/es/utils/aepp-wallet-communication/rpc/wallet-rpc.js.map +1 -1
- package/es/utils/aepp-wallet-communication/schema.js +43 -39
- package/es/utils/aepp-wallet-communication/schema.js.map +1 -1
- package/es/utils/aepp-wallet-communication/wallet-detector.js +32 -58
- package/es/utils/aepp-wallet-communication/wallet-detector.js.map +1 -1
- package/es/utils/amount-formatter.js +41 -61
- package/es/utils/amount-formatter.js.map +1 -1
- package/es/utils/async-init.js +28 -64
- package/es/utils/async-init.js.map +1 -1
- package/es/utils/bignumber.js +3 -11
- package/es/utils/bignumber.js.map +1 -1
- package/es/utils/bytes.js +5 -9
- package/es/utils/bytes.js.map +1 -1
- package/es/utils/crypto.js +47 -62
- package/es/utils/crypto.js.map +1 -1
- package/es/utils/hd-wallet.js +45 -81
- package/es/utils/hd-wallet.js.map +1 -1
- package/es/utils/json-big.js +16 -49
- package/es/utils/json-big.js.map +1 -1
- package/es/utils/keystore.js +81 -246
- package/es/utils/keystore.js.map +1 -1
- package/es/utils/mptree.js +88 -134
- package/es/utils/mptree.js.map +1 -1
- package/es/utils/other.js +10 -60
- package/es/utils/other.js.map +1 -1
- package/es/utils/semver-satisfies.js +9 -28
- package/es/utils/semver-satisfies.js.map +1 -1
- package/es/utils/string.js +4 -13
- package/es/utils/string.js.map +1 -1
- package/es/utils/swagger.js +85 -224
- package/es/utils/swagger.js.map +1 -1
- package/package.json +44 -40
- package/src/account/multiple.js +18 -19
- package/src/ae/aens.js +25 -21
- package/src/ae/contract.js +32 -163
- package/src/ae/index.js +3 -3
- package/src/ae/oracle.js +18 -14
- package/src/chain/node.js +2 -4
- package/src/channel/handlers.js +0 -1
- package/src/channel/index.js +4 -5
- package/src/contract/aci/index.js +221 -102
- package/src/contract/aci/transformation.js +30 -422
- package/src/contract/compiler.js +45 -4
- package/src/contract/ga/helpers.js +1 -8
- package/src/contract/ga/index.js +13 -11
- package/src/index.js +0 -2
- package/src/node-pool/index.js +21 -12
- package/src/node.js +22 -26
- package/src/tx/builder/index.js +2 -1
- package/src/tx/builder/schema.js +2 -1
- package/src/tx/tx.js +147 -143
- package/src/tx/validator.js +9 -7
- package/src/utils/aepp-wallet-communication/rpc/aepp-rpc.js +1 -3
- package/src/utils/aepp-wallet-communication/rpc/wallet-rpc.js +3 -3
- package/src/utils/aepp-wallet-communication/schema.js +1 -3
- package/src/utils/bignumber.ts +2 -1
- package/src/utils/other.ts +1 -1
- package/src/utils/semver-satisfies.ts +1 -1
- package/src/utils/swagger.js +14 -7
- package/src/contract/aci/helpers.js +0 -140
package/es/tx/validator.js
CHANGED
|
@@ -1,29 +1,3 @@
|
|
|
1
|
-
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
|
|
2
|
-
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
|
|
3
|
-
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
|
|
4
|
-
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
|
|
5
|
-
import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
|
|
6
|
-
import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
|
|
7
|
-
import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
|
|
8
|
-
import _slicedToArray from "@babel/runtime-corejs3/helpers/slicedToArray";
|
|
9
|
-
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
|
|
10
|
-
import _toConsumableArray from "@babel/runtime-corejs3/helpers/toConsumableArray";
|
|
11
|
-
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
|
|
12
|
-
|
|
13
|
-
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) { symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
14
|
-
|
|
15
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context19; _forEachInstanceProperty(_context19 = ownKeys(Object(source), true)).call(_context19, function (key) { _defineProperty(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context20; _forEachInstanceProperty(_context20 = ownKeys(Object(source))).call(_context20, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
16
|
-
|
|
17
|
-
import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
|
|
18
|
-
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
|
|
19
|
-
import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes";
|
|
20
|
-
import _someInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/some";
|
|
21
|
-
import _Object$entries from "@babel/runtime-corejs3/core-js-stable/object/entries";
|
|
22
|
-
import _JSON$stringify from "@babel/runtime-corejs3/core-js-stable/json/stringify";
|
|
23
|
-
import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
|
|
24
|
-
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
|
|
25
|
-
import _Promise from "@babel/runtime-corejs3/core-js-stable/promise";
|
|
26
|
-
import _flatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/flat";
|
|
27
1
|
import { verify, hash } from '../utils/crypto';
|
|
28
2
|
import { encode, decode } from './builder/helpers';
|
|
29
3
|
import BigNumber from 'bignumber.js';
|
|
@@ -36,104 +10,47 @@ import { calculateFee, unpackTx } from './builder';
|
|
|
36
10
|
* @example import { verifyTransaction } from '@aeternity/aepp-sdk'
|
|
37
11
|
*/
|
|
38
12
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
return _context2.abrupt("return", []);
|
|
79
|
-
|
|
80
|
-
case 12:
|
|
81
|
-
return _context2.abrupt("return", [{
|
|
82
|
-
message: 'Signature cannot be verified, please ensure that you transaction have' + ' the correct prefix and the correct private key for the sender address',
|
|
83
|
-
key: 'InvalidSignature',
|
|
84
|
-
checkedKeys: ['encodedTx', 'signatures']
|
|
85
|
-
}]);
|
|
86
|
-
|
|
87
|
-
case 13:
|
|
88
|
-
case "end":
|
|
89
|
-
return _context2.stop();
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}, _callee);
|
|
93
|
-
}));
|
|
94
|
-
|
|
95
|
-
return function (_x, _x2) {
|
|
96
|
-
return _ref3.apply(this, arguments);
|
|
97
|
-
};
|
|
98
|
-
}(), /*#__PURE__*/function () {
|
|
99
|
-
var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(_ref4, _ref5) {
|
|
100
|
-
var _context3;
|
|
101
|
-
|
|
102
|
-
var encodedTx, tx, node, parentTxTypes, txType;
|
|
103
|
-
return _regeneratorRuntime.wrap(function _callee2$(_context4) {
|
|
104
|
-
while (1) {
|
|
105
|
-
switch (_context4.prev = _context4.next) {
|
|
106
|
-
case 0:
|
|
107
|
-
encodedTx = _ref4.encodedTx, tx = _ref4.tx;
|
|
108
|
-
node = _ref5.node, parentTxTypes = _ref5.parentTxTypes, txType = _ref5.txType;
|
|
109
|
-
|
|
110
|
-
if (!((encodedTx !== null && encodedTx !== void 0 ? encodedTx : tx) === undefined)) {
|
|
111
|
-
_context4.next = 4;
|
|
112
|
-
break;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
return _context4.abrupt("return", []);
|
|
116
|
-
|
|
117
|
-
case 4:
|
|
118
|
-
return _context4.abrupt("return", verifyTransaction(encode((encodedTx !== null && encodedTx !== void 0 ? encodedTx : tx).rlpEncoded, 'tx'), node, _concatInstanceProperty(_context3 = []).call(_context3, _toConsumableArray(parentTxTypes), [txType])));
|
|
119
|
-
|
|
120
|
-
case 5:
|
|
121
|
-
case "end":
|
|
122
|
-
return _context4.stop();
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}, _callee2);
|
|
126
|
-
}));
|
|
127
|
-
|
|
128
|
-
return function (_x3, _x4) {
|
|
129
|
-
return _ref6.apply(this, arguments);
|
|
130
|
-
};
|
|
131
|
-
}(), function (tx, _ref7) {
|
|
132
|
-
var _context5;
|
|
133
|
-
|
|
134
|
-
var txType = _ref7.txType;
|
|
13
|
+
const validators = [async (_ref, _ref2) => {
|
|
14
|
+
let {
|
|
15
|
+
encodedTx,
|
|
16
|
+
signatures
|
|
17
|
+
} = _ref;
|
|
18
|
+
let {
|
|
19
|
+
account,
|
|
20
|
+
node,
|
|
21
|
+
parentTxTypes
|
|
22
|
+
} = _ref2;
|
|
23
|
+
if ((encodedTx ?? signatures) === undefined) return [];
|
|
24
|
+
if (signatures.length !== 1) return []; // TODO: Support multisignature?
|
|
25
|
+
|
|
26
|
+
const prefix = Buffer.from([node.nodeNetworkId, ...(parentTxTypes.includes(TX_TYPE.payingFor) ? ['inner_tx'] : [])].join('-'));
|
|
27
|
+
const txWithNetworkId = Buffer.concat([prefix, encodedTx.rlpEncoded]);
|
|
28
|
+
const txHashWithNetworkId = Buffer.concat([prefix, hash(encodedTx.rlpEncoded)]);
|
|
29
|
+
const decodedPub = decode(account.id, 'ak');
|
|
30
|
+
if (verify(txWithNetworkId, signatures[0], decodedPub) || verify(txHashWithNetworkId, signatures[0], decodedPub)) return [];
|
|
31
|
+
return [{
|
|
32
|
+
message: 'Signature cannot be verified, please ensure that you transaction have' + ' the correct prefix and the correct private key for the sender address',
|
|
33
|
+
key: 'InvalidSignature',
|
|
34
|
+
checkedKeys: ['encodedTx', 'signatures']
|
|
35
|
+
}];
|
|
36
|
+
}, async (_ref3, _ref4) => {
|
|
37
|
+
let {
|
|
38
|
+
encodedTx,
|
|
39
|
+
tx
|
|
40
|
+
} = _ref3;
|
|
41
|
+
let {
|
|
42
|
+
node,
|
|
43
|
+
parentTxTypes,
|
|
44
|
+
txType
|
|
45
|
+
} = _ref4;
|
|
46
|
+
if ((encodedTx ?? tx) === undefined) return [];
|
|
47
|
+
return verifyTransaction(encode((encodedTx ?? tx).rlpEncoded, 'tx'), node, [...parentTxTypes, txType]);
|
|
48
|
+
}, (tx, _ref5) => {
|
|
49
|
+
let {
|
|
50
|
+
txType
|
|
51
|
+
} = _ref5;
|
|
135
52
|
if (tx.fee === undefined) return [];
|
|
136
|
-
|
|
53
|
+
const minFee = calculateFee(0, txType, {
|
|
137
54
|
gas: +tx.gas || 0,
|
|
138
55
|
params: tx,
|
|
139
56
|
showWarning: false,
|
|
@@ -141,104 +58,104 @@ var validators = [/*#__PURE__*/function () {
|
|
|
141
58
|
});
|
|
142
59
|
if (new BigNumber(minFee).lte(tx.fee)) return [];
|
|
143
60
|
return [{
|
|
144
|
-
message:
|
|
61
|
+
message: `Fee ${tx.fee} is too low, minimum fee for this transaction is ${minFee}`,
|
|
145
62
|
key: 'InsufficientFee',
|
|
146
63
|
checkedKeys: ['fee']
|
|
147
64
|
}];
|
|
148
|
-
},
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
65
|
+
}, (_ref6, _ref7) => {
|
|
66
|
+
let {
|
|
67
|
+
ttl
|
|
68
|
+
} = _ref6;
|
|
69
|
+
let {
|
|
70
|
+
height
|
|
71
|
+
} = _ref7;
|
|
153
72
|
if (ttl === undefined) return [];
|
|
154
73
|
ttl = +ttl;
|
|
155
74
|
if (ttl === 0 || ttl >= height) return [];
|
|
156
75
|
return [{
|
|
157
|
-
message:
|
|
76
|
+
message: `TTL ${ttl} is already expired, current height is ${height}`,
|
|
158
77
|
key: 'ExpiredTTL',
|
|
159
78
|
checkedKeys: ['ttl']
|
|
160
79
|
}];
|
|
161
|
-
},
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
80
|
+
}, (_ref8, _ref9) => {
|
|
81
|
+
let {
|
|
82
|
+
amount,
|
|
83
|
+
fee,
|
|
84
|
+
nameFee,
|
|
85
|
+
tx
|
|
86
|
+
} = _ref8;
|
|
87
|
+
let {
|
|
88
|
+
account,
|
|
89
|
+
parentTxTypes,
|
|
90
|
+
txType
|
|
91
|
+
} = _ref9;
|
|
92
|
+
if ((amount ?? fee ?? nameFee) === undefined) return [];
|
|
93
|
+
const cost = new BigNumber(fee).plus(nameFee || 0).plus(amount || 0).plus(txType === TX_TYPE.payingFor ? tx.tx.encodedTx.tx.fee : 0).minus(parentTxTypes.includes(TX_TYPE.payingFor) ? fee : 0);
|
|
173
94
|
if (cost.lte(account.balance)) return [];
|
|
174
95
|
return [{
|
|
175
|
-
message:
|
|
96
|
+
message: `Account balance ${account.balance} is not enough to execute the transaction that costs ${cost.toFixed()}`,
|
|
176
97
|
key: 'InsufficientBalance',
|
|
177
98
|
checkedKeys: ['amount', 'fee', 'nameFee']
|
|
178
99
|
}];
|
|
179
|
-
},
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
100
|
+
}, (_ref10, _ref11) => {
|
|
101
|
+
let {
|
|
102
|
+
nonce
|
|
103
|
+
} = _ref10;
|
|
104
|
+
let {
|
|
105
|
+
account,
|
|
106
|
+
parentTxTypes
|
|
107
|
+
} = _ref11;
|
|
108
|
+
if (nonce === undefined || parentTxTypes.includes(TX_TYPE.gaMeta)) return [];
|
|
186
109
|
nonce = +nonce;
|
|
187
|
-
|
|
110
|
+
const validNonce = account.nonce + 1;
|
|
188
111
|
if (nonce === validNonce) return [];
|
|
189
|
-
return [
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
112
|
+
return [{ ...(nonce < validNonce ? {
|
|
113
|
+
message: `Nonce ${nonce} is already used, valid nonce is ${validNonce}`,
|
|
114
|
+
key: 'NonceAlreadyUsed'
|
|
115
|
+
} : {
|
|
116
|
+
message: `Nonce ${nonce} is too high, valid nonce is ${validNonce}`,
|
|
117
|
+
key: 'NonceHigh'
|
|
118
|
+
}),
|
|
196
119
|
checkedKeys: ['nonce']
|
|
197
|
-
}
|
|
198
|
-
},
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
120
|
+
}];
|
|
121
|
+
}, _ref12 => {
|
|
122
|
+
let {
|
|
123
|
+
gasPrice
|
|
124
|
+
} = _ref12;
|
|
202
125
|
if (gasPrice === undefined) return [];
|
|
203
126
|
if (gasPrice >= MIN_GAS_PRICE) return [];
|
|
204
127
|
return [{
|
|
205
|
-
message:
|
|
128
|
+
message: `Gas price ${gasPrice} must be bigger then ${MIN_GAS_PRICE}`,
|
|
206
129
|
key: 'MinGasPrice',
|
|
207
130
|
checkedKeys: ['gasPrice']
|
|
208
131
|
}];
|
|
209
|
-
},
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
132
|
+
}, (_ref13, _ref14) => {
|
|
133
|
+
let {
|
|
134
|
+
ctVersion,
|
|
135
|
+
abiVersion
|
|
136
|
+
} = _ref13;
|
|
137
|
+
let {
|
|
138
|
+
txType,
|
|
139
|
+
node
|
|
140
|
+
} = _ref14;
|
|
141
|
+
const {
|
|
142
|
+
consensusProtocolVersion
|
|
143
|
+
} = node.getNodeInfo();
|
|
144
|
+
const protocol = PROTOCOL_VM_ABI[consensusProtocolVersion];
|
|
145
|
+
if (!protocol) throw new Error(`Unsupported protocol: ${consensusProtocolVersion}`); // If not contract create tx
|
|
222
146
|
|
|
223
147
|
if (!ctVersion) ctVersion = {
|
|
224
|
-
abiVersion
|
|
148
|
+
abiVersion
|
|
225
149
|
};
|
|
226
|
-
|
|
150
|
+
const txProtocol = protocol[txType];
|
|
227
151
|
if (!txProtocol) return [];
|
|
228
152
|
|
|
229
|
-
if (
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
var _ref19 = _slicedToArray(_ref18, 2),
|
|
233
|
-
key = _ref19[0],
|
|
234
|
-
value = _ref19[1];
|
|
235
|
-
|
|
236
|
-
return !_includesInstanceProperty(_context12 = txProtocol[key]).call(_context12, +value);
|
|
153
|
+
if (Object.entries(ctVersion).some(_ref15 => {
|
|
154
|
+
let [key, value] = _ref15;
|
|
155
|
+
return !txProtocol[key].includes(+value);
|
|
237
156
|
})) {
|
|
238
|
-
var _context13;
|
|
239
|
-
|
|
240
157
|
return [{
|
|
241
|
-
message:
|
|
158
|
+
message: `ABI/VM version ${JSON.stringify(ctVersion)} is wrong, supported is: ${JSON.stringify(txProtocol)}`,
|
|
242
159
|
key: 'VmAndAbiVersionMismatch',
|
|
243
160
|
checkedKeys: ['ctVersion', 'abiVersion']
|
|
244
161
|
}];
|
|
@@ -247,17 +164,7 @@ var validators = [/*#__PURE__*/function () {
|
|
|
247
164
|
return [];
|
|
248
165
|
}];
|
|
249
166
|
|
|
250
|
-
|
|
251
|
-
var _context14, _context15, _context16;
|
|
252
|
-
|
|
253
|
-
return _mapInstanceProperty(_context14 = _filterInstanceProperty(_context15 = _mapInstanceProperty(_context16 = ['senderId', 'accountId', 'ownerId', 'callerId', 'oracleId', 'fromId', 'initiator', 'gaId', 'payerId']).call(_context16, function (key) {
|
|
254
|
-
return tx[key];
|
|
255
|
-
})).call(_context15, function (a) {
|
|
256
|
-
return a;
|
|
257
|
-
})).call(_context14, function (a) {
|
|
258
|
-
return a.replace(/^ok_/, 'ak_');
|
|
259
|
-
})[0];
|
|
260
|
-
};
|
|
167
|
+
const getSenderAddress = tx => ['senderId', 'accountId', 'ownerId', 'callerId', 'oracleId', 'fromId', 'initiator', 'gaId', 'payerId'].map(key => tx[key]).filter(a => a).map(a => a.replace(/^ok_/, 'ak_'))[0];
|
|
261
168
|
/**
|
|
262
169
|
* Transaction Validator
|
|
263
170
|
* This function validates some of transaction properties,
|
|
@@ -273,72 +180,29 @@ var getSenderAddress = function getSenderAddress(tx) {
|
|
|
273
180
|
*/
|
|
274
181
|
|
|
275
182
|
|
|
276
|
-
export default function verifyTransaction(
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
_unpackTx = unpackTx(transaction), tx = _unpackTx.tx, txType = _unpackTx.txType;
|
|
301
|
-
address = (_getSenderAddress = getSenderAddress(tx)) !== null && _getSenderAddress !== void 0 ? _getSenderAddress : txType === TX_TYPE.signed ? getSenderAddress(tx.encodedTx.tx) : null;
|
|
302
|
-
_context18.next = 5;
|
|
303
|
-
return _Promise.all([address && node.api.getAccountByPubkey(address)["catch"](function () {
|
|
304
|
-
return {
|
|
305
|
-
id: address,
|
|
306
|
-
balance: new BigNumber(0),
|
|
307
|
-
nonce: 0
|
|
308
|
-
};
|
|
309
|
-
}), node.api.getCurrentKeyBlockHeight().then(function (_ref20) {
|
|
310
|
-
var height = _ref20.height;
|
|
311
|
-
return height;
|
|
312
|
-
})]);
|
|
313
|
-
|
|
314
|
-
case 5:
|
|
315
|
-
_yield$Promise$all = _context18.sent;
|
|
316
|
-
_yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2);
|
|
317
|
-
account = _yield$Promise$all2[0];
|
|
318
|
-
height = _yield$Promise$all2[1];
|
|
319
|
-
_context18.t0 = _flatInstanceProperty;
|
|
320
|
-
_context18.next = 12;
|
|
321
|
-
return _Promise.all(_mapInstanceProperty(validators).call(validators, function (v) {
|
|
322
|
-
return v(tx, {
|
|
323
|
-
txType: txType,
|
|
324
|
-
node: node,
|
|
325
|
-
account: account,
|
|
326
|
-
height: height,
|
|
327
|
-
parentTxTypes: parentTxTypes
|
|
328
|
-
});
|
|
329
|
-
}));
|
|
330
|
-
|
|
331
|
-
case 12:
|
|
332
|
-
_context18.t1 = _context17 = _context18.sent;
|
|
333
|
-
return _context18.abrupt("return", (0, _context18.t0)(_context18.t1).call(_context17));
|
|
334
|
-
|
|
335
|
-
case 14:
|
|
336
|
-
case "end":
|
|
337
|
-
return _context18.stop();
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
}, _callee3);
|
|
341
|
-
}));
|
|
342
|
-
return _verifyTransaction.apply(this, arguments);
|
|
183
|
+
export default async function verifyTransaction(transaction, node) {
|
|
184
|
+
let parentTxTypes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
185
|
+
const {
|
|
186
|
+
tx,
|
|
187
|
+
txType
|
|
188
|
+
} = unpackTx(transaction);
|
|
189
|
+
const address = getSenderAddress(tx) ?? (txType === TX_TYPE.signed ? getSenderAddress(tx.encodedTx.tx) : null);
|
|
190
|
+
const [account, height] = await Promise.all([address && node.api.getAccountByPubkey(address).catch(() => ({
|
|
191
|
+
id: address,
|
|
192
|
+
balance: new BigNumber(0),
|
|
193
|
+
nonce: 0
|
|
194
|
+
})), node.api.getCurrentKeyBlockHeight().then(_ref16 => {
|
|
195
|
+
let {
|
|
196
|
+
height
|
|
197
|
+
} = _ref16;
|
|
198
|
+
return height;
|
|
199
|
+
})]);
|
|
200
|
+
return (await Promise.all(validators.map(v => v(tx, {
|
|
201
|
+
txType,
|
|
202
|
+
node,
|
|
203
|
+
account,
|
|
204
|
+
height,
|
|
205
|
+
parentTxTypes
|
|
206
|
+
})))).flat();
|
|
343
207
|
}
|
|
344
208
|
//# sourceMappingURL=validator.js.map
|
package/es/tx/validator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tx/validator.js"],"names":["verify","hash","encode","decode","BigNumber","MIN_GAS_PRICE","PROTOCOL_VM_ABI","TX_TYPE","calculateFee","unpackTx","validators","encodedTx","signatures","account","node","parentTxTypes","undefined","length","prefix","Buffer","from","nodeNetworkId","payingFor","join","txWithNetworkId","rlpEncoded","txHashWithNetworkId","decodedPub","id","message","key","checkedKeys","tx","txType","verifyTransaction","fee","minFee","gas","params","showWarning","vsn","VSN","lte","ttl","height","amount","nameFee","cost","plus","minus","balance","toFixed","nonce","gaMeta","validNonce","gasPrice","ctVersion","abiVersion","getNodeInfo","consensusProtocolVersion","protocol","Error","txProtocol","value","getSenderAddress","a","replace","transaction","address","signed","all","api","getAccountByPubkey","getCurrentKeyBlockHeight","then","v"],"mappings":"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","sourcesContent":["import { verify, hash } from '../utils/crypto'\nimport { encode, decode } from './builder/helpers'\n\nimport BigNumber from 'bignumber.js'\nimport { MIN_GAS_PRICE, PROTOCOL_VM_ABI, TX_TYPE } from './builder/schema'\nimport { calculateFee, unpackTx } from './builder'\n\n/**\n * Transaction validator\n * @module @aeternity/aepp-sdk/es/tx/validator\n * @export verifyTransaction\n * @example import { verifyTransaction } from '@aeternity/aepp-sdk'\n */\n\nconst validators = [\n async ({ encodedTx, signatures }, { account, node, parentTxTypes }) => {\n if ((encodedTx ?? signatures) === undefined) return []\n if (signatures.length !== 1) return [] // TODO: Support multisignature?\n const prefix = Buffer.from([\n node.nodeNetworkId,\n ...parentTxTypes.includes(TX_TYPE.payingFor) ? ['inner_tx'] : []\n ].join('-'))\n const txWithNetworkId = Buffer.concat([prefix, encodedTx.rlpEncoded])\n const txHashWithNetworkId = Buffer.concat([prefix, hash(encodedTx.rlpEncoded)])\n const decodedPub = decode(account.id, 'ak')\n if (verify(txWithNetworkId, signatures[0], decodedPub) ||\n verify(txHashWithNetworkId, signatures[0], decodedPub)) return []\n return [{\n message: 'Signature cannot be verified, please ensure that you transaction have' +\n ' the correct prefix and the correct private key for the sender address',\n key: 'InvalidSignature',\n checkedKeys: ['encodedTx', 'signatures']\n }]\n },\n async ({ encodedTx, tx }, { node, parentTxTypes, txType }) => {\n if ((encodedTx ?? tx) === undefined) return []\n return verifyTransaction(\n encode((encodedTx ?? tx).rlpEncoded, 'tx'),\n node,\n [...parentTxTypes, txType]\n )\n },\n (tx, { txType }) => {\n if (tx.fee === undefined) return []\n const minFee = calculateFee(0, txType, {\n gas: +tx.gas || 0, params: tx, showWarning: false, vsn: tx.VSN\n })\n if (new BigNumber(minFee).lte(tx.fee)) return []\n return [{\n message: `Fee ${tx.fee} is too low, minimum fee for this transaction is ${minFee}`,\n key: 'InsufficientFee',\n checkedKeys: ['fee']\n }]\n },\n ({ ttl }, { height }) => {\n if (ttl === undefined) return []\n ttl = +ttl\n if (ttl === 0 || ttl >= height) return []\n return [{\n message: `TTL ${ttl} is already expired, current height is ${height}`,\n key: 'ExpiredTTL',\n checkedKeys: ['ttl']\n }]\n },\n ({ amount, fee, nameFee, tx }, { account, parentTxTypes, txType }) => {\n if ((amount ?? fee ?? nameFee) === undefined) return []\n const cost = new BigNumber(fee).plus(nameFee || 0).plus(amount || 0)\n .plus(txType === TX_TYPE.payingFor ? tx.tx.encodedTx.tx.fee : 0)\n .minus(parentTxTypes.includes(TX_TYPE.payingFor) ? fee : 0)\n if (cost.lte(account.balance)) return []\n return [{\n message: `Account balance ${account.balance} is not enough to execute the transaction that costs ${cost.toFixed()}`,\n key: 'InsufficientBalance',\n checkedKeys: ['amount', 'fee', 'nameFee']\n }]\n },\n ({ nonce }, { account, parentTxTypes }) => {\n if (nonce === undefined || parentTxTypes.includes(TX_TYPE.gaMeta)) return []\n nonce = +nonce\n const validNonce = account.nonce + 1\n if (nonce === validNonce) return []\n return [{\n ...nonce < validNonce ? {\n message: `Nonce ${nonce} is already used, valid nonce is ${validNonce}`,\n key: 'NonceAlreadyUsed'\n } : {\n message: `Nonce ${nonce} is too high, valid nonce is ${validNonce}`,\n key: 'NonceHigh'\n },\n checkedKeys: ['nonce']\n }]\n },\n ({ gasPrice }) => {\n if (gasPrice === undefined) return []\n if (gasPrice >= MIN_GAS_PRICE) return []\n return [{\n message: `Gas price ${gasPrice} must be bigger then ${MIN_GAS_PRICE}`,\n key: 'MinGasPrice',\n checkedKeys: ['gasPrice']\n }]\n },\n ({ ctVersion, abiVersion }, { txType, node }) => {\n const { consensusProtocolVersion } = node.getNodeInfo()\n const protocol = PROTOCOL_VM_ABI[consensusProtocolVersion]\n if (!protocol) throw new Error(`Unsupported protocol: ${consensusProtocolVersion}`)\n // If not contract create tx\n if (!ctVersion) ctVersion = { abiVersion }\n const txProtocol = protocol[txType]\n if (!txProtocol) return []\n if (Object.entries(ctVersion).some(([key, value]) => !txProtocol[key].includes(+value))) {\n return [{\n message: `ABI/VM version ${JSON.stringify(ctVersion)} is wrong, supported is: ${JSON.stringify(txProtocol)}`,\n key: 'VmAndAbiVersionMismatch',\n checkedKeys: ['ctVersion', 'abiVersion']\n }]\n }\n return []\n }\n]\n\nconst getSenderAddress = tx => [\n 'senderId', 'accountId', 'ownerId', 'callerId',\n 'oracleId', 'fromId', 'initiator', 'gaId', 'payerId'\n]\n .map(key => tx[key])\n .filter(a => a)\n .map(a => a.replace(/^ok_/, 'ak_'))[0]\n\n/**\n * Transaction Validator\n * This function validates some of transaction properties,\n * to make sure it can be posted it to the chain\n * @function\n * @alias module:@aeternity/aepp-sdk/es/tx/validator\n * @rtype (tx: String, node) => void\n * @param {String} transaction Base64Check-encoded transaction\n * @param {Object} node Node to validate transaction against\n * @param {String[]} [parentTxTypes] Types of parent transactions\n * @return {Promise<Object[]>} Array with verification errors\n * @example const errors = await verifyTransaction(transaction, node)\n */\nexport default async function verifyTransaction (transaction, node, parentTxTypes = []) {\n const { tx, txType } = unpackTx(transaction)\n\n const address = getSenderAddress(tx) ??\n (txType === TX_TYPE.signed ? getSenderAddress(tx.encodedTx.tx) : null)\n const [account, height] = await Promise.all([\n address && node.api.getAccountByPubkey(address).catch(() => ({\n id: address,\n balance: new BigNumber(0),\n nonce: 0\n })),\n node.api.getCurrentKeyBlockHeight().then(({ height }) => height)\n ])\n\n return (await Promise.all(\n validators.map(v => v(tx, { txType, node, account, height, parentTxTypes })))\n ).flat()\n}\n"],"file":"validator.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/tx/validator.js"],"names":["verify","hash","encode","decode","BigNumber","MIN_GAS_PRICE","PROTOCOL_VM_ABI","TX_TYPE","calculateFee","unpackTx","validators","encodedTx","signatures","account","node","parentTxTypes","undefined","length","prefix","Buffer","from","nodeNetworkId","includes","payingFor","join","txWithNetworkId","concat","rlpEncoded","txHashWithNetworkId","decodedPub","id","message","key","checkedKeys","tx","txType","verifyTransaction","fee","minFee","gas","params","showWarning","vsn","VSN","lte","ttl","height","amount","nameFee","cost","plus","minus","balance","toFixed","nonce","gaMeta","validNonce","gasPrice","ctVersion","abiVersion","consensusProtocolVersion","getNodeInfo","protocol","Error","txProtocol","Object","entries","some","value","JSON","stringify","getSenderAddress","map","filter","a","replace","transaction","address","signed","Promise","all","api","getAccountByPubkey","catch","getCurrentKeyBlockHeight","then","v","flat"],"mappings":"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","sourcesContent":["import { verify, hash } from '../utils/crypto'\nimport { encode, decode } from './builder/helpers'\n\nimport BigNumber from 'bignumber.js'\nimport { MIN_GAS_PRICE, PROTOCOL_VM_ABI, TX_TYPE } from './builder/schema'\nimport { calculateFee, unpackTx } from './builder'\n\n/**\n * Transaction validator\n * @module @aeternity/aepp-sdk/es/tx/validator\n * @export verifyTransaction\n * @example import { verifyTransaction } from '@aeternity/aepp-sdk'\n */\n\nconst validators = [\n async ({ encodedTx, signatures }, { account, node, parentTxTypes }) => {\n if ((encodedTx ?? signatures) === undefined) return []\n if (signatures.length !== 1) return [] // TODO: Support multisignature?\n const prefix = Buffer.from([\n node.nodeNetworkId,\n ...parentTxTypes.includes(TX_TYPE.payingFor) ? ['inner_tx'] : []\n ].join('-'))\n const txWithNetworkId = Buffer.concat([prefix, encodedTx.rlpEncoded])\n const txHashWithNetworkId = Buffer.concat([prefix, hash(encodedTx.rlpEncoded)])\n const decodedPub = decode(account.id, 'ak')\n if (verify(txWithNetworkId, signatures[0], decodedPub) ||\n verify(txHashWithNetworkId, signatures[0], decodedPub)) return []\n return [{\n message: 'Signature cannot be verified, please ensure that you transaction have' +\n ' the correct prefix and the correct private key for the sender address',\n key: 'InvalidSignature',\n checkedKeys: ['encodedTx', 'signatures']\n }]\n },\n async ({ encodedTx, tx }, { node, parentTxTypes, txType }) => {\n if ((encodedTx ?? tx) === undefined) return []\n return verifyTransaction(\n encode((encodedTx ?? tx).rlpEncoded, 'tx'),\n node,\n [...parentTxTypes, txType]\n )\n },\n (tx, { txType }) => {\n if (tx.fee === undefined) return []\n const minFee = calculateFee(0, txType, {\n gas: +tx.gas || 0, params: tx, showWarning: false, vsn: tx.VSN\n })\n if (new BigNumber(minFee).lte(tx.fee)) return []\n return [{\n message: `Fee ${tx.fee} is too low, minimum fee for this transaction is ${minFee}`,\n key: 'InsufficientFee',\n checkedKeys: ['fee']\n }]\n },\n ({ ttl }, { height }) => {\n if (ttl === undefined) return []\n ttl = +ttl\n if (ttl === 0 || ttl >= height) return []\n return [{\n message: `TTL ${ttl} is already expired, current height is ${height}`,\n key: 'ExpiredTTL',\n checkedKeys: ['ttl']\n }]\n },\n ({ amount, fee, nameFee, tx }, { account, parentTxTypes, txType }) => {\n if ((amount ?? fee ?? nameFee) === undefined) return []\n const cost = new BigNumber(fee).plus(nameFee || 0).plus(amount || 0)\n .plus(txType === TX_TYPE.payingFor ? tx.tx.encodedTx.tx.fee : 0)\n .minus(parentTxTypes.includes(TX_TYPE.payingFor) ? fee : 0)\n if (cost.lte(account.balance)) return []\n return [{\n message: `Account balance ${account.balance} is not enough to execute the transaction that costs ${cost.toFixed()}`,\n key: 'InsufficientBalance',\n checkedKeys: ['amount', 'fee', 'nameFee']\n }]\n },\n ({ nonce }, { account, parentTxTypes }) => {\n if (nonce === undefined || parentTxTypes.includes(TX_TYPE.gaMeta)) return []\n nonce = +nonce\n const validNonce = account.nonce + 1\n if (nonce === validNonce) return []\n return [{\n ...nonce < validNonce\n ? {\n message: `Nonce ${nonce} is already used, valid nonce is ${validNonce}`,\n key: 'NonceAlreadyUsed'\n }\n : {\n message: `Nonce ${nonce} is too high, valid nonce is ${validNonce}`,\n key: 'NonceHigh'\n },\n checkedKeys: ['nonce']\n }]\n },\n ({ gasPrice }) => {\n if (gasPrice === undefined) return []\n if (gasPrice >= MIN_GAS_PRICE) return []\n return [{\n message: `Gas price ${gasPrice} must be bigger then ${MIN_GAS_PRICE}`,\n key: 'MinGasPrice',\n checkedKeys: ['gasPrice']\n }]\n },\n ({ ctVersion, abiVersion }, { txType, node }) => {\n const { consensusProtocolVersion } = node.getNodeInfo()\n const protocol = PROTOCOL_VM_ABI[consensusProtocolVersion]\n if (!protocol) throw new Error(`Unsupported protocol: ${consensusProtocolVersion}`)\n // If not contract create tx\n if (!ctVersion) ctVersion = { abiVersion }\n const txProtocol = protocol[txType]\n if (!txProtocol) return []\n if (Object.entries(ctVersion).some(([key, value]) => !txProtocol[key].includes(+value))) {\n return [{\n message: `ABI/VM version ${JSON.stringify(ctVersion)} is wrong, supported is: ${JSON.stringify(txProtocol)}`,\n key: 'VmAndAbiVersionMismatch',\n checkedKeys: ['ctVersion', 'abiVersion']\n }]\n }\n return []\n }\n]\n\nconst getSenderAddress = tx => [\n 'senderId', 'accountId', 'ownerId', 'callerId',\n 'oracleId', 'fromId', 'initiator', 'gaId', 'payerId'\n]\n .map(key => tx[key])\n .filter(a => a)\n .map(a => a.replace(/^ok_/, 'ak_'))[0]\n\n/**\n * Transaction Validator\n * This function validates some of transaction properties,\n * to make sure it can be posted it to the chain\n * @function\n * @alias module:@aeternity/aepp-sdk/es/tx/validator\n * @rtype (tx: String, node) => void\n * @param {String} transaction Base64Check-encoded transaction\n * @param {Object} node Node to validate transaction against\n * @param {String[]} [parentTxTypes] Types of parent transactions\n * @return {Promise<Object[]>} Array with verification errors\n * @example const errors = await verifyTransaction(transaction, node)\n */\nexport default async function verifyTransaction (transaction, node, parentTxTypes = []) {\n const { tx, txType } = unpackTx(transaction)\n\n const address = getSenderAddress(tx) ??\n (txType === TX_TYPE.signed ? getSenderAddress(tx.encodedTx.tx) : null)\n const [account, height] = await Promise.all([\n address && node.api.getAccountByPubkey(address).catch(() => ({\n id: address,\n balance: new BigNumber(0),\n nonce: 0\n })),\n node.api.getCurrentKeyBlockHeight().then(({ height }) => height)\n ])\n\n return (await Promise.all(\n validators.map(v => v(tx, { txType, node, account, height, parentTxTypes })))\n ).flat()\n}\n"],"file":"validator.js"}
|
|
@@ -53,20 +53,17 @@ function disconnect() {
|
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
function connect(onMessage, onDisconnect) {
|
|
56
|
-
var _this = this;
|
|
57
|
-
|
|
58
56
|
if (this.isConnected()) throw new Error('You already connected');
|
|
59
57
|
|
|
60
|
-
this.handler =
|
|
61
|
-
if (
|
|
58
|
+
this.handler = (msg, source) => {
|
|
59
|
+
if (this.debug) console.log('Receive message: ', msg);
|
|
62
60
|
onMessage(msg, source);
|
|
63
61
|
};
|
|
64
62
|
|
|
65
63
|
this.port.onMessage.addListener(this.handler);
|
|
66
|
-
this.port.onDisconnect.addListener(
|
|
67
|
-
typeof onDisconnect === 'function' && onDisconnect({},
|
|
68
|
-
|
|
69
|
-
_this.port.disconnect();
|
|
64
|
+
this.port.onDisconnect.addListener(() => {
|
|
65
|
+
typeof onDisconnect === 'function' && onDisconnect({}, this);
|
|
66
|
+
this.port.disconnect();
|
|
70
67
|
});
|
|
71
68
|
}
|
|
72
69
|
/**
|
|
@@ -111,24 +108,23 @@ function isConnected() {
|
|
|
111
108
|
|
|
112
109
|
|
|
113
110
|
export default stampit({
|
|
114
|
-
init
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
_ref$debug = _ref.debug,
|
|
121
|
-
debug = _ref$debug === void 0 ? false : _ref$debug;
|
|
111
|
+
init(_ref) {
|
|
112
|
+
let {
|
|
113
|
+
connectionInfo = {},
|
|
114
|
+
port,
|
|
115
|
+
debug = false
|
|
116
|
+
} = _ref;
|
|
122
117
|
if (!getBrowserAPI().runtime) throw new Error('Runtime is not accessible in your environment');
|
|
123
118
|
this.debug = debug;
|
|
124
119
|
this.connectionInfo = connectionInfo;
|
|
125
|
-
this.port = port ||
|
|
120
|
+
this.port = port || getBrowserAPI().runtime.connect(...[connectionInfo.id || undefined]);
|
|
126
121
|
},
|
|
122
|
+
|
|
127
123
|
methods: {
|
|
128
|
-
connect
|
|
129
|
-
sendMessage
|
|
130
|
-
disconnect
|
|
131
|
-
isConnected
|
|
124
|
+
connect,
|
|
125
|
+
sendMessage,
|
|
126
|
+
disconnect,
|
|
127
|
+
isConnected
|
|
132
128
|
}
|
|
133
129
|
}, WalletConnection);
|
|
134
130
|
//# sourceMappingURL=browser-runtime.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/utils/aepp-wallet-communication/connection/browser-runtime.js"],"names":["stampit","WalletConnection","getBrowserAPI","disconnect","port","e","console","warning","connect","onMessage","onDisconnect","isConnected","Error","handler","msg","source","debug","log","addListener","sendMessage","postMessage","hasListeners","hasListener","init","connectionInfo","runtime","id","undefined","methods"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAOA,OAAP,MAAoB,WAApB;AAEA,OAAOC,gBAAP,MAA6B,GAA7B;AACA,SAASC,aAAT,QAA8B,YAA9B;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAASC,UAAT,GAAuB;AACrB,MAAI;AACF,SAAKC,IAAL,CAAUD,UAAV;AACD,GAFD,CAEE,OAAOE,CAAP,EAAU;AACVC,IAAAA,OAAO,CAACC,OAAR,CAAgB,iCAAhB,EAAmDF,CAAnD;AACD;AACF;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASG,OAAT,CAAkBC,SAAlB,EAA6BC,YAA7B,EAA2C;
|
|
1
|
+
{"version":3,"sources":["../../../../src/utils/aepp-wallet-communication/connection/browser-runtime.js"],"names":["stampit","WalletConnection","getBrowserAPI","disconnect","port","e","console","warning","connect","onMessage","onDisconnect","isConnected","Error","handler","msg","source","debug","log","addListener","sendMessage","postMessage","hasListeners","hasListener","init","connectionInfo","runtime","id","undefined","methods"],"mappings":"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","sourcesContent":["/*\n * ISC License (ISC)\n * Copyright (c) 2018 aeternity developers\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n */\n\n/**\n * Browser runtime connector module\n *\n * This is the complement to {@link module:@aeternity/aepp-sdk/es/utils/aepp-wallet-communication/connection}.\n * @module @aeternity/aepp-sdk/es/utils/aepp-wallet-communication/connection/browser-runtime\n * @export BrowserRuntimeConnection\n * @example import BrowserRuntimeConnection from '@aeternity/aepp-sdk/es/utils/aepp-wallet-communication/connection/browser-runtime'\n */\nimport stampit from '@stamp/it'\n\nimport WalletConnection from '.'\nimport { getBrowserAPI } from '../helpers'\n\n/**\n * Disconnect\n * @function disconnect\n * @instance\n * @rtype () => void\n * @return {void}\n */\nfunction disconnect () {\n try {\n this.port.disconnect()\n } catch (e) {\n console.warning('From BrowserRuntimeConnection: ', e)\n }\n}\n\n/**\n * Connect\n * @function connect\n * @instance\n * @rtype (onMessage: Function, onDisconnect: Function) => void\n * @param {Function} onMessage - Message handler\n * @param {Function} onDisconnect - trigger when runtime connection in closed\n * @return {void}\n */\nfunction connect (onMessage, onDisconnect) {\n if (this.isConnected()) throw new Error('You already connected')\n this.handler = (msg, source) => {\n if (this.debug) console.log('Receive message: ', msg)\n onMessage(msg, source)\n }\n this.port.onMessage.addListener(this.handler)\n this.port.onDisconnect.addListener(() => {\n typeof onDisconnect === 'function' && onDisconnect({}, this)\n this.port.disconnect()\n })\n}\n\n/**\n * Send message\n * @function sendMessage\n * @instance\n * @rtype (msg: Object) => void\n * @param {Object} msg - Message\n * @return {void}\n */\nfunction sendMessage (msg) {\n if (!this.port) throw new Error('You dont have connection. Please connect before')\n if (this.debug) console.log('Send message: ', msg)\n this.port.postMessage(msg)\n}\n\n/**\n * Check if connected\n * @function isConnected\n * @instance\n * @rtype () => Boolean\n * @return {Boolean} Is connected\n */\nfunction isConnected () {\n return typeof this.port.onMessage.hasListeners === 'function' ? this.port.onMessage.hasListeners() : this.port.onMessage.hasListener(this.handler)\n}\n\n/**\n * BrowserRuntimeConnection stamp\n * Handle browser runtime communication\n * @function\n * @alias module:@aeternity/aepp-sdk/es/utils/aepp-wallet-communication/connection/browser-runtime\n * @rtype Stamp\n * @param {Object} params={} - Initializer object\n * @param {Object} params.port - Runtime `port` object\n * @param {Object} [params.connectionInfo={}] - Connection info object\n * @param {Boolean} [params.debug=false] - Debug flag\n * @return {Object}\n */\nexport default stampit({\n init ({ connectionInfo = {}, port, debug = false }) {\n if (!getBrowserAPI().runtime) throw new Error('Runtime is not accessible in your environment')\n this.debug = debug\n this.connectionInfo = connectionInfo\n this.port = port || getBrowserAPI().runtime.connect(...[connectionInfo.id || undefined])\n },\n methods: { connect, sendMessage, disconnect, isConnected }\n}, WalletConnection)\n"],"file":"browser-runtime.js"}
|