Skip to content

Commit ca79d6e

Browse files
authored
Merge pull request #547 from aeternity/release/4.2.0
Release 4.2.0
2 parents 7537a77 + e6f7e75 commit ca79d6e

File tree

21 files changed

+5788
-3715
lines changed

21 files changed

+5788
-3715
lines changed

.env

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
TAG=v3.0.1
2-
COMPILER_TAG=v3.1.0
1+
TAG=v3.3.0
2+
COMPILER_TAG=v3.2.0

CHANGELOG.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,27 @@
1+
# [4.2.0](https://github.com/aeternity/aepp-sdk-js/compare/2.4.0...4.2.0) (2019-07-15)
2+
3+
4+
### Bug Fixes
5+
6+
* **package:** update libsodium-wrappers-sumo to version 0.7.5 ([#541](https://github.com/aeternity/aepp-sdk-js/issues/541)) ([956ed75](https://github.com/aeternity/aepp-sdk-js/commit/956ed75))
7+
* **rpc-server:** Fix type 'object' check ([#526](https://github.com/aeternity/aepp-sdk-js/issues/526)) ([48c42e4](https://github.com/aeternity/aepp-sdk-js/commit/48c42e4))
8+
9+
10+
### Code Refactoring
11+
12+
* **swagger:** Speedup initialisation
13+
* **AENS:** Remove unused param from claim method
14+
* **AENS:** Fix exception if not waiting for mining(claim)
15+
* **Test:** Add test for contract namespaces
16+
17+
### Features
18+
19+
* **Node:** Add 4.0.0 node compatibility
20+
* **Compiler:** Add compatibility with compiler 3.2.0
21+
* **Channel:** Implement GA awareness of State Channels
22+
23+
24+
125
# [4.1.0](https://github.com/aeternity/aepp-sdk-js/compare/4.0.1...4.1.0) (2019-06-22)
226

327

README.md

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)
44
[![Build Status](https://ci.aepps.com/buildStatus/icon?job=aepp-sdk-js/develop)](https://ci.aepps.com/job/aepp-sdk-js/job/develop/)
55
[![npm](https://img.shields.io/npm/v/@aeternity/aepp-sdk.svg)](https://www.npmjs.com/package/@aeternity/aepp-sdk)
6-
[![npm](https://img.shields.io/npm/l/@aeternity/aepp-sdk.svg)](https://www.npmjs.com/package/@aeternity/aepp-sdk)
6+
[![npm](https://img.shields.io/npm/l/@aeternity/aepp-sdk.svg)](https://www.npmjs.com/package/@aeternity/aepp-sdk) [![Greenkeeper badge](https://badges.greenkeeper.io/aeternity/aepp-sdk-js.svg)](https://greenkeeper.io/)
77

88
JavaScript SDK for the revolutionary [æternity] blockchain, targeting the
99
[æternity node] implementation. Aepp-sdk is [hosted on GitHub].
@@ -12,20 +12,10 @@ JavaScript SDK for the revolutionary [æternity] blockchain, targeting the
1212
[æternity node]: https://github.com/aeternity/aeternity
1313
[hosted on GitHub]: https://github.com/aeternity/aepp-sdk-js
1414

15-
#### Disclaimer
16-
17-
This SDK is in continuos development where things can easily break, especially if you're not an officially released version. We aim to make all our
18-
releases as stable as possible, neverless it should not be taken as
19-
production-ready.
20-
21-
To catch up with the more edgy state of development please
22-
check out the [develop branch].
23-
2415
[develop branch]: https://github.com/aeternity/aepp-sdk-js/tree/develop
2516

2617
## Table of content
2718
- [Æternity's Javascript SDK](#%C3%86ternitys-Javascript-SDK)
28-
- [Disclaimer](#Disclaimer)
2919
- [Table of content](#Table-of-content)
3020
- [Quick Start](#Quick-Start)
3121
- [1. Install SDK](#1-Install-SDK)
@@ -68,6 +58,23 @@ npm i @aeternity/aepp-sdk@next
6858
npm i https://github.com/aeternity/aepp-sdk-js#develop
6959
```
7060

61+
**Note** : If you experience errors during the installation, you might need to install build tools for your OS.
62+
63+
Windows: Windows Build Tools
64+
```
65+
npm install -g windows-build-tools
66+
```
67+
Ubuntu / Debian: Build Essential
68+
```
69+
sudo apt-get update
70+
sudo apt-get install build-essential
71+
```
72+
Mac:
73+
Download [Xcode](https://apps.apple.com/de/app/xcode/id497799835?mt=12) from AppStore, then run
74+
```
75+
xcode-select --install
76+
```
77+
7178
### 2. Create an Account
7279
You can do many more things now, but you'll probably have to start with:
7380

@@ -159,4 +166,3 @@ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
159166
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
160167
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
161168
THIS SOFTWARE.
162-

es/ae/aens.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -159,14 +159,11 @@ async function query (name) {
159159
* @alias module:@aeternity/aepp-sdk/es/ae/aens
160160
* @param {String} name
161161
* @param {String} salt
162-
* @param {Number} waitForHeight
163162
* @param {Record} [options={}]
164163
* @return {Promise<Object>} the result of the claim
165164
*/
166-
async function claim (name, salt, waitForHeight, options = {}) {
165+
async function claim (name, salt, options = {}) {
167166
const opt = R.merge(this.Ae.defaults, options)
168-
// wait until block was mined before send claim transaction
169-
// if (waitForHeight) await this.awaitHeight(waitForHeight, { attempts: 200 })
170167
const claimTx = await this.nameClaimTx(R.merge(opt, {
171168
accountId: await this.address(),
172169
nameSalt: salt,
@@ -177,7 +174,7 @@ async function claim (name, salt, waitForHeight, options = {}) {
177174

178175
return {
179176
...result,
180-
...(await this.aensQuery(name))
177+
...opt.waitMined && await this.aensQuery(name)
181178
}
182179
}
183180

es/channel/handlers.js

Lines changed: 119 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* PERFORMANCE OF THIS SOFTWARE.
1616
*/
1717

18-
import { generateKeyPair, encodeContractAddress } from '../utils/crypto'
18+
import { generateKeyPair, encodeContractAddress, encodeBase64Check } from '../utils/crypto'
1919
import {
2020
options,
2121
changeStatus,
@@ -25,7 +25,23 @@ import {
2525
channelId,
2626
disconnect
2727
} from './internal'
28-
import { unpackTx } from '../tx/builder'
28+
import { unpackTx, buildTx } from '../tx/builder'
29+
30+
function encodeRlpTx (rlpBinary) {
31+
return `tx_${encodeBase64Check(rlpBinary)}`
32+
}
33+
34+
async function appendSignature (tx, signFn) {
35+
const { signatures, encodedTx } = unpackTx(tx).tx
36+
const result = await signFn(encodeRlpTx(encodedTx.rlpEncoded))
37+
if (result) {
38+
const { tx: signedTx, txType } = unpackTx(result)
39+
return encodeRlpTx(buildTx({
40+
signatures: signatures.concat(signedTx.signatures),
41+
encodedTx: signedTx.encodedTx.rlpEncoded
42+
}, txType).rlpEncoded)
43+
}
44+
}
2945

3046
function handleUnexpectedMessage (channel, message, state) {
3147
if (state.reject) {
@@ -63,15 +79,35 @@ export async function awaitingChannelCreateTx (channel, message, state) {
6379
responder: 'responder_sign'
6480
}[options.get(channel).role]
6581
if (message.method === `channels.sign.${tag}`) {
66-
const signedTx = await options.get(channel).sign(tag, message.params.data.tx)
67-
send(channel, { jsonrpc: '2.0', method: `channels.${tag}`, params: { tx: signedTx } })
82+
if (message.params.data.tx) {
83+
const signedTx = await options.get(channel).sign(tag, message.params.data.tx)
84+
send(channel, { jsonrpc: '2.0', method: `channels.${tag}`, params: { tx: signedTx } })
85+
return { handler: awaitingOnChainTx }
86+
}
87+
const signedTx = await appendSignature(message.params.data.signed_tx, tx => options.get(channel).sign(tag, tx))
88+
send(channel, { jsonrpc: '2.0', method: `channels.${tag}`, params: { signed_tx: signedTx } })
6889
return { handler: awaitingOnChainTx }
6990
}
7091
}
7192

7293
export function awaitingOnChainTx (channel, message, state) {
7394
if (message.method === 'channels.on_chain_tx') {
74-
emit(channel, 'onChainTx', message.params.data.tx)
95+
if (
96+
message.params.data.info === 'funding_signed' &&
97+
options.get(channel).role === 'initiator'
98+
) {
99+
return { handler: awaitingOnChainTx }
100+
}
101+
if (
102+
message.params.data.info === 'funding_created' &&
103+
options.get(channel).role === 'responder'
104+
) {
105+
return { handler: awaitingOnChainTx }
106+
}
107+
emit(channel, 'onChainTx', message.params.data.signed_tx, {
108+
info: message.params.data.info,
109+
type: message.params.data.type
110+
})
75111
return { handler: awaitingBlockInclusion }
76112
}
77113
if (
@@ -126,13 +162,22 @@ export async function channelOpen (channel, message, state) {
126162
return { handler: channelOpen }
127163
case 'close_mutual':
128164
return { handler: channelOpen }
165+
case 'closing':
166+
changeStatus(channel, 'closing')
167+
return { handler: channelOpen }
168+
case 'closed_confirmed':
169+
changeStatus(channel, 'closed')
170+
return { handler: channelClosed }
129171
case 'died':
130172
changeStatus(channel, 'died')
131173
return { handler: channelClosed }
132174
}
133175
break
134176
case 'channels.on_chain_tx':
135-
emit(channel, 'onChainTx', message.params.data.tx)
177+
emit(channel, 'onChainTx', message.params.data.signed_tx, {
178+
info: message.params.data.info,
179+
type: message.params.data.type
180+
})
136181
return { handler: channelOpen }
137182
case 'channels.leave':
138183
// TODO: emit event
@@ -151,8 +196,15 @@ channelOpen.enter = (channel) => {
151196
export async function awaitingOffChainTx (channel, message, state) {
152197
if (message.method === 'channels.sign.update') {
153198
const { sign } = state
154-
const signedTx = await sign(message.params.data.tx, { updates: message.params.data.updates })
155-
send(channel, { jsonrpc: '2.0', method: 'channels.update', params: { tx: signedTx } })
199+
if (message.params.data.tx) {
200+
const signedTx = await sign(message.params.data.tx, { updates: message.params.data.updates })
201+
send(channel, { jsonrpc: '2.0', method: 'channels.update', params: { tx: signedTx } })
202+
return { handler: awaitingOffChainUpdate, state }
203+
}
204+
const signedTx = await appendSignature(message.params.data.signed_tx, tx =>
205+
sign(tx, { updates: message.params.data.updates })
206+
)
207+
send(channel, { jsonrpc: '2.0', method: 'channels.update', params: { signed_tx: signedTx } })
156208
return { handler: awaitingOffChainUpdate, state }
157209
}
158210
if (message.method === 'channels.error') {
@@ -194,14 +246,22 @@ export async function awaitingTxSignRequest (channel, message, state) {
194246
// eslint-disable-next-line no-useless-escape
195247
const [, tag] = message.method.match(/^channels\.sign\.([^\.]+)$/) || []
196248
if (tag) {
197-
const signedTx = await options.get(channel).sign(
198-
tag,
199-
message.params.data.tx,
200-
{ updates: message.params.data.updates }
201-
)
202-
if (signedTx) {
203-
send(channel, { jsonrpc: '2.0', method: `channels.${tag}`, params: { tx: signedTx } })
204-
return { handler: channelOpen }
249+
if (message.params.data.tx) {
250+
const signedTx = await options.get(channel).sign(tag, message.params.data.tx, {
251+
updates: message.params.data.updates
252+
})
253+
if (signedTx) {
254+
send(channel, { jsonrpc: '2.0', method: `channels.${tag}`, params: { tx: signedTx } })
255+
return { handler: channelOpen }
256+
}
257+
} else {
258+
const signedTx = await appendSignature(message.params.data.signed_tx, tx =>
259+
options.get(channel).sign(tag, tx, { updates: message.params.data.updates })
260+
)
261+
if (signedTx) {
262+
send(channel, { jsonrpc: '2.0', method: `channels.${tag}`, params: { signed_tx: signedTx } })
263+
return { handler: channelOpen }
264+
}
205265
}
206266
// soft-reject via competing update
207267
send(channel, {
@@ -230,8 +290,13 @@ export function awaitingUpdateConflict (channel, message, state) {
230290

231291
export async function awaitingShutdownTx (channel, message, state) {
232292
if (message.method === 'channels.sign.shutdown_sign') {
233-
const signedTx = await Promise.resolve(state.sign(message.params.data.tx))
234-
send(channel, { jsonrpc: '2.0', method: 'channels.shutdown_sign', params: { tx: signedTx } })
293+
if (message.params.data.tx) {
294+
const signedTx = await state.sign(message.params.data.tx)
295+
send(channel, { jsonrpc: '2.0', method: 'channels.shutdown_sign', params: { tx: signedTx } })
296+
return { handler: awaitingShutdownOnChainTx, state }
297+
}
298+
const signedTx = await appendSignature(message.params.data.signed_tx, tx => state.sign(tx))
299+
send(channel, { jsonrpc: '2.0', method: 'channels.shutdown_sign', params: { signed_tx: signedTx } })
235300
return { handler: awaitingShutdownOnChainTx, state }
236301
}
237302
return handleUnexpectedMessage(channel, message, state)
@@ -260,11 +325,16 @@ export function awaitingLeave (channel, message, state) {
260325

261326
export async function awaitingWithdrawTx (channel, message, state) {
262327
if (message.method === 'channels.sign.withdraw_tx') {
263-
const signedTx = await Promise.resolve(state.sign(
264-
message.params.data.tx,
265-
{ updates: message.params.data.updates }
266-
))
267-
send(channel, { jsonrpc: '2.0', method: 'channels.withdraw_tx', params: { tx: signedTx } })
328+
const { sign } = state
329+
if (message.params.data.tx) {
330+
const signedTx = await sign(message.params.data.tx, { updates: message.params.data.updates })
331+
send(channel, { jsonrpc: '2.0', method: 'channels.withdraw_tx', params: { tx: signedTx } })
332+
return { handler: awaitingWithdrawCompletion, state }
333+
}
334+
const signedTx = await appendSignature(message.params.data.signed_tx, tx =>
335+
sign(tx, { updates: message.params.data.updates })
336+
)
337+
send(channel, { jsonrpc: '2.0', method: 'channels.withdraw_tx', params: { signed_tx: signedTx } })
268338
return { handler: awaitingWithdrawCompletion, state }
269339
}
270340
return handleUnexpectedMessage(channel, message, state)
@@ -273,7 +343,7 @@ export async function awaitingWithdrawTx (channel, message, state) {
273343
export function awaitingWithdrawCompletion (channel, message, state) {
274344
if (message.method === 'channels.on_chain_tx') {
275345
if (state.onOnChainTx) {
276-
state.onOnChainTx(message.params.data.tx)
346+
state.onOnChainTx(message.params.data.signed_tx)
277347
}
278348
return { handler: awaitingWithdrawCompletion, state }
279349
}
@@ -303,11 +373,16 @@ export function awaitingWithdrawCompletion (channel, message, state) {
303373

304374
export async function awaitingDepositTx (channel, message, state) {
305375
if (message.method === 'channels.sign.deposit_tx') {
306-
const signedTx = await Promise.resolve(state.sign(
307-
message.params.data.tx,
308-
{ updates: message.params.data.updates }
309-
))
310-
send(channel, { jsonrpc: '2.0', method: 'channels.deposit_tx', params: { tx: signedTx } })
376+
const { sign } = state
377+
if (message.params.data.tx) {
378+
const signedTx = await sign(message.params.data.tx, { updates: message.params.data.updates })
379+
send(channel, { jsonrpc: '2.0', method: 'channels.deposit_tx', params: { tx: signedTx } })
380+
return { handler: awaitingDepositCompletion, state }
381+
}
382+
const signedTx = await appendSignature(message.params.data.signed_tx, tx =>
383+
sign(tx, { updates: message.params.data.updates })
384+
)
385+
send(channel, { jsonrpc: '2.0', method: 'channels.deposit_tx', params: { signed_tx: signedTx } })
311386
return { handler: awaitingDepositCompletion, state }
312387
}
313388
return handleUnexpectedMessage(channel, message, state)
@@ -316,7 +391,7 @@ export async function awaitingDepositTx (channel, message, state) {
316391
export function awaitingDepositCompletion (channel, message, state) {
317392
if (message.method === 'channels.on_chain_tx') {
318393
if (state.onOnChainTx) {
319-
state.onOnChainTx(message.params.data.tx)
394+
state.onOnChainTx(message.params.data.signed_tx)
320395
}
321396
return { handler: awaitingDepositCompletion, state }
322397
}
@@ -346,8 +421,13 @@ export function awaitingDepositCompletion (channel, message, state) {
346421

347422
export async function awaitingNewContractTx (channel, message, state) {
348423
if (message.method === 'channels.sign.update') {
349-
const signedTx = await Promise.resolve(state.sign(message.params.data.tx))
350-
send(channel, { jsonrpc: '2.0', method: 'channels.update', params: { tx: signedTx } })
424+
if (message.params.data.tx) {
425+
const signedTx = await state.sign(message.params.data.tx)
426+
send(channel, { jsonrpc: '2.0', method: 'channels.update', params: { tx: signedTx } })
427+
return { handler: awaitingNewContractCompletion, state }
428+
}
429+
const signedTx = await appendSignature(message.params.data.signed_tx, tx => state.sign(tx))
430+
send(channel, { jsonrpc: '2.0', method: 'channels.update', params: { signed_tx: signedTx } })
351431
return { handler: awaitingNewContractCompletion, state }
352432
}
353433
return handleUnexpectedMessage(channel, message, state)
@@ -378,8 +458,13 @@ export function awaitingNewContractCompletion (channel, message, state) {
378458

379459
export async function awaitingCallContractUpdateTx (channel, message, state) {
380460
if (message.method === 'channels.sign.update') {
381-
const signedTx = await Promise.resolve(state.sign(message.params.data.tx))
382-
send(channel, { jsonrpc: '2.0', method: 'channels.update', params: { tx: signedTx } })
461+
if (message.params.data.tx) {
462+
const signedTx = await state.sign(message.params.data.tx)
463+
send(channel, { jsonrpc: '2.0', method: 'channels.update', params: { tx: signedTx } })
464+
return { handler: awaitingCallContractCompletion, state }
465+
}
466+
const signedTx = await appendSignature(message.params.data.signed_tx, tx => state.sign(tx))
467+
send(channel, { jsonrpc: '2.0', method: 'channels.update', params: { signed_tx: signedTx } })
383468
return { handler: awaitingCallContractCompletion, state }
384469
}
385470
return handleUnexpectedMessage(channel, message, state)

es/node.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,6 @@ const Node = stampit({
152152
})
153153

154154
const NODE_GE_VERSION = '3.0.1'
155-
const NODE_LT_VERSION = '4.0.0'
155+
const NODE_LT_VERSION = '5.0.0'
156156

157157
export default Node

es/rpc/server.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ async function receive ({ data, origin, source }) {
4242
(this.rpcMethods[method] || error).bind(this),
4343
{ params, session: this.rpcSessions[session], origin }
4444
).then(result => {
45-
const resolve = typeof result === 'object'
45+
const resolve = typeof result === 'object' && Object.prototype.toString.call(result) === '[object Object]'
4646
? Object.entries(result)
4747
.filter(([key, value]) => typeof value !== 'function')
4848
.reduce((p, [key, value]) => ({ ...p, [key]: value }), {})

0 commit comments

Comments
 (0)