From d957cc9b17a040926bd7c4e8d794f4ecb78c2954 Mon Sep 17 00:00:00 2001 From: naz_dou <41945483+nduchak@users.noreply.github.com> Date: Fri, 17 May 2019 18:48:27 +0300 Subject: [PATCH] Release/3.3.0 (#417) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Realign/3.2.1 (#412) * chore(package): Bump version to 2.4.1 * chore(Adjust CHANGELOG): * chore(CAHNGELOG): Fix typo * docs(USAGE): Fix networkId in Wallet example * fix(Http): Remove userAgent from axios * chore(CHANGELOG): Fix typo * docs(*): Regenrate docs * chore(bump version in package): * chore(CHANGELOG): Adjust changelog to conventional changelog style * chore(Docker): Update node version tot 2.3.0 * docs(CHANGELOG): Adjust release * feat(npm): Add script for auto-generating changelog * chore(Node): downgrade to 2.2.0 due to failed channel test * fix(Channel): Fix failing test on 2.3.0 node * chore(package-lock): adjust package-lock * chore(Channel): Revert to 2.2.0 * docs(Docs): Regenerate docs * refactor(node): Add txHash to sendTransaction error * chore(package): bump version to 3.1.0 * chore(Docs): Regeneratee docs and changelog * chore(package): Add packa-lock * chore(changelog): Adjust closes issue * chore(package): Bump version to 3.2.0 * docs(Docs and Changelog): Regenerate docs * docs(CHANGELOG): Adjust changelog * docs(CHANGELOG): Adjust changelog * chore(Jenkions): Force jenkins * fix(NPM): Make audit of npm packages. Remove esm from deps * chore(Release): Bump version in package, generate CHNAGELOG * force Jenkins * force Jenkins * force Jenkins * force Jenkins * feat(Consensus): Add function to get consensus version. (#413) * feat(Consensus): Add function to get conmsensus version. Get vm/abi based on node protocol * chore(node): Remove logs * add docs for node getProtocol * disable channel tests * try to fix channel test * try to fix channel test * Make sdk compatible with node from 2.3.0 to 4.0.0 * feat(TxBuilder): INT type must be greater or equal 0 int transaction * feat(State Channels): Make state channels compatible with aeternity v… (#415) * feat(State Channels): Make state channels compatible with aeternity v3.0.0 * Fix lint error * feat(Transaction Builder): Add serializations for transactions introd… (#416) * feat(Transaction Builder): Add serializations for transactions introduced in fortuna release * Fix lint errors * fix(AEP exampe): Fix contract in AEPP example * chore(package): Bump version to 3.3.0 * fix(Node): Use universalUrl istead of ES URL * Enable channel tests --- .env | 2 +- CHANGELOG.md | 20 + docker/aeternity_node_mean16.yaml | 4 + es/channel/handlers.js | 18 +- es/node.js | 29 +- es/tx/builder/index.js | 14 +- es/tx/builder/schema.js | 391 ++++++++++++++---- es/tx/tx.js | 21 +- .../aepp/src/components/Home.vue | 4 +- package-lock.json | 64 ++- package.json | 5 +- test/integration/accounts.js | 8 + test/integration/channel.js | 191 +++++++-- 13 files changed, 623 insertions(+), 148 deletions(-) diff --git a/.env b/.env index 13150cee73..e569c471ec 100644 --- a/.env +++ b/.env @@ -1,3 +1,3 @@ -TAG=v2.5.0 +TAG=master COMPILER_TAG=v2.1.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index e39b332405..5ab526c23b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,23 @@ +# [3.3.0](https://github.com/aeternity/aepp-sdk-js/compare/2.4.0...3.3.0) (2019-05-17) + + +### Bug Fixes + +* **AEP exampe:** Fix contract in AEPP example ([e2fec19](https://github.com/aeternity/aepp-sdk-js/commit/e2fec19)) +fix(AEP exampe): Fix contract in AEPP example + +### Features + +* **Consensus:** Add function to get consensus version. ([#413](https://github.com/aeternity/aepp-sdk-js/issues/413)) ([46027cd](https://github.com/aeternity/aepp-sdk-js/commit/46027cd)) +* **State Channels:** Make state channels compatible with aeternity 3.0.0 ([#415](https://github.com/aeternity/aepp-sdk-js/issues/415)) ([668e7f1](https://github.com/aeternity/aepp-sdk-js/commit/668e7f1)) +* **Transaction Builder:** Add serializations for transactions introd… ([#416](https://github.com/aeternity/aepp-sdk-js/issues/416)) ([fd7b8ce](https://github.com/aeternity/aepp-sdk-js/commit/fd7b8ce)) + + +### BREAKING CHANGES + +* **NODE** Change compatibility from `2.3.0` to `3.0.0` + + # [3.2.1](https://github.com/aeternity/aepp-sdk-js/compare/2.4.0...3.2.1) (2019-05-16) diff --git a/docker/aeternity_node_mean16.yaml b/docker/aeternity_node_mean16.yaml index 780b64b803..a580c0198f 100644 --- a/docker/aeternity_node_mean16.yaml +++ b/docker/aeternity_node_mean16.yaml @@ -20,6 +20,10 @@ keys: chain: persist: true + hard_forks: + "1": 0 + "2": 2 + "3": 4 mining: autostart: true diff --git a/es/channel/handlers.js b/es/channel/handlers.js index 3b80b6a515..d18dbd27fa 100644 --- a/es/channel/handlers.js +++ b/es/channel/handlers.js @@ -151,7 +151,7 @@ channelOpen.enter = (channel) => { export async function awaitingOffChainTx (channel, message, state) { if (message.method === 'channels.sign.update') { const { sign } = state - const signedTx = await sign(message.params.data.tx) + const signedTx = await sign(message.params.data.tx, { updates: message.params.data.updates }) send(channel, { jsonrpc: '2.0', method: 'channels.update', params: { tx: signedTx } }) return { handler: awaitingOffChainUpdate, state } } @@ -194,7 +194,11 @@ export async function awaitingTxSignRequest (channel, message, state) { // eslint-disable-next-line no-useless-escape const [, tag] = message.method.match(/^channels\.sign\.([^\.]+)$/) || [] if (tag) { - const signedTx = await options.get(channel).sign(tag, message.params.data.tx) + const signedTx = await options.get(channel).sign( + tag, + message.params.data.tx, + { updates: message.params.data.updates } + ) if (signedTx) { send(channel, { jsonrpc: '2.0', method: `channels.${tag}`, params: { tx: signedTx } }) return { handler: channelOpen } @@ -256,7 +260,10 @@ export function awaitingLeave (channel, message, state) { export async function awaitingWithdrawTx (channel, message, state) { if (message.method === 'channels.sign.withdraw_tx') { - const signedTx = await Promise.resolve(state.sign(message.params.data.tx)) + const signedTx = await Promise.resolve(state.sign( + message.params.data.tx, + { updates: message.params.data.updates } + )) send(channel, { jsonrpc: '2.0', method: 'channels.withdraw_tx', params: { tx: signedTx } }) return { handler: awaitingWithdrawCompletion, state } } @@ -296,7 +303,10 @@ export function awaitingWithdrawCompletion (channel, message, state) { export async function awaitingDepositTx (channel, message, state) { if (message.method === 'channels.sign.deposit_tx') { - const signedTx = await Promise.resolve(state.sign(message.params.data.tx)) + const signedTx = await Promise.resolve(state.sign( + message.params.data.tx, + { updates: message.params.data.updates } + )) send(channel, { jsonrpc: '2.0', method: 'channels.deposit_tx', params: { tx: signedTx } }) return { handler: awaitingDepositCompletion, state } } diff --git a/es/node.js b/es/node.js index ed24e27155..2c2e554f97 100644 --- a/es/node.js +++ b/es/node.js @@ -27,6 +27,7 @@ import axios from 'axios' import * as R from 'ramda' import Swagger from './utils/swagger' import semverSatisfies from './utils/semver-satisfies' +import { URL } from 'universal-url' function resolveUrl (url, baseUrl) { return new URL(url, baseUrl).toString() @@ -63,6 +64,27 @@ const loader = ({ url, internalUrl }) => (path, definition) => { } } +/** + * get consensus protocol version + * @param {Array} protocols Array of protocols + * @param {Number} height Geigh + * @return {Number} version Protocol version + */ +async function getConsensusProtocolVersion (protocols = [], height) { + if (!protocols) throw new Error('Protocols must be an array') + if (!height) height = (await this.api.getCurrentKeyBlock()).height + if (height < 0) throw new Error('height must be a number >= 0') + + const { version } = protocols + .reduce( + ({ effectiveAtHeight, version }, p) => height >= p.effectiveAtHeight && p.effectiveAtHeight > effectiveAtHeight + ? { effectiveAtHeight: p.effectiveAtHeight, version: p.version } + : { effectiveAtHeight, version }, + { effectiveAtHeight: -1, version: 0 } + ) + return version +} + /** * {@link Swagger} based Node remote API Stamp * @function @@ -95,15 +117,18 @@ const Node = stampit({ nodeNetworkId: this.nodeNetworkId, version: this.version } - } + }, + getConsensusProtocolVersion }, props: { version: null, + consensusProtocolVersion: null, nodeNetworkId: null } }, Swagger, { async init ({ forceCompatibility = false }) { - const { nodeRevision: revision, genesisKeyBlockHash: genesisHash, networkId } = await this.api.getStatus() + const { nodeRevision: revision, genesisKeyBlockHash: genesisHash, networkId, protocols } = await this.api.getStatus() + this.consensusProtocolVersion = await this.getConsensusProtocolVersion(protocols) if ( !semverSatisfies(this.version.split('-')[0], NODE_GE_VERSION, NODE_LT_VERSION) && !forceCompatibility diff --git a/es/tx/builder/index.js b/es/tx/builder/index.js index a6dcf2d4fd..08b3f73b9c 100644 --- a/es/tx/builder/index.js +++ b/es/tx/builder/index.js @@ -124,7 +124,8 @@ function validateField (value, key, type, prefix) { // Validate type of value switch (type) { case FIELD_TYPES.int: - return assert(!isNaN(value) || BigNumber.isBigNumber(value), { value }) + const isMinusValue = (!isNaN(value) || BigNumber.isBigNumber(value)) && BigNumber(value).lt(0) + return assert((!isNaN(value) || BigNumber.isBigNumber(value)) && BigNumber(value).gte(0), { value, isMinusValue }) case FIELD_TYPES.id: return assert(PREFIX_ID_TAG[value.split('_')[0]] && value.split('_')[0] === prefix, { value, prefix }) case FIELD_TYPES.binary: @@ -301,7 +302,10 @@ export function buildTx (params, type, { excludeKeys = [], prefix = 'tx' } = {}) if (!TX_SERIALIZATION_SCHEMA[type]) { throw new Error('Transaction serialization not implemented for ' + type) } - const [schema, tag] = TX_SERIALIZATION_SCHEMA[type] + if (!TX_SERIALIZATION_SCHEMA[type][VSN]) { + throw new Error('Transaction serialization not implemented for ' + type + ' version ' + VSN) + } + const [schema, tag] = TX_SERIALIZATION_SCHEMA[type][VSN] const binary = buildRawTx({ ...params, VSN, tag }, schema, { excludeKeys }).filter(e => e !== undefined) const rlpEncoded = rlp.encode(binary) @@ -326,7 +330,11 @@ export function unpackTx (encodedTx, fromRlpBinary = false) { if (!TX_DESERIALIZATION_SCHEMA[objId]) { return { message: 'Transaction deserialization not implemented for tag ' + objId } } - const [schema] = TX_DESERIALIZATION_SCHEMA[objId] + const vsn = readInt(binary[1]) + if (!TX_DESERIALIZATION_SCHEMA[objId][vsn]) { + return { message: 'Transaction deserialization not implemented for tag ' + objId + ' version ' + vsn } + } + const [schema] = TX_DESERIALIZATION_SCHEMA[objId][vsn] return { txType: OBJECT_ID_TX_TYPE[objId], tx: unpackRawTx(binary, schema), rlpEncoded, binary } } diff --git a/es/tx/builder/schema.js b/es/tx/builder/schema.js index 46af8e6129..b714eb4a6f 100644 --- a/es/tx/builder/schema.js +++ b/es/tx/builder/schema.js @@ -155,18 +155,33 @@ export const ABI_VERSIONS = { SOLIDITY: 2 } +export const VM_ABI_MAP_ROMA = { + [TX_TYPE.contractCreate]: { vmVersion: [VM_VERSIONS.SOPHIA], abiVersion: [ABI_VERSIONS.SOPHIA] }, + [TX_TYPE.contractCall]: { vmVersion: [VM_VERSIONS.SOPHIA], abiVersion: [ABI_VERSIONS.SOPHIA] }, + [TX_TYPE.oracleRegister]: { vmVersion: [VM_VERSIONS.SOPHIA], abiVersion: [ABI_VERSIONS.NO_ABI, ABI_VERSIONS.SOPHIA] } +} + export const VM_ABI_MAP_MINERVA = { [TX_TYPE.contractCreate]: { vmVersion: [VM_VERSIONS.SOPHIA_IMPROVEMENTS_MINERVA], abiVersion: [ABI_VERSIONS.SOPHIA] }, - [TX_TYPE.contractCall]: { vmVersion: [VM_VERSIONS.SOPHIA, VM_VERSIONS.SOPHIA_IMPROVEMENTS_MINERVA], abiVersion: [ABI_VERSIONS.SOPHIA] }, + [TX_TYPE.contractCall]: { vmVersion: [VM_VERSIONS.SOPHIA_IMPROVEMENTS_MINERVA, VM_VERSIONS.SOPHIA], abiVersion: [ABI_VERSIONS.SOPHIA] }, [TX_TYPE.oracleRegister]: { vmVersion: [VM_VERSIONS.SOPHIA_IMPROVEMENTS_MINERVA], abiVersion: [ABI_VERSIONS.NO_ABI, ABI_VERSIONS.SOPHIA] } } export const VM_ABI_MAP_FORTUNA = { - [TX_TYPE.contractCreate]: { vmVersion: [VM_VERSIONS.SOPHIA_IMPROVEMENTS_MINERVA, VM_VERSIONS.SOPHIA_IMPROVEMENTS_FORTUNA], abiVersion: [ABI_VERSIONS.SOPHIA] }, // vmVersion 0x4 do not work with fortuna - [TX_TYPE.contractCall]: { vmVersion: [VM_VERSIONS.SOPHIA, VM_VERSIONS.SOPHIA_IMPROVEMENTS_FORTUNA, VM_VERSIONS.SOPHIA_IMPROVEMENTS_MINERVA], abiVersion: [ABI_VERSIONS.SOPHIA] }, + [TX_TYPE.contractCreate]: { vmVersion: [VM_VERSIONS.SOPHIA_IMPROVEMENTS_FORTUNA], abiVersion: [ABI_VERSIONS.SOPHIA] }, + [TX_TYPE.contractCall]: { vmVersion: [VM_VERSIONS.SOPHIA_IMPROVEMENTS_FORTUNA, VM_VERSIONS.SOPHIA, VM_VERSIONS.SOPHIA_IMPROVEMENTS_MINERVA], abiVersion: [ABI_VERSIONS.SOPHIA] }, [TX_TYPE.oracleRegister]: { vmVersion: [], abiVersion: [ABI_VERSIONS.NO_ABI, ABI_VERSIONS.SOPHIA] } } +export const PROTOCOL_VM_ABI = { + // Roma + '1': VM_ABI_MAP_ROMA, + // Minerva + '2': VM_ABI_MAP_MINERVA, + // Fortuna + '3': VM_ABI_MAP_FORTUNA +} + export const OBJECT_ID_TX_TYPE = { [OBJECT_TAG_ACCOUNT]: TX_TYPE.account, [OBJECT_TAG_SIGNED_TRANSACTION]: TX_TYPE.signed, @@ -291,7 +306,7 @@ export const ID_TAG_PREFIX = revertObject(PREFIX_ID_TAG) const VALIDATION_ERROR = (msg) => msg export const VALIDATION_MESSAGE = { - [FIELD_TYPES.int]: ({ value }) => VALIDATION_ERROR(`${value} is not of type Number or BigNumber`), + [FIELD_TYPES.int]: ({ value, isMinusValue }) => isMinusValue ? VALIDATION_ERROR(`${value} must be >= 0`) : VALIDATION_ERROR(`${value} is not of type Number or BigNumber`), [FIELD_TYPES.id]: ({ value, prefix }) => VALIDATION_ERROR(`'${value}' prefix doesn't match expected prefix '${prefix}' or ID_TAG for prefix not found`), [FIELD_TYPES.binary]: ({ prefix, value }) => VALIDATION_ERROR(`'${value}' prefix doesn't match expected prefix '${prefix}'`), [FIELD_TYPES.string]: ({ value }) => VALIDATION_ERROR(`Not a string`), @@ -310,6 +325,15 @@ const ACCOUNT_TX = [ TX_FIELD('balance', FIELD_TYPES.int) ] +const ACCOUNT_TX_2 = [ + ...BASE_TX, + TX_FIELD('flags', FIELD_TYPES.int), + TX_FIELD('nonce', FIELD_TYPES.int), + TX_FIELD('balance', FIELD_TYPES.int), + TX_FIELD('gaContract', FIELD_TYPES.id, 'ct'), + TX_FIELD('gaAuthFun', FIELD_TYPES.binary, 'cb') +] + const SPEND_TX = [ ...BASE_TX, TX_FIELD('senderId', FIELD_TYPES.id, 'ak'), @@ -572,6 +596,13 @@ const CHANNEL_OFFCHAIN_TX = [ TX_FIELD('stateHash', FIELD_TYPES.binary, 'st') ] +const CHANNEL_OFFCHAIN_TX_2 = [ + ...BASE_TX, + TX_FIELD('channelId', FIELD_TYPES.id, 'ch'), + TX_FIELD('round', FIELD_TYPES.int), + TX_FIELD('stateHash', FIELD_TYPES.binary, 'st') +] + const CHANNEL_TX = [ ...BASE_TX, TX_FIELD('initiator', FIELD_TYPES.id, 'ak'), @@ -588,6 +619,24 @@ const CHANNEL_TX = [ TX_FIELD('lockedUntil', FIELD_TYPES.int) ] +const CHANNEL_TX_2 = [ + ...BASE_TX, + TX_FIELD('initiator', FIELD_TYPES.id, 'ak'), + TX_FIELD('responder', FIELD_TYPES.id, 'ak'), + TX_FIELD('channelAmount', FIELD_TYPES.int), + TX_FIELD('initiatorAmount', FIELD_TYPES.int), + TX_FIELD('responderAmount', FIELD_TYPES.int), + TX_FIELD('channelReserve', FIELD_TYPES.int), + TX_FIELD('delegateIds', FIELD_TYPES.ids), + TX_FIELD('stateHash', FIELD_TYPES.hex), + TX_FIELD('round', FIELD_TYPES.int), + TX_FIELD('soloRound', FIELD_TYPES.int), + TX_FIELD('lockPeriod', FIELD_TYPES.int), + TX_FIELD('lockedUntil', FIELD_TYPES.int), + TX_FIELD('initiatorAuth', FIELD_TYPES.binary, 'cb'), + TX_FIELD('responderAuth', FIELD_TYPES.binary, 'cb') +] + const CHANNEL_SNAPSHOT_SOLO_TX = [ ...BASE_TX, TX_FIELD('channelId', FIELD_TYPES.id, 'ch'), @@ -700,91 +749,261 @@ const ACCOUNTS_TREE_TX = [ ] export const TX_SERIALIZATION_SCHEMA = { - [TX_TYPE.account]: TX_SCHEMA_FIELD(ACCOUNT_TX, OBJECT_TAG_ACCOUNT), - [TX_TYPE.signed]: TX_SCHEMA_FIELD(SIGNED_TX, OBJECT_TAG_SIGNED_TRANSACTION), - [TX_TYPE.spend]: TX_SCHEMA_FIELD(SPEND_TX, OBJECT_TAG_SPEND_TRANSACTION), - [TX_TYPE.namePreClaim]: TX_SCHEMA_FIELD(NAME_PRE_CLAIM_TX, OBJECT_TAG_NAME_SERVICE_PRECLAIM_TRANSACTION), - [TX_TYPE.nameClaim]: TX_SCHEMA_FIELD(NAME_CLAIM_TX, OBJECT_TAG_NAME_SERVICE_CLAIM_TRANSACTION), - [TX_TYPE.nameUpdate]: TX_SCHEMA_FIELD(NAME_UPDATE_TX, OBJECT_TAG_NAME_SERVICE_UPDATE_TRANSACTION), - [TX_TYPE.nameTransfer]: TX_SCHEMA_FIELD(NAME_TRANSFER_TX, OBJECT_TAG_NAME_SERVICE_TRANSFER_TRANSACTION), - [TX_TYPE.nameRevoke]: TX_SCHEMA_FIELD(NAME_REVOKE_TX, OBJECT_TAG_NAME_SERVICE_REVOKE_TRANSACTION), - [TX_TYPE.contract]: TX_SCHEMA_FIELD(CONTRACT_TX, OBJECT_TAG_CONTRACT), - [TX_TYPE.contractCreate]: TX_SCHEMA_FIELD(CONTRACT_CREATE_TX, OBJECT_TAG_CONTRACT_CREATE_TRANSACTION), - [TX_TYPE.contractCall]: TX_SCHEMA_FIELD(CONTRACT_CALL_TX, OBJECT_TAG_CONTRACT_CALL_TRANSACTION), - [TX_TYPE.contractCallResult]: TX_SCHEMA_FIELD(CONTRACT_CALL_RESULT_TX, OBJECT_TAG_CONTRACT_CALL), - [TX_TYPE.oracleRegister]: TX_SCHEMA_FIELD(ORACLE_REGISTER_TX, OBJECT_TAG_ORACLE_REGISTER_TRANSACTION), - [TX_TYPE.oracleExtend]: TX_SCHEMA_FIELD(ORACLE_EXTEND_TX, OBJECT_TAG_ORACLE_EXTEND_TRANSACTION), - [TX_TYPE.oracleQuery]: TX_SCHEMA_FIELD(ORACLE_QUERY_TX, OBJECT_TAG_ORACLE_QUERY_TRANSACTION), - [TX_TYPE.oracleResponse]: TX_SCHEMA_FIELD(ORACLE_RESPOND_TX, OBJECT_TAG_ORACLE_RESPONSE_TRANSACTION), - [TX_TYPE.channelCreate]: TX_SCHEMA_FIELD(CHANNEL_CREATE_TX, OBJECT_TAG_CHANNEL_CREATE_TX), - [TX_TYPE.channelCloseMutual]: TX_SCHEMA_FIELD(CHANNEL_CLOSE_MUTUAL_TX, OBJECT_TAG_CHANNEL_CLOSE_MUTUAL_TX), - [TX_TYPE.channelCloseSolo]: TX_SCHEMA_FIELD(CHANNEL_CLOSE_SOLO_TX, OBJECT_TAG_CHANNEL_CLOSE_SOLO_TX), - [TX_TYPE.channelSlash]: TX_SCHEMA_FIELD(CHANNEL_SLASH_TX, OBJECT_TAG_CHANNEL_SLASH_TX), - [TX_TYPE.channelDeposit]: TX_SCHEMA_FIELD(CHANNEL_DEPOSIT_TX, OBJECT_TAG_CHANNEL_DEPOSIT_TX), - [TX_TYPE.channelWithdraw]: TX_SCHEMA_FIELD(CHANNEL_WITHDRAW_TX, OBJECT_TAG_CHANNEL_WITHRAW_TX), - [TX_TYPE.channelSettle]: TX_SCHEMA_FIELD(CHANNEL_SETTLE_TX, OBJECT_TAG_CHANNEL_SETTLE_TX), - [TX_TYPE.channelOffChain]: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_TX), - [TX_TYPE.channel]: TX_SCHEMA_FIELD(CHANNEL_TX, OBJECT_TAG_CHANNEL), - [TX_TYPE.channelSnapshotSolo]: TX_SCHEMA_FIELD(CHANNEL_SNAPSHOT_SOLO_TX, OBJECT_TAG_CHANNEL_SNAPSHOT_SOLO_TX), - [TX_TYPE.channelOffChainUpdateTransfer]: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_UPDATE_TRANSFER_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_TRANSFER_TX), - [TX_TYPE.channelOffChainUpdateDeposit]: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_UPDATE_DEPOSIT_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_DEPOSIT_TX), - [TX_TYPE.channelOffChainUpdateWithdrawal]: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_UPDATE_WITHDRAWAL_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_WITHDRAWAL_TX), - [TX_TYPE.channelOffChainCreateContract]: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_CREATE_CONTRACT_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_CREATE_CONTRACT_TX), - [TX_TYPE.channelOffChainCallContract]: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_CALL_CONTRACT_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_CALL_CONTRACT_TX), - [TX_TYPE.proofOfInclusion]: TX_SCHEMA_FIELD(PROOF_OF_INCLUSION_TX, OBJECT_TAG_PROOF_OF_INCLUSION), - [TX_TYPE.stateTrees]: TX_SCHEMA_FIELD(STATE_TREES_TX, OBJECT_TAG_STATE_TREES), - [TX_TYPE.merklePatriciaTree]: TX_SCHEMA_FIELD(MERKLE_PATRICIA_TREE_TX, OBJECT_TAG_MERKLE_PATRICIA_TREE), - [TX_TYPE.merklePatriciaTreeValue]: TX_SCHEMA_FIELD(MERKLE_PATRICIA_TREE_VALUE_TX, OBJECT_TAG_MERKLE_PATRICIA_TREE_VALUE), - [TX_TYPE.contractsTree]: TX_SCHEMA_FIELD(CONTRACTS_TREE_TX, OBJECT_TAG_CONTRACTS_TREE), - [TX_TYPE.contractCallsTree]: TX_SCHEMA_FIELD(CONTRACT_CALLS_TREE_TX, OBJECT_TAG_CONTRACT_CALLS_TREE), - [TX_TYPE.channelsTree]: TX_SCHEMA_FIELD(CHANNELS_TREE_TX, OBJECT_TAG_CHANNELS_TREE), - [TX_TYPE.nameserviceTree]: TX_SCHEMA_FIELD(NAMESERVICE_TREE_TX, OBJECT_TAG_NAMESERVICE_TREE), - [TX_TYPE.oraclesTree]: TX_SCHEMA_FIELD(ORACLES_TREE_TX, OBJECT_TAG_ORACLES_TREE), - [TX_TYPE.accountsTree]: TX_SCHEMA_FIELD(ACCOUNTS_TREE_TX, OBJECT_TAG_ACCOUNTS_TREE) + [TX_TYPE.account]: { + 1: TX_SCHEMA_FIELD(ACCOUNT_TX, OBJECT_TAG_ACCOUNT), + 2: TX_SCHEMA_FIELD(ACCOUNT_TX_2, OBJECT_TAG_ACCOUNT) + }, + [TX_TYPE.signed]: { + 1: TX_SCHEMA_FIELD(SIGNED_TX, OBJECT_TAG_SIGNED_TRANSACTION) + }, + [TX_TYPE.spend]: { + 1: TX_SCHEMA_FIELD(SPEND_TX, OBJECT_TAG_SPEND_TRANSACTION) + }, + [TX_TYPE.namePreClaim]: { + 1: TX_SCHEMA_FIELD(NAME_PRE_CLAIM_TX, OBJECT_TAG_NAME_SERVICE_PRECLAIM_TRANSACTION) + }, + [TX_TYPE.nameClaim]: { + 1: TX_SCHEMA_FIELD(NAME_CLAIM_TX, OBJECT_TAG_NAME_SERVICE_CLAIM_TRANSACTION) + }, + [TX_TYPE.nameUpdate]: { + 1: TX_SCHEMA_FIELD(NAME_UPDATE_TX, OBJECT_TAG_NAME_SERVICE_UPDATE_TRANSACTION) + }, + [TX_TYPE.nameTransfer]: { + 1: TX_SCHEMA_FIELD(NAME_TRANSFER_TX, OBJECT_TAG_NAME_SERVICE_TRANSFER_TRANSACTION) + }, + [TX_TYPE.nameRevoke]: { + 1: TX_SCHEMA_FIELD(NAME_REVOKE_TX, OBJECT_TAG_NAME_SERVICE_REVOKE_TRANSACTION) + }, + [TX_TYPE.contract]: { + 1: TX_SCHEMA_FIELD(CONTRACT_TX, OBJECT_TAG_CONTRACT) + }, + [TX_TYPE.contractCreate]: { + 1: TX_SCHEMA_FIELD(CONTRACT_CREATE_TX, OBJECT_TAG_CONTRACT_CREATE_TRANSACTION) + }, + [TX_TYPE.contractCall]: { + 1: TX_SCHEMA_FIELD(CONTRACT_CALL_TX, OBJECT_TAG_CONTRACT_CALL_TRANSACTION) + }, + [TX_TYPE.contractCallResult]: { + 1: TX_SCHEMA_FIELD(CONTRACT_CALL_RESULT_TX, OBJECT_TAG_CONTRACT_CALL) + }, + [TX_TYPE.oracleRegister]: { + 1: TX_SCHEMA_FIELD(ORACLE_REGISTER_TX, OBJECT_TAG_ORACLE_REGISTER_TRANSACTION) + }, + [TX_TYPE.oracleExtend]: { + 1: TX_SCHEMA_FIELD(ORACLE_EXTEND_TX, OBJECT_TAG_ORACLE_EXTEND_TRANSACTION) + }, + [TX_TYPE.oracleQuery]: { + 1: TX_SCHEMA_FIELD(ORACLE_QUERY_TX, OBJECT_TAG_ORACLE_QUERY_TRANSACTION) + }, + [TX_TYPE.oracleResponse]: { + 1: TX_SCHEMA_FIELD(ORACLE_RESPOND_TX, OBJECT_TAG_ORACLE_RESPONSE_TRANSACTION) + }, + [TX_TYPE.channelCreate]: { + 1: TX_SCHEMA_FIELD(CHANNEL_CREATE_TX, OBJECT_TAG_CHANNEL_CREATE_TX) + }, + [TX_TYPE.channelCloseMutual]: { + 1: TX_SCHEMA_FIELD(CHANNEL_CLOSE_MUTUAL_TX, OBJECT_TAG_CHANNEL_CLOSE_MUTUAL_TX) + }, + [TX_TYPE.channelCloseSolo]: { + 1: TX_SCHEMA_FIELD(CHANNEL_CLOSE_SOLO_TX, OBJECT_TAG_CHANNEL_CLOSE_SOLO_TX) + }, + [TX_TYPE.channelSlash]: { + 1: TX_SCHEMA_FIELD(CHANNEL_SLASH_TX, OBJECT_TAG_CHANNEL_SLASH_TX) + }, + [TX_TYPE.channelDeposit]: { + 1: TX_SCHEMA_FIELD(CHANNEL_DEPOSIT_TX, OBJECT_TAG_CHANNEL_DEPOSIT_TX) + }, + [TX_TYPE.channelWithdraw]: { + 1: TX_SCHEMA_FIELD(CHANNEL_WITHDRAW_TX, OBJECT_TAG_CHANNEL_WITHRAW_TX) + }, + [TX_TYPE.channelSettle]: { + 1: TX_SCHEMA_FIELD(CHANNEL_SETTLE_TX, OBJECT_TAG_CHANNEL_SETTLE_TX) + }, + [TX_TYPE.channelOffChain]: { + 1: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_TX), + 2: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_TX_2, OBJECT_TAG_CHANNEL_OFFCHAIN_TX) + }, + [TX_TYPE.channel]: { + 1: TX_SCHEMA_FIELD(CHANNEL_TX, OBJECT_TAG_CHANNEL), + 2: TX_SCHEMA_FIELD(CHANNEL_TX_2, OBJECT_TAG_CHANNEL) + }, + [TX_TYPE.channelSnapshotSolo]: { + 1: TX_SCHEMA_FIELD(CHANNEL_SNAPSHOT_SOLO_TX, OBJECT_TAG_CHANNEL_SNAPSHOT_SOLO_TX) + }, + [TX_TYPE.channelOffChainUpdateTransfer]: { + 1: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_UPDATE_TRANSFER_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_TRANSFER_TX) + }, + [TX_TYPE.channelOffChainUpdateDeposit]: { + 1: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_UPDATE_DEPOSIT_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_DEPOSIT_TX) + }, + [TX_TYPE.channelOffChainUpdateWithdrawal]: { + 1: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_UPDATE_WITHDRAWAL_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_WITHDRAWAL_TX) + }, + [TX_TYPE.channelOffChainCreateContract]: { + 1: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_CREATE_CONTRACT_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_CREATE_CONTRACT_TX) + }, + [TX_TYPE.channelOffChainCallContract]: { + 1: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_CALL_CONTRACT_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_CALL_CONTRACT_TX) + }, + [TX_TYPE.proofOfInclusion]: { + 1: TX_SCHEMA_FIELD(PROOF_OF_INCLUSION_TX, OBJECT_TAG_PROOF_OF_INCLUSION) + }, + [TX_TYPE.stateTrees]: { + 1: TX_SCHEMA_FIELD(STATE_TREES_TX, OBJECT_TAG_STATE_TREES) + }, + [TX_TYPE.merklePatriciaTree]: { + 1: TX_SCHEMA_FIELD(MERKLE_PATRICIA_TREE_TX, OBJECT_TAG_MERKLE_PATRICIA_TREE) + }, + [TX_TYPE.merklePatriciaTreeValue]: { + 1: TX_SCHEMA_FIELD(MERKLE_PATRICIA_TREE_VALUE_TX, OBJECT_TAG_MERKLE_PATRICIA_TREE_VALUE) + }, + [TX_TYPE.contractsTree]: { + 1: TX_SCHEMA_FIELD(CONTRACTS_TREE_TX, OBJECT_TAG_CONTRACTS_TREE) + }, + [TX_TYPE.contractCallsTree]: { + 1: TX_SCHEMA_FIELD(CONTRACT_CALLS_TREE_TX, OBJECT_TAG_CONTRACT_CALLS_TREE) + }, + [TX_TYPE.channelsTree]: { + 1: TX_SCHEMA_FIELD(CHANNELS_TREE_TX, OBJECT_TAG_CHANNELS_TREE) + }, + [TX_TYPE.nameserviceTree]: { + 1: TX_SCHEMA_FIELD(NAMESERVICE_TREE_TX, OBJECT_TAG_NAMESERVICE_TREE) + }, + [TX_TYPE.oraclesTree]: { + 1: TX_SCHEMA_FIELD(ORACLES_TREE_TX, OBJECT_TAG_ORACLES_TREE) + }, + [TX_TYPE.accountsTree]: { + 1: TX_SCHEMA_FIELD(ACCOUNTS_TREE_TX, OBJECT_TAG_ACCOUNTS_TREE) + } } export const TX_DESERIALIZATION_SCHEMA = { - [OBJECT_TAG_ACCOUNT]: TX_SCHEMA_FIELD(ACCOUNT_TX, OBJECT_TAG_ACCOUNT), - [OBJECT_TAG_SIGNED_TRANSACTION]: TX_SCHEMA_FIELD(SIGNED_TX, OBJECT_TAG_SIGNED_TRANSACTION), - [OBJECT_TAG_SPEND_TRANSACTION]: TX_SCHEMA_FIELD(SPEND_TX, OBJECT_TAG_SPEND_TRANSACTION), - [OBJECT_TAG_NAME_SERVICE_PRECLAIM_TRANSACTION]: TX_SCHEMA_FIELD(NAME_PRE_CLAIM_TX, OBJECT_TAG_NAME_SERVICE_PRECLAIM_TRANSACTION), - [OBJECT_TAG_NAME_SERVICE_CLAIM_TRANSACTION]: TX_SCHEMA_FIELD(NAME_CLAIM_TX, OBJECT_TAG_NAME_SERVICE_CLAIM_TRANSACTION), - [OBJECT_TAG_NAME_SERVICE_UPDATE_TRANSACTION]: TX_SCHEMA_FIELD(NAME_UPDATE_TX, OBJECT_TAG_NAME_SERVICE_UPDATE_TRANSACTION), - [OBJECT_TAG_NAME_SERVICE_TRANSFER_TRANSACTION]: TX_SCHEMA_FIELD(NAME_TRANSFER_TX, OBJECT_TAG_NAME_SERVICE_TRANSFER_TRANSACTION), - [OBJECT_TAG_NAME_SERVICE_REVOKE_TRANSACTION]: TX_SCHEMA_FIELD(NAME_REVOKE_TX, OBJECT_TAG_NAME_SERVICE_REVOKE_TRANSACTION), - [OBJECT_TAG_CONTRACT]: TX_SCHEMA_FIELD(CONTRACT_TX, OBJECT_TAG_CONTRACT), - [OBJECT_TAG_CONTRACT_CREATE_TRANSACTION]: TX_SCHEMA_FIELD(CONTRACT_CREATE_TX, OBJECT_TAG_CONTRACT_CREATE_TRANSACTION), - [OBJECT_TAG_CONTRACT_CALL_TRANSACTION]: TX_SCHEMA_FIELD(CONTRACT_CALL_TX, OBJECT_TAG_CONTRACT_CALL_TRANSACTION), - [OBJECT_TAG_CONTRACT_CALL]: TX_SCHEMA_FIELD(CONTRACT_CALL_RESULT_TX, OBJECT_TAG_CONTRACT_CALL), - [OBJECT_TAG_ORACLE_REGISTER_TRANSACTION]: TX_SCHEMA_FIELD(ORACLE_REGISTER_TX, OBJECT_TAG_ORACLE_REGISTER_TRANSACTION), - [OBJECT_TAG_ORACLE_EXTEND_TRANSACTION]: TX_SCHEMA_FIELD(ORACLE_EXTEND_TX, OBJECT_TAG_ORACLE_EXTEND_TRANSACTION), - [OBJECT_TAG_ORACLE_QUERY_TRANSACTION]: TX_SCHEMA_FIELD(ORACLE_QUERY_TX, OBJECT_TAG_ORACLE_QUERY_TRANSACTION), - [OBJECT_TAG_ORACLE_RESPONSE_TRANSACTION]: TX_SCHEMA_FIELD(ORACLE_RESPOND_TX, OBJECT_TAG_ORACLE_RESPONSE_TRANSACTION), - [OBJECT_TAG_CHANNEL_CREATE_TX]: TX_SCHEMA_FIELD(CHANNEL_CREATE_TX, OBJECT_TAG_CHANNEL_CREATE_TX), - [OBJECT_TAG_CHANNEL_CLOSE_MUTUAL_TX]: TX_SCHEMA_FIELD(CHANNEL_CLOSE_MUTUAL_TX, OBJECT_TAG_CHANNEL_CLOSE_MUTUAL_TX), - [OBJECT_TAG_CHANNEL_CLOSE_SOLO_TX]: TX_SCHEMA_FIELD(CHANNEL_CLOSE_SOLO_TX, OBJECT_TAG_CHANNEL_CLOSE_SOLO_TX), - [OBJECT_TAG_CHANNEL_SLASH_TX]: TX_SCHEMA_FIELD(CHANNEL_SLASH_TX, OBJECT_TAG_CHANNEL_SLASH_TX), - [OBJECT_TAG_CHANNEL_DEPOSIT_TX]: TX_SCHEMA_FIELD(CHANNEL_DEPOSIT_TX, OBJECT_TAG_CHANNEL_DEPOSIT_TX), - [OBJECT_TAG_CHANNEL_WITHRAW_TX]: TX_SCHEMA_FIELD(CHANNEL_WITHDRAW_TX, OBJECT_TAG_CHANNEL_WITHRAW_TX), - [OBJECT_TAG_CHANNEL_SETTLE_TX]: TX_SCHEMA_FIELD(CHANNEL_SETTLE_TX, OBJECT_TAG_CHANNEL_SETTLE_TX), - [OBJECT_TAG_CHANNEL_OFFCHAIN_TX]: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_TX), - [OBJECT_TAG_CHANNEL]: TX_SCHEMA_FIELD(CHANNEL_TX, OBJECT_TAG_CHANNEL), - [OBJECT_TAG_CHANNEL_SNAPSHOT_SOLO_TX]: TX_SCHEMA_FIELD(CHANNEL_SNAPSHOT_SOLO_TX, OBJECT_TAG_CHANNEL_SNAPSHOT_SOLO_TX), - [OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_TRANSFER_TX]: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_UPDATE_TRANSFER_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_TRANSFER_TX), - [OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_DEPOSIT_TX]: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_UPDATE_DEPOSIT_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_DEPOSIT_TX), - [OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_WITHDRAWAL_TX]: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_UPDATE_WITHDRAWAL_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_WITHDRAWAL_TX), - [OBJECT_TAG_CHANNEL_OFFCHAIN_CREATE_CONTRACT_TX]: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_CREATE_CONTRACT_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_CREATE_CONTRACT_TX), - [OBJECT_TAG_CHANNEL_OFFCHAIN_CALL_CONTRACT_TX]: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_CALL_CONTRACT_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_CALL_CONTRACT_TX), - [OBJECT_TAG_PROOF_OF_INCLUSION]: TX_SCHEMA_FIELD(PROOF_OF_INCLUSION_TX, OBJECT_TAG_PROOF_OF_INCLUSION), - [OBJECT_TAG_STATE_TREES]: TX_SCHEMA_FIELD(STATE_TREES_TX, OBJECT_TAG_STATE_TREES), - [OBJECT_TAG_MERKLE_PATRICIA_TREE]: TX_SCHEMA_FIELD(MERKLE_PATRICIA_TREE_TX, OBJECT_TAG_MERKLE_PATRICIA_TREE), - [OBJECT_TAG_MERKLE_PATRICIA_TREE_VALUE]: TX_SCHEMA_FIELD(MERKLE_PATRICIA_TREE_VALUE_TX, OBJECT_TAG_MERKLE_PATRICIA_TREE_VALUE), - [OBJECT_TAG_CONTRACTS_TREE]: TX_SCHEMA_FIELD(CONTRACTS_TREE_TX, OBJECT_TAG_CONTRACTS_TREE), - [OBJECT_TAG_CONTRACT_CALLS_TREE]: TX_SCHEMA_FIELD(CONTRACT_CALLS_TREE_TX, OBJECT_TAG_CONTRACT_CALLS_TREE), - [OBJECT_TAG_CHANNELS_TREE]: TX_SCHEMA_FIELD(CHANNELS_TREE_TX, OBJECT_TAG_CHANNELS_TREE), - [OBJECT_TAG_NAMESERVICE_TREE]: TX_SCHEMA_FIELD(NAMESERVICE_TREE_TX, OBJECT_TAG_NAMESERVICE_TREE), - [OBJECT_TAG_ORACLES_TREE]: TX_SCHEMA_FIELD(ORACLES_TREE_TX, OBJECT_TAG_ORACLES_TREE), - [OBJECT_TAG_ACCOUNTS_TREE]: TX_SCHEMA_FIELD(ACCOUNTS_TREE_TX, OBJECT_TAG_ACCOUNTS_TREE) + [OBJECT_TAG_ACCOUNT]: { + 1: TX_SCHEMA_FIELD(ACCOUNT_TX, OBJECT_TAG_ACCOUNT), + 2: TX_SCHEMA_FIELD(ACCOUNT_TX_2, OBJECT_TAG_ACCOUNT) + }, + [OBJECT_TAG_SIGNED_TRANSACTION]: { + 1: TX_SCHEMA_FIELD(SIGNED_TX, OBJECT_TAG_SIGNED_TRANSACTION) + }, + [OBJECT_TAG_SPEND_TRANSACTION]: { + 1: TX_SCHEMA_FIELD(SPEND_TX, OBJECT_TAG_SPEND_TRANSACTION) + }, + [OBJECT_TAG_NAME_SERVICE_PRECLAIM_TRANSACTION]: { + 1: TX_SCHEMA_FIELD(NAME_PRE_CLAIM_TX, OBJECT_TAG_NAME_SERVICE_PRECLAIM_TRANSACTION) + }, + [OBJECT_TAG_NAME_SERVICE_CLAIM_TRANSACTION]: { + 1: TX_SCHEMA_FIELD(NAME_CLAIM_TX, OBJECT_TAG_NAME_SERVICE_CLAIM_TRANSACTION) + }, + [OBJECT_TAG_NAME_SERVICE_UPDATE_TRANSACTION]: { + 1: TX_SCHEMA_FIELD(NAME_UPDATE_TX, OBJECT_TAG_NAME_SERVICE_UPDATE_TRANSACTION) + }, + [OBJECT_TAG_NAME_SERVICE_TRANSFER_TRANSACTION]: { + 1: TX_SCHEMA_FIELD(NAME_TRANSFER_TX, OBJECT_TAG_NAME_SERVICE_TRANSFER_TRANSACTION) + }, + [OBJECT_TAG_NAME_SERVICE_REVOKE_TRANSACTION]: { + 1: TX_SCHEMA_FIELD(NAME_REVOKE_TX, OBJECT_TAG_NAME_SERVICE_REVOKE_TRANSACTION) + }, + [OBJECT_TAG_CONTRACT]: { + 1: TX_SCHEMA_FIELD(CONTRACT_TX, OBJECT_TAG_CONTRACT) + }, + [OBJECT_TAG_CONTRACT_CREATE_TRANSACTION]: { + 1: TX_SCHEMA_FIELD(CONTRACT_CREATE_TX, OBJECT_TAG_CONTRACT_CREATE_TRANSACTION) + }, + [OBJECT_TAG_CONTRACT_CALL_TRANSACTION]: { + 1: TX_SCHEMA_FIELD(CONTRACT_CALL_TX, OBJECT_TAG_CONTRACT_CALL_TRANSACTION) + }, + [OBJECT_TAG_CONTRACT_CALL]: { + 1: TX_SCHEMA_FIELD(CONTRACT_CALL_RESULT_TX, OBJECT_TAG_CONTRACT_CALL) + }, + [OBJECT_TAG_ORACLE_REGISTER_TRANSACTION]: { + 1: TX_SCHEMA_FIELD(ORACLE_REGISTER_TX, OBJECT_TAG_ORACLE_REGISTER_TRANSACTION) + }, + [OBJECT_TAG_ORACLE_EXTEND_TRANSACTION]: { + 1: TX_SCHEMA_FIELD(ORACLE_EXTEND_TX, OBJECT_TAG_ORACLE_EXTEND_TRANSACTION) + }, + [OBJECT_TAG_ORACLE_QUERY_TRANSACTION]: { + 1: TX_SCHEMA_FIELD(ORACLE_QUERY_TX, OBJECT_TAG_ORACLE_QUERY_TRANSACTION) + }, + [OBJECT_TAG_ORACLE_RESPONSE_TRANSACTION]: { + 1: TX_SCHEMA_FIELD(ORACLE_RESPOND_TX, OBJECT_TAG_ORACLE_RESPONSE_TRANSACTION) + }, + [OBJECT_TAG_CHANNEL_CREATE_TX]: { + 1: TX_SCHEMA_FIELD(CHANNEL_CREATE_TX, OBJECT_TAG_CHANNEL_CREATE_TX) + }, + [OBJECT_TAG_CHANNEL_CLOSE_MUTUAL_TX]: { + 1: TX_SCHEMA_FIELD(CHANNEL_CLOSE_MUTUAL_TX, OBJECT_TAG_CHANNEL_CLOSE_MUTUAL_TX) + }, + [OBJECT_TAG_CHANNEL_CLOSE_SOLO_TX]: { + 1: TX_SCHEMA_FIELD(CHANNEL_CLOSE_SOLO_TX, OBJECT_TAG_CHANNEL_CLOSE_SOLO_TX) + }, + [OBJECT_TAG_CHANNEL_SLASH_TX]: { + 1: TX_SCHEMA_FIELD(CHANNEL_SLASH_TX, OBJECT_TAG_CHANNEL_SLASH_TX) + }, + [OBJECT_TAG_CHANNEL_DEPOSIT_TX]: { + 1: TX_SCHEMA_FIELD(CHANNEL_DEPOSIT_TX, OBJECT_TAG_CHANNEL_DEPOSIT_TX) + }, + [OBJECT_TAG_CHANNEL_WITHRAW_TX]: { + 1: TX_SCHEMA_FIELD(CHANNEL_WITHDRAW_TX, OBJECT_TAG_CHANNEL_WITHRAW_TX) + }, + [OBJECT_TAG_CHANNEL_SETTLE_TX]: { + 1: TX_SCHEMA_FIELD(CHANNEL_SETTLE_TX, OBJECT_TAG_CHANNEL_SETTLE_TX) + }, + [OBJECT_TAG_CHANNEL_OFFCHAIN_TX]: { + 1: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_TX), + 2: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_TX_2, OBJECT_TAG_CHANNEL_OFFCHAIN_TX) + }, + [OBJECT_TAG_CHANNEL]: { + 1: TX_SCHEMA_FIELD(CHANNEL_TX, OBJECT_TAG_CHANNEL), + 2: TX_SCHEMA_FIELD(CHANNEL_TX_2, OBJECT_TAG_CHANNEL) + }, + [OBJECT_TAG_CHANNEL_SNAPSHOT_SOLO_TX]: { + 1: TX_SCHEMA_FIELD(CHANNEL_SNAPSHOT_SOLO_TX, OBJECT_TAG_CHANNEL_SNAPSHOT_SOLO_TX) + }, + [OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_TRANSFER_TX]: { + 1: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_UPDATE_TRANSFER_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_TRANSFER_TX) + }, + [OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_DEPOSIT_TX]: { + 1: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_UPDATE_DEPOSIT_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_DEPOSIT_TX) + }, + [OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_WITHDRAWAL_TX]: { + 1: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_UPDATE_WITHDRAWAL_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_WITHDRAWAL_TX) + }, + [OBJECT_TAG_CHANNEL_OFFCHAIN_CREATE_CONTRACT_TX]: { + 1: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_CREATE_CONTRACT_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_CREATE_CONTRACT_TX) + }, + [OBJECT_TAG_CHANNEL_OFFCHAIN_CALL_CONTRACT_TX]: { + 1: TX_SCHEMA_FIELD(CHANNEL_OFFCHAIN_CALL_CONTRACT_TX, OBJECT_TAG_CHANNEL_OFFCHAIN_CALL_CONTRACT_TX) + }, + [OBJECT_TAG_PROOF_OF_INCLUSION]: { + 1: TX_SCHEMA_FIELD(PROOF_OF_INCLUSION_TX, OBJECT_TAG_PROOF_OF_INCLUSION) + }, + [OBJECT_TAG_STATE_TREES]: { + 1: TX_SCHEMA_FIELD(STATE_TREES_TX, OBJECT_TAG_STATE_TREES) + }, + [OBJECT_TAG_MERKLE_PATRICIA_TREE]: { + 1: TX_SCHEMA_FIELD(MERKLE_PATRICIA_TREE_TX, OBJECT_TAG_MERKLE_PATRICIA_TREE) + }, + [OBJECT_TAG_MERKLE_PATRICIA_TREE_VALUE]: { + 1: TX_SCHEMA_FIELD(MERKLE_PATRICIA_TREE_VALUE_TX, OBJECT_TAG_MERKLE_PATRICIA_TREE_VALUE) + }, + [OBJECT_TAG_CONTRACTS_TREE]: { + 1: TX_SCHEMA_FIELD(CONTRACTS_TREE_TX, OBJECT_TAG_CONTRACTS_TREE) + }, + [OBJECT_TAG_CONTRACT_CALLS_TREE]: { + 1: TX_SCHEMA_FIELD(CONTRACT_CALLS_TREE_TX, OBJECT_TAG_CONTRACT_CALLS_TREE) + }, + [OBJECT_TAG_CHANNELS_TREE]: { + 1: TX_SCHEMA_FIELD(CHANNELS_TREE_TX, OBJECT_TAG_CHANNELS_TREE) + }, + [OBJECT_TAG_NAMESERVICE_TREE]: { + 1: TX_SCHEMA_FIELD(NAMESERVICE_TREE_TX, OBJECT_TAG_NAMESERVICE_TREE) + }, + [OBJECT_TAG_ORACLES_TREE]: { + 1: TX_SCHEMA_FIELD(ORACLES_TREE_TX, OBJECT_TAG_ORACLES_TREE) + }, + [OBJECT_TAG_ACCOUNTS_TREE]: { + 1: TX_SCHEMA_FIELD(ACCOUNTS_TREE_TX, OBJECT_TAG_ACCOUNTS_TREE) + } } // VERIFICATION SCHEMA diff --git a/es/tx/tx.js b/es/tx/tx.js index 50e2d19df7..3951dd7ac5 100644 --- a/es/tx/tx.js +++ b/es/tx/tx.js @@ -23,12 +23,11 @@ */ import * as R from 'ramda' -import semverSatisfies from '../utils/semver-satisfies' import Tx from './' import Node from '../node' import { buildTx, calculateFee } from './builder' -import { MIN_GAS_PRICE, TX_TYPE, VM_ABI_MAP_FORTUNA, VM_ABI_MAP_MINERVA } from './builder/schema' +import { MIN_GAS_PRICE, PROTOCOL_VM_ABI, TX_TYPE } from './builder/schema' import { buildContractId, oracleQueryId } from './builder/helpers' async function spendTx ({ senderId, recipientId, amount, payload = '' }) { @@ -146,7 +145,7 @@ async function contractCallTx ({ callerId, contractId, abiVersion, amount, gas, fee: parseInt(fee), gas: parseInt(gas), gasPrice, - abiVersion: ctVersion.vmVersion + abiVersion: ctVersion.abiVersion })) return tx @@ -347,16 +346,18 @@ async function channelSnapshotSoloTx ({ channelId, fromId, payload }) { * @return {object} Object with vm/abi version ({ vmVersion: number, abiVersion: number }) */ function getVmVersion (txType, { vmVersion, abiVersion } = {}) { - const isMinerva = semverSatisfies(this.version.split('-')[0], '2.0.0', '3.0.0') - const supported = isMinerva ? VM_ABI_MAP_MINERVA[txType] : VM_ABI_MAP_FORTUNA[txType] - if (!supported) throw new Error('Not supported tx type') + const version = this.consensusProtocolVersion + const supportedProtocol = PROTOCOL_VM_ABI[version] + if (!supportedProtocol) throw new Error('Not supported consensus protocol version') + const protocolForTX = supportedProtocol[txType] + if (!protocolForTX) throw new Error('Not supported tx type') const ctVersion = { - abiVersion: abiVersion !== undefined ? abiVersion : supported.abiVersion[0], - vmVersion: vmVersion !== undefined ? vmVersion : supported.vmVersion[0] + abiVersion: abiVersion !== undefined ? abiVersion : protocolForTX.abiVersion[0], + vmVersion: vmVersion !== undefined ? vmVersion : protocolForTX.vmVersion[0] } - if (supported.vmVersion.length && !R.contains(ctVersion.vmVersion, supported.vmVersion)) throw new Error(`VM VERSION ${ctVersion.vmVersion} do not support by this node. Supported: [${supported.vmVersion}]`) - if (!R.contains(ctVersion.abiVersion, supported.abiVersion)) throw new Error(`ABI VERSION ${ctVersion.abiVersion} do not support by this node. Supported: [${supported.abiVersion}]`) + if (protocolForTX.vmVersion.length && !R.contains(ctVersion.vmVersion, protocolForTX.vmVersion)) throw new Error(`VM VERSION ${ctVersion.vmVersion} do not support by this node. Supported: [${protocolForTX.vmVersion}]`) + if (!R.contains(ctVersion.abiVersion, protocolForTX.abiVersion)) throw new Error(`ABI VERSION ${ctVersion.abiVersion} do not support by this node. Supported: [${protocolForTX.abiVersion}]`) return ctVersion } diff --git a/examples/connect-two-ae/aepp/src/components/Home.vue b/examples/connect-two-ae/aepp/src/components/Home.vue index 5c00258824..3786a83342 100644 --- a/examples/connect-two-ae/aepp/src/components/Home.vue +++ b/examples/connect-two-ae/aepp/src/components/Home.vue @@ -157,8 +157,8 @@ spendResult: null, spendError: null, contractCode: `contract Identity = - type state = () - function main(x : int) = x`, + type state = () + function main(x : int) = x`, byteCode: null, compileError: null, contractInitState: [], diff --git a/package-lock.json b/package-lock.json index d213b7bbdf..f28182e5b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aeternity/aepp-sdk", - "version": "3.2.0", + "version": "3.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1992,6 +1992,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -4616,11 +4617,6 @@ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", "dev": true }, - "esm": { - "version": "3.2.23", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.23.tgz", - "integrity": "sha512-p7iNpE0K3nLn1KE2O0Vz/2Gpg93U+JroVqAdHZwK7l3MmPKh4iu5CEvw1Gym9DT23BgNNvnY5wOf9vMjBFw7Ug==" - }, "esprima": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", @@ -6131,6 +6127,11 @@ "minimalistic-assert": "^1.0.1" } }, + "hasurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hasurl/-/hasurl-1.0.0.tgz", + "integrity": "sha512-43ypUd3DbwyCT01UYpA99AEZxZ4aKtRxWGBHEIbjcOsUghd9YUON0C+JF6isNjaiwC/UF5neaUudy6JS9jZPZQ==" + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -6750,6 +6751,7 @@ "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -6758,7 +6760,8 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true } } }, @@ -7225,6 +7228,11 @@ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", "dev": true }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, "lolex": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.1.tgz", @@ -9645,7 +9653,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "sshpk": { "version": "1.14.2", @@ -10666,6 +10675,15 @@ "imurmurhash": "^0.1.4" } }, + "universal-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universal-url/-/universal-url-2.0.0.tgz", + "integrity": "sha512-3DLtXdm/G1LQMCnPj+Aw7uDoleQttNHp2g5FnNQKR6cP6taNWS1b/Ehjjx4PVyvejKi3TJyu8iBraKM4q3JQPg==", + "requires": { + "hasurl": "^1.0.0", + "whatwg-url": "^7.0.0" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -11071,6 +11089,36 @@ } } }, + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + } + } + }, "whatwg-url-compat": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz", diff --git a/package.json b/package.json index e82c122c25..415adc4275 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@aeternity/aepp-sdk", - "version": "3.2.1", + "version": "3.3.0", "description": "SDK for the æternity blockchain", "main": "dist/aepp-sdk.js", "browser": "dist/aepp-sdk.browser.js", @@ -39,14 +39,15 @@ "bs58check": "^2.1.1", "commander": "^2.14.1", "joi-browser": "^13.4.0", - "libsodium-wrappers-sumo": "0.7.3", "json-bigint": "github:davidyuk/json-bigint", + "libsodium-wrappers-sumo": "0.7.3", "ramda": "^0.25.0", "rlp": "2.1.0", "serialize-javascript": "^1.5.0", "sha.js": "^2.4.11", "tweetnacl": "^1.0.0", "tweetnacl-auth": "^1.0.1", + "universal-url": "^2.0.0", "uuid": "^3.3.2", "websocket": "^1.0.26" }, diff --git a/test/integration/accounts.js b/test/integration/accounts.js index 2031429e9f..fff7749c1f 100644 --- a/test/integration/accounts.js +++ b/test/integration/accounts.js @@ -46,6 +46,14 @@ describe('Accounts', function () { it('spending tokens', async () => { return wallet.spend(1, receiver).should.be.rejectedWith(Error) }) + + it('spending minus amount of tokens', async () => { + try { + await wallet.spend(-1, receiver) + } catch (e) { + e.message.should.be.equal('Transaction build error. {"amount":"-1 must be >= 0"}') + } + }) }) it('determines the balance', async () => { diff --git a/test/integration/channel.js b/test/integration/channel.js index 88602fe430..0f63a667d1 100644 --- a/test/integration/channel.js +++ b/test/integration/channel.js @@ -147,17 +147,43 @@ describe('Channel', function () { result.signedTx.should.be.a('string') sinon.assert.notCalled(initiatorSign) sinon.assert.calledOnce(responderSign) - sinon.assert.calledWithExactly(responderSign, sinon.match('update_ack'), sinon.match.string) + sinon.assert.calledWithExactly( + responderSign, + sinon.match('update_ack'), + sinon.match.string, + sinon.match({ + updates: sinon.match([{ + amount: sinon.match(amount), + from: sinon.match(await initiator.address()), + to: sinon.match(await responder.address()), + op: sinon.match('OffChainTransfer') + }]) + }) + ) sinon.assert.calledOnce(sign) - sinon.assert.calledWithExactly(sign, sinon.match.string) - const { txType, tx: { updates } } = unpackTx(sign.firstCall.args[0]) + sinon.assert.calledWithExactly( + sign, + sinon.match.string, + sinon.match({ + updates: sinon.match([{ + amount: sinon.match(amount), + from: sinon.match(await initiator.address()), + to: sinon.match(await responder.address()), + op: sinon.match('OffChainTransfer') + }]) + }) + ) + const { txType } = unpackTx(sign.firstCall.args[0]) txType.should.equal('channelOffChain') - updates[0].txType.should.equal('channelOffChainUpdateTransfer') - updates[0].tx.should.eql({ - ...updates[0].tx, - from: await initiator.address(), - to: await responder.address(), - amount: amount.toString() + sign.firstCall.args[1].should.eql({ + updates: [ + { + amount, + from: await initiator.address(), + to: await responder.address(), + op: 'OffChainTransfer' + } + ] }) }) @@ -174,17 +200,43 @@ describe('Channel', function () { result.accepted.should.equal(false) sinon.assert.notCalled(initiatorSign) sinon.assert.calledOnce(responderSign) - sinon.assert.calledWithExactly(responderSign, sinon.match('update_ack'), sinon.match.string) + sinon.assert.calledWithExactly( + responderSign, + sinon.match('update_ack'), + sinon.match.string, + sinon.match({ + updates: sinon.match([{ + amount: sinon.match(amount), + from: sinon.match(await responder.address()), + to: sinon.match(await initiator.address()), + op: sinon.match('OffChainTransfer') + }]) + }) + ) sinon.assert.calledOnce(sign) - sinon.assert.calledWithExactly(sign, sinon.match.string) - const { txType, tx: { updates } } = unpackTx(sign.firstCall.args[0]) + sinon.assert.calledWithExactly( + sign, + sinon.match.string, + sinon.match({ + updates: sinon.match([{ + amount: sinon.match(amount), + from: sinon.match(await responder.address()), + to: sinon.match(await initiator.address()), + op: sinon.match('OffChainTransfer') + }]) + }) + ) + const { txType } = unpackTx(sign.firstCall.args[0]) txType.should.equal('channelOffChain') - updates[0].txType.should.equal('channelOffChainUpdateTransfer') - updates[0].tx.should.eql({ - ...updates[0].tx, - from: await responder.address(), - to: await initiator.address(), - amount: amount.toString() + sign.firstCall.args[1].should.eql({ + updates: [ + { + amount, + from: await responder.address(), + to: await initiator.address(), + op: 'OffChainTransfer' + } + ] }) }) @@ -250,9 +302,30 @@ describe('Channel', function () { sinon.assert.calledOnce(onWithdrawLocked) sinon.assert.notCalled(initiatorSign) sinon.assert.calledOnce(responderSign) - sinon.assert.calledWithExactly(responderSign, sinon.match('withdraw_ack'), sinon.match.string) + sinon.assert.calledWithExactly( + responderSign, + sinon.match('withdraw_ack'), + sinon.match.string, + sinon.match({ + updates: [{ + amount, + op: 'OffChainWithdrawal', + to: await initiator.address() + }] + }) + ) sinon.assert.calledOnce(sign) - sinon.assert.calledWithExactly(sign, sinon.match.string) + sinon.assert.calledWithExactly( + sign, + sinon.match.string, + sinon.match({ + updates: [{ + amount, + op: 'OffChainWithdrawal', + to: await initiator.address() + }] + }) + ) const { txType, tx } = unpackTx(sign.firstCall.args[0]) txType.should.equal('channelWithdraw') tx.should.eql({ @@ -280,9 +353,30 @@ describe('Channel', function () { sinon.assert.notCalled(onWithdrawLocked) sinon.assert.notCalled(initiatorSign) sinon.assert.calledOnce(responderSign) - sinon.assert.calledWithExactly(responderSign, sinon.match('withdraw_ack'), sinon.match.string) + sinon.assert.calledWithExactly( + responderSign, + sinon.match('withdraw_ack'), + sinon.match.string, + sinon.match({ + updates: [{ + amount, + op: 'OffChainWithdrawal', + to: await initiator.address() + }] + }) + ) sinon.assert.calledOnce(sign) - sinon.assert.calledWithExactly(sign, sinon.match.string) + sinon.assert.calledWithExactly( + sign, + sinon.match.string, + sinon.match({ + updates: [{ + amount, + op: 'OffChainWithdrawal', + to: await initiator.address() + }] + }) + ) const { txType, tx } = unpackTx(sign.firstCall.args[0]) txType.should.equal('channelWithdraw') tx.should.eql({ @@ -311,9 +405,30 @@ describe('Channel', function () { sinon.assert.calledOnce(onDepositLocked) sinon.assert.notCalled(initiatorSign) sinon.assert.calledOnce(responderSign) - sinon.assert.calledWithExactly(responderSign, sinon.match('deposit_ack'), sinon.match.string) + sinon.assert.calledWithExactly( + responderSign, + sinon.match('deposit_ack'), + sinon.match.string, + sinon.match({ + updates: sinon.match([{ + amount, + op: 'OffChainDeposit', + from: await initiator.address() + }]) + }) + ) sinon.assert.calledOnce(sign) - sinon.assert.calledWithExactly(sign, sinon.match.string) + sinon.assert.calledWithExactly( + sign, + sinon.match.string, + sinon.match({ + updates: sinon.match([{ + amount, + op: 'OffChainDeposit', + from: await initiator.address() + }]) + }) + ) const { txType, tx } = unpackTx(sign.firstCall.args[0]) txType.should.equal('channelDeposit') tx.should.eql({ @@ -341,7 +456,18 @@ describe('Channel', function () { sinon.assert.notCalled(onDepositLocked) sinon.assert.notCalled(initiatorSign) sinon.assert.calledOnce(responderSign) - sinon.assert.calledWithExactly(responderSign, sinon.match('deposit_ack'), sinon.match.string) + sinon.assert.calledWithExactly( + responderSign, + sinon.match('deposit_ack'), + sinon.match.string, + sinon.match({ + updates: [{ + amount, + op: 'OffChainDeposit', + from: await initiator.address() + }] + }) + ) const { txType, tx } = unpackTx(sign.firstCall.args[0]) txType.should.equal('channelDeposit') tx.should.eql({ @@ -357,7 +483,12 @@ describe('Channel', function () { result.should.be.a('string') sinon.assert.notCalled(initiatorSign) sinon.assert.calledOnce(responderSign) - sinon.assert.calledWithExactly(responderSign, sinon.match('shutdown_sign_ack'), sinon.match.string) + sinon.assert.calledWithExactly( + responderSign, + sinon.match('shutdown_sign_ack'), + sinon.match.string, + sinon.match.any + ) sinon.assert.calledOnce(sign) sinon.assert.calledWithExactly(sign, sinon.match.string) const { txType, tx } = unpackTx(sign.firstCall.args[0]) @@ -550,7 +681,7 @@ describe('Channel', function () { code, callData, deposit: 1000, - vmVersion: 3, + vmVersion: 4, abiVersion: 1 }, async (tx) => await initiator.signTransaction(tx)) result.should.eql({ accepted: true, address: result.address, signedTx: (await initiatorCh.state()).signedTx }) @@ -566,7 +697,7 @@ describe('Channel', function () { code, callData, deposit: 1000, - vmVersion: 3, + vmVersion: 4, abiVersion: 1 }, async (tx) => await initiator.signTransaction(tx)) result.should.eql({ accepted: false }) @@ -656,7 +787,7 @@ describe('Channel', function () { id: contractAddress, ownerId: await initiator.address(), referrerIds: [], - vmVersion: 3, + vmVersion: 4, }, contractState: result.contractState }) @@ -715,7 +846,7 @@ describe('Channel', function () { }) it('when posting incorrect update tx', async () => { - return update({ sign: () => 'abcdefg' }).should.eventually.be.rejectedWith('Internal error') + return update({ sign: () => 'abcdefg' }).should.eventually.be.rejectedWith('Rejected') }) }) })