@aeternity/aepp-sdk
Version:
SDK for the æternity blockchain
1,089 lines (1,017 loc) • 39.4 kB
JavaScript
/**
* Transaction Schema for TxBuilder
* @module @aeternity/aepp-sdk/es/tx/builder/schema
* @export TxSchema
* @example import TxSchema from '@aeternity/aepp-sdk/es/tx/builder/schema'
*/
/* eslint-disable no-unused-vars */
// # RLP version number
// # https://github.com/aeternity/protocol/blob/master/serializations.md#binary-serialization
import BigNumber from 'bignumber.js'
export const VSN = 1
// # Tag constant for ids (type uint8)
// # see https://github.com/aeternity/protocol/blob/master/serializations.md#the-id-type
// # <<Tag:1/unsigned-integer-unit:8, Hash:32/binary-unit:8>>
const ID_TAG_ACCOUNT = 1
const ID_TAG_NAME = 2
const ID_TAG_COMMITMENT = 3
const ID_TAG_ORACLE = 4
const ID_TAG_CONTRACT = 5
const ID_TAG_CHANNEL = 6
// # OBJECT tags
// # see https://github.com/aeternity/protocol/blob/master/serializations.md#binary-serialization
const OBJECT_TAG_ACCOUNT = 10
export const OBJECT_TAG_SIGNED_TRANSACTION = 11
const OBJECT_TAG_SPEND_TRANSACTION = 12
const OBJECT_TAG_ORACLE_REGISTER_TRANSACTION = 22
const OBJECT_TAG_ORACLE_QUERY_TRANSACTION = 23
const OBJECT_TAG_ORACLE_RESPONSE_TRANSACTION = 24
const OBJECT_TAG_ORACLE_EXTEND_TRANSACTION = 25
const OBJECT_TAG_NAME_SERVICE_CLAIM_TRANSACTION = 32
const OBJECT_TAG_NAME_SERVICE_PRECLAIM_TRANSACTION = 33
const OBJECT_TAG_NAME_SERVICE_UPDATE_TRANSACTION = 34
const OBJECT_TAG_NAME_SERVICE_REVOKE_TRANSACTION = 35
const OBJECT_TAG_NAME_SERVICE_TRANSFER_TRANSACTION = 36
const OBJECT_TAG_CONTRACT = 40
const OBJECT_TAG_CONTRACT_CALL = 41
const OBJECT_TAG_CONTRACT_CREATE_TRANSACTION = 42
const OBJECT_TAG_CONTRACT_CALL_TRANSACTION = 43
const OBJECT_TAG_CHANNEL_CREATE_TX = 50
const OBJECT_TAG_CHANNEL_DEPOSIT_TX = 51
const OBJECT_TAG_CHANNEL_WITHRAW_TX = 52
const OBJECT_TAG_CHANNEL_CLOSE_MUTUAL_TX = 53
const OBJECT_TAG_CHANNEL_CLOSE_SOLO_TX = 54
const OBJECT_TAG_CHANNEL_SLASH_TX = 55
const OBJECT_TAG_CHANNEL_SETTLE_TX = 56
const OBJECT_TAG_CHANNEL_OFFCHAIN_TX = 57
const OBJECT_TAG_CHANNEL = 58
const OBJECT_TAG_CHANNEL_SNAPSHOT_SOLO_TX = 59
const OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_TRANSFER_TX = 570
const OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_DEPOSIT_TX = 571
const OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_WITHDRAWAL_TX = 572
const OBJECT_TAG_CHANNEL_OFFCHAIN_CREATE_CONTRACT_TX = 573
const OBJECT_TAG_CHANNEL_OFFCHAIN_CALL_CONTRACT_TX = 574
const OBJECT_TAG_PROOF_OF_INCLUSION = 60
const OBJECT_TAG_STATE_TREES = 62
const OBJECT_TAG_MERKLE_PATRICIA_TREE = 63
const OBJECT_TAG_MERKLE_PATRICIA_TREE_VALUE = 64
const OBJECT_TAG_CONTRACTS_TREE = 621
const OBJECT_TAG_CONTRACT_CALLS_TREE = 622
const OBJECT_TAG_CHANNELS_TREE = 623
const OBJECT_TAG_NAMESERVICE_TREE = 624
const OBJECT_TAG_ORACLES_TREE = 625
const OBJECT_TAG_ACCOUNTS_TREE = 626
const TX_FIELD = (name, type, prefix) => [name, type, prefix]
const TX_SCHEMA_FIELD = (schema, objectId) => [schema, objectId]
export const MIN_GAS_PRICE = 1000000000 // min gasPrice 1e9
const revertObject = (obj) => Object.entries(obj).reduce((acc, [key, v]) => (acc[v] = key) && acc, {})
/**
* @constant
* @description Object with transaction types
* @type {Object} TX_TYPE
* @alias module:@aeternity/aepp-sdk/es/tx/builder/schema
* @property {String} signed
* @property {String} spend
* @property {String} nameClaim
* @property {String} namePreClaim
* @property {String} nameUpdate
* @property {String} nameRevoke
* @property {String} nameTransfer
* @property {String} contractCreate
* @property {String} contractCall
* @property {String} oracleRegister
* @property {String} oracleExtend
* @property {String} oracleQuery
* @property {String} oracleResponse
*/
export const TX_TYPE = {
account: 'account',
signed: 'signedTx',
spend: 'spendTx',
// AENS
nameClaim: 'nameClaimTx',
namePreClaim: 'namePreClaimTx',
nameUpdate: 'nameUpdateTx',
nameRevoke: 'nameRevokeTx',
nameTransfer: 'nameTransfer',
// CONTRACT
contract: 'contract',
contractCreate: 'contractCreateTx',
contractCall: 'contractCallTx',
contractCallResult: 'contractCallResult',
// ORACLE
oracleRegister: 'oracleRegister',
oracleExtend: 'oracleExtend',
oracleQuery: 'oracleQuery',
oracleResponse: 'oracleResponse',
// STATE CHANNEL
channelCreate: 'channelCreate',
channelCloseMutual: 'channelCloseMutual',
channelCloseSolo: 'channelCloseSolo',
channelSlash: 'channelSlash',
channelDeposit: 'channelDeposit',
channelWithdraw: 'channelWithdraw',
channelSettle: 'channelSettle',
channelOffChain: 'channelOffChain',
channel: 'channel',
channelSnapshotSolo: 'channelSnapshotSolo',
channelOffChainUpdateTransfer: 'channelOffChainUpdateTransfer',
channelOffChainUpdateDeposit: 'channelOffChainUpdateDeposit',
channelOffChainUpdateWithdrawal: 'channelOffChainUpdateWithdrawal',
channelOffChainCreateContract: 'channelOffChainCreateContract',
channelOffChainCallContract: 'channelOffChainCallContract',
proofOfInclusion: 'proofOfInclusion',
stateTrees: 'stateTrees',
merklePatriciaTree: 'merklePatriciaTree',
merklePatriciaTreeValue: 'merklePatriciaTreeValue',
contractsTree: 'contractsTree',
contractCallsTree: 'contractCallsTree',
channelsTree: 'channelsTree',
nameserviceTree: 'nameserviceTree',
oraclesTree: 'oraclesTree',
accountsTree: 'accountsTree'
}
// # see https://github.com/aeternity/protocol/blob/minerva/contracts/contract_vms.md#virtual-machines-on-the-%C3%A6ternity-blockchain
export const VM_VERSIONS = {
NO_VM: 0,
SOPHIA: 1,
SOLIDITY: 2,
SOPHIA_IMPROVEMENTS_MINERVA: 3,
SOPHIA_IMPROVEMENTS_FORTUNA: 4
}
// # see https://github.com/aeternity/protocol/blob/minerva/contracts/contract_vms.md#virtual-machines-on-the-%C3%A6ternity-blockchain
export const ABI_VERSIONS = {
NO_ABI: 0,
SOPHIA: 1,
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_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_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,
[OBJECT_TAG_SPEND_TRANSACTION]: TX_TYPE.spend,
// AENS
[OBJECT_TAG_NAME_SERVICE_CLAIM_TRANSACTION]: TX_TYPE.nameClaim,
[OBJECT_TAG_NAME_SERVICE_PRECLAIM_TRANSACTION]: TX_TYPE.namePreClaim,
[OBJECT_TAG_NAME_SERVICE_UPDATE_TRANSACTION]: TX_TYPE.nameUpdate,
[OBJECT_TAG_NAME_SERVICE_REVOKE_TRANSACTION]: TX_TYPE.nameRevoke,
[OBJECT_TAG_NAME_SERVICE_TRANSFER_TRANSACTION]: TX_TYPE.nameTransfer,
// CONTRACT
[OBJECT_TAG_CONTRACT]: TX_TYPE.contract,
[OBJECT_TAG_CONTRACT_CREATE_TRANSACTION]: TX_TYPE.contractCreate,
[OBJECT_TAG_CONTRACT_CALL_TRANSACTION]: TX_TYPE.contractCall,
[OBJECT_TAG_CONTRACT_CALL]: TX_TYPE.contractCallResult,
// ORACLE
[OBJECT_TAG_ORACLE_REGISTER_TRANSACTION]: TX_TYPE.oracleRegister,
[OBJECT_TAG_ORACLE_EXTEND_TRANSACTION]: TX_TYPE.oracleExtend,
[OBJECT_TAG_ORACLE_QUERY_TRANSACTION]: TX_TYPE.oracleQuery,
[OBJECT_TAG_ORACLE_RESPONSE_TRANSACTION]: TX_TYPE.oracleResponse,
// STATE CHANNEL
[OBJECT_TAG_CHANNEL_CREATE_TX]: TX_TYPE.channelCreate,
[OBJECT_TAG_CHANNEL_CLOSE_MUTUAL_TX]: TX_TYPE.channelCloseMutual,
[OBJECT_TAG_CHANNEL_CLOSE_SOLO_TX]: TX_TYPE.channelCloseSolo,
[OBJECT_TAG_CHANNEL_SLASH_TX]: TX_TYPE.channelSlash,
[OBJECT_TAG_CHANNEL_DEPOSIT_TX]: TX_TYPE.channelDeposit,
[OBJECT_TAG_CHANNEL_WITHRAW_TX]: TX_TYPE.channelWithdraw,
[OBJECT_TAG_CHANNEL_SETTLE_TX]: TX_TYPE.channelSettle,
[OBJECT_TAG_CHANNEL_OFFCHAIN_TX]: TX_TYPE.channelOffChain,
[OBJECT_TAG_CHANNEL]: TX_TYPE.channel,
[OBJECT_TAG_CHANNEL_SNAPSHOT_SOLO_TX]: TX_TYPE.channelSnapshotSolo,
[OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_TRANSFER_TX]: TX_TYPE.channelOffChainUpdateTransfer,
[OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_DEPOSIT_TX]: TX_TYPE.channelOffChainUpdateDeposit,
[OBJECT_TAG_CHANNEL_OFFCHAIN_UPDATE_WITHDRAWAL_TX]: TX_TYPE.channelOffChainUpdateWithdrawal,
[OBJECT_TAG_CHANNEL_OFFCHAIN_CREATE_CONTRACT_TX]: TX_TYPE.channelOffChainCreateContract,
[OBJECT_TAG_CHANNEL_OFFCHAIN_CALL_CONTRACT_TX]: TX_TYPE.channelOffChainCallContract,
[OBJECT_TAG_PROOF_OF_INCLUSION]: TX_TYPE.proofOfInclusion,
[OBJECT_TAG_STATE_TREES]: TX_TYPE.stateTrees,
[OBJECT_TAG_MERKLE_PATRICIA_TREE]: TX_TYPE.merklePatriciaTree,
[OBJECT_TAG_MERKLE_PATRICIA_TREE_VALUE]: TX_TYPE.merklePatriciaTreeValue,
[OBJECT_TAG_CONTRACTS_TREE]: TX_TYPE.contractsTree,
[OBJECT_TAG_CONTRACT_CALLS_TREE]: TX_TYPE.contractCallsTree,
[OBJECT_TAG_CHANNELS_TREE]: TX_TYPE.channelsTree,
[OBJECT_TAG_NAMESERVICE_TREE]: TX_TYPE.nameserviceTree,
[OBJECT_TAG_ORACLES_TREE]: TX_TYPE.oraclesTree,
[OBJECT_TAG_ACCOUNTS_TREE]: TX_TYPE.accountsTree
}
export const FIELD_TYPES = {
int: 'int',
id: 'id',
ids: 'ids',
string: 'string',
binary: 'binary',
rlpBinary: 'rlpBinary',
rlpBinaries: 'rlpBinaries',
rawBinary: 'rawBinary',
bool: 'bool',
hex: 'hex',
signatures: 'signatures',
pointers: 'pointers',
offChainUpdates: 'offChainUpdates',
callStack: 'callStack',
proofOfInclusion: 'proofOfInclusion',
mptree: 'mptree',
callReturnType: 'callReturnType',
ctVersion: 'ctVersion',
payload: 'payload'
}
// FEE CALCULATION
export const BASE_GAS = 15000
export const GAS_PER_BYTE = 20
export const DEFAULT_FEE = 20000
export const KEY_BLOCK_INTERVAL = 3
// MAP WITH FEE CALCULATION https://github.com/aeternity/protocol/blob/master/consensus/consensus.md#gas
export const TX_FEE_BASE_GAS = (txType) => {
switch (txType) {
case TX_TYPE.contractCreate:
return BigNumber(5 * BASE_GAS)
case TX_TYPE.contractCall:
return BigNumber(30 * BASE_GAS)
default:
return BigNumber(BASE_GAS)
}
}
export const TX_FEE_OTHER_GAS = (txType) => ({ txSize, relativeTtl }) => {
switch (txType) {
case TX_TYPE.oracleRegister:
case TX_TYPE.oracleExtend:
case TX_TYPE.oracleQuery:
case TX_TYPE.oracleResponse:
return BigNumber(txSize)
.times(GAS_PER_BYTE)
.plus(
Math.ceil(32000 * relativeTtl / Math.floor(60 * 24 * 365 / KEY_BLOCK_INTERVAL))
)
default:
return BigNumber(txSize).times(GAS_PER_BYTE)
}
}
export const ID_TAG = {
account: ID_TAG_ACCOUNT,
name: ID_TAG_NAME,
commitment: ID_TAG_COMMITMENT,
oracle: ID_TAG_ORACLE,
contract: ID_TAG_CONTRACT,
channel: ID_TAG_CHANNEL
}
export const PREFIX_ID_TAG = {
'ak': ID_TAG.account,
'nm': ID_TAG.name,
'cm': ID_TAG.commitment,
'ok': ID_TAG.oracle,
'ct': ID_TAG.contract,
'ch': ID_TAG.channel
}
export const ID_TAG_PREFIX = revertObject(PREFIX_ID_TAG)
const VALIDATION_ERROR = (msg) => msg
export const VALIDATION_MESSAGE = {
[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`),
[FIELD_TYPES.pointers]: ({ value }) => VALIDATION_ERROR(`Value must be of type Array and contains only object's like '{key: "account_pubkey", id: "ak_lkamsflkalsdalksdlasdlasdlamd"}'`),
[FIELD_TYPES.ctVersion]: ({ value }) => VALIDATION_ERROR(`Value must be an object with "vmVersion" and "abiVersion" fields`)
}
const BASE_TX = [
TX_FIELD('tag', FIELD_TYPES.int),
TX_FIELD('VSN', FIELD_TYPES.int)
]
const ACCOUNT_TX = [
...BASE_TX,
TX_FIELD('nonce', FIELD_TYPES.int),
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'),
TX_FIELD('recipientId', FIELD_TYPES.id, 'ak'),
TX_FIELD('amount', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int),
TX_FIELD('nonce', FIELD_TYPES.int),
TX_FIELD('payload', FIELD_TYPES.payload)
]
const SIGNED_TX = [
...BASE_TX,
TX_FIELD('signatures', FIELD_TYPES.signatures),
TX_FIELD('encodedTx', FIELD_TYPES.rlpBinary)
]
const NAME_PRE_CLAIM_TX = [
...BASE_TX,
TX_FIELD('accountId', FIELD_TYPES.id, 'ak'),
TX_FIELD('nonce', FIELD_TYPES.int),
TX_FIELD('commitmentId', FIELD_TYPES.id, 'cm'),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int)
]
const NAME_CLAIM_TX = [
...BASE_TX,
TX_FIELD('accountId', FIELD_TYPES.id, 'ak'),
TX_FIELD('nonce', FIELD_TYPES.int),
TX_FIELD('name', FIELD_TYPES.binary, 'nm'),
TX_FIELD('nameSalt', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int)
]
const NAME_UPDATE_TX = [
...BASE_TX,
TX_FIELD('accountId', FIELD_TYPES.id, 'ak'),
TX_FIELD('nonce', FIELD_TYPES.int),
TX_FIELD('nameId', FIELD_TYPES.id, 'nm'),
TX_FIELD('nameTtl', FIELD_TYPES.int),
TX_FIELD('pointers', FIELD_TYPES.pointers),
TX_FIELD('clientTtl', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int)
]
const NAME_TRANSFER_TX = [
...BASE_TX,
TX_FIELD('accountId', FIELD_TYPES.id, 'ak'),
TX_FIELD('nonce', FIELD_TYPES.int),
TX_FIELD('nameId', FIELD_TYPES.id, 'nm'),
TX_FIELD('recipientId', FIELD_TYPES.id, 'ak'),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int)
]
const NAME_REVOKE_TX = [
...BASE_TX,
TX_FIELD('accountId', FIELD_TYPES.id, 'ak'),
TX_FIELD('nonce', FIELD_TYPES.int),
TX_FIELD('nameId', FIELD_TYPES.id, 'nm'),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int)
]
const CONTRACT_TX = [
...BASE_TX,
TX_FIELD('owner', FIELD_TYPES.id, 'ak'),
TX_FIELD('ctVersion', FIELD_TYPES.int),
TX_FIELD('code', FIELD_TYPES.binary, 'cb'),
TX_FIELD('log', FIELD_TYPES.binary, 'cb'),
TX_FIELD('active', FIELD_TYPES.bool),
TX_FIELD('referers', FIELD_TYPES.ids, 'ak'),
TX_FIELD('deposit', FIELD_TYPES.int)
]
const CONTRACT_CREATE_TX = [
...BASE_TX,
TX_FIELD('ownerId', FIELD_TYPES.id, 'ak'),
TX_FIELD('nonce', FIELD_TYPES.int),
TX_FIELD('code', FIELD_TYPES.binary, 'cb'),
TX_FIELD('ctVersion', FIELD_TYPES.ctVersion),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int),
TX_FIELD('deposit', FIELD_TYPES.int),
TX_FIELD('amount', FIELD_TYPES.int),
TX_FIELD('gas', FIELD_TYPES.int),
TX_FIELD('gasPrice', FIELD_TYPES.int),
TX_FIELD('callData', FIELD_TYPES.binary, 'cb')
]
const CONTRACT_CALL_TX = [
...BASE_TX,
TX_FIELD('callerId', FIELD_TYPES.id, 'ak'),
TX_FIELD('nonce', FIELD_TYPES.int),
TX_FIELD('contractId', FIELD_TYPES.id, 'ct'),
TX_FIELD('abiVersion', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int),
TX_FIELD('amount', FIELD_TYPES.int),
TX_FIELD('gas', FIELD_TYPES.int),
TX_FIELD('gasPrice', FIELD_TYPES.int),
TX_FIELD('callData', FIELD_TYPES.binary, 'cb')
]
const CONTRACT_CALL_RESULT_TX = [
...BASE_TX,
TX_FIELD('callerId', FIELD_TYPES.id, 'ak'),
TX_FIELD('callerNonce', FIELD_TYPES.int),
TX_FIELD('height', FIELD_TYPES.int),
TX_FIELD('contractId', FIELD_TYPES.id, 'ct'),
TX_FIELD('gasPrice', FIELD_TYPES.int),
TX_FIELD('gasUsed', FIELD_TYPES.int),
TX_FIELD('returnValue', FIELD_TYPES.binary, 'cb'),
TX_FIELD('returnType', FIELD_TYPES.callReturnType),
// TODO: add serialization for <log> :: [ { <address> :: id, [ <topics> :: binary() ], <data> :: binary() } ]
TX_FIELD('log', FIELD_TYPES.rawBinary)
]
const ORACLE_REGISTER_TX = [
...BASE_TX,
TX_FIELD('accountId', FIELD_TYPES.id, 'ak'),
TX_FIELD('nonce', FIELD_TYPES.int),
TX_FIELD('queryFormat', FIELD_TYPES.string),
TX_FIELD('responseFormat', FIELD_TYPES.string),
TX_FIELD('queryFee', FIELD_TYPES.int),
TX_FIELD('oracleTtlType', FIELD_TYPES.int),
TX_FIELD('oracleTtlValue', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int),
TX_FIELD('abiVersion', FIELD_TYPES.int)
]
const ORACLE_EXTEND_TX = [
...BASE_TX,
TX_FIELD('oracleId', FIELD_TYPES.id, 'ok'),
TX_FIELD('nonce', FIELD_TYPES.int),
TX_FIELD('oracleTtlType', FIELD_TYPES.int),
TX_FIELD('oracleTtlValue', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int)
]
const ORACLE_QUERY_TX = [
...BASE_TX,
TX_FIELD('senderId', FIELD_TYPES.id, 'ak'),
TX_FIELD('nonce', FIELD_TYPES.int),
TX_FIELD('oracleId', FIELD_TYPES.id, 'ok'),
TX_FIELD('query', FIELD_TYPES.string),
TX_FIELD('queryFee', FIELD_TYPES.int),
TX_FIELD('queryTtlType', FIELD_TYPES.int),
TX_FIELD('queryTtlValue', FIELD_TYPES.int),
TX_FIELD('responseTtlType', FIELD_TYPES.int),
TX_FIELD('responseTtlValue', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int)
]
const ORACLE_RESPOND_TX = [
...BASE_TX,
TX_FIELD('oracleId', FIELD_TYPES.id, 'ok'),
TX_FIELD('nonce', FIELD_TYPES.int),
TX_FIELD('queryId', FIELD_TYPES.binary, 'oq'),
TX_FIELD('response', FIELD_TYPES.string),
TX_FIELD('responseTtlType', FIELD_TYPES.int),
TX_FIELD('responseTtlValue', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int)
]
const CHANNEL_CREATE_TX = [
...BASE_TX,
TX_FIELD('initiator', FIELD_TYPES.id, 'ak'),
TX_FIELD('initiatorAmount', FIELD_TYPES.int),
TX_FIELD('responder', FIELD_TYPES.id, 'ak'),
TX_FIELD('responderAmount', FIELD_TYPES.int),
TX_FIELD('channelReserve', FIELD_TYPES.int),
TX_FIELD('lockPeriod', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('delegateIds', FIELD_TYPES.string),
TX_FIELD('stateHash', FIELD_TYPES.binary, 'st'),
TX_FIELD('nonce', FIELD_TYPES.int)
]
const CHANNEL_DEPOSIT_TX = [
...BASE_TX,
TX_FIELD('channelId', FIELD_TYPES.id, 'ch'),
TX_FIELD('fromId', FIELD_TYPES.id, 'ak'),
TX_FIELD('amount', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('stateHash', FIELD_TYPES.binary, 'st'),
TX_FIELD('round', FIELD_TYPES.int),
TX_FIELD('nonce', FIELD_TYPES.int)
]
const CHANNEL_WITHDRAW_TX = [
...BASE_TX,
TX_FIELD('channelId', FIELD_TYPES.id, 'ch'),
TX_FIELD('toId', FIELD_TYPES.id, 'ak'),
TX_FIELD('amount', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('stateHash', FIELD_TYPES.binary, 'st'),
TX_FIELD('round', FIELD_TYPES.int),
TX_FIELD('nonce', FIELD_TYPES.int)
]
const CHANNEL_CLOSE_MUTUAL_TX = [
...BASE_TX,
TX_FIELD('channelId', FIELD_TYPES.id, 'ch'),
TX_FIELD('fromId', FIELD_TYPES.id, 'ak'),
TX_FIELD('initiatorAmountFinal', FIELD_TYPES.int),
TX_FIELD('responderAmountFinal', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('nonce', FIELD_TYPES.int)
]
const CHANNEL_CLOSE_SOLO_TX = [
...BASE_TX,
TX_FIELD('channelId', FIELD_TYPES.id, 'ch'),
TX_FIELD('fromId', FIELD_TYPES.id, 'ak'),
TX_FIELD('payload', FIELD_TYPES.binary, 'tx'),
TX_FIELD('poi', FIELD_TYPES.binary, 'pi'),
TX_FIELD('ttl', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('nonce', FIELD_TYPES.int)
]
const CHANNEL_SLASH_TX = [
...BASE_TX,
TX_FIELD('channelId', FIELD_TYPES.id, 'ch'),
TX_FIELD('fromId', FIELD_TYPES.id, 'ak'),
TX_FIELD('payload', FIELD_TYPES.binary, 'tx'),
TX_FIELD('poi', FIELD_TYPES.binary, 'pi'),
TX_FIELD('ttl', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('nonce', FIELD_TYPES.int)
]
const CHANNEL_SETTLE_TX = [
...BASE_TX,
TX_FIELD('channelId', FIELD_TYPES.id, 'ch'),
TX_FIELD('fromId', FIELD_TYPES.id, 'ak'),
TX_FIELD('initiatorAmountFinal', FIELD_TYPES.int),
TX_FIELD('responderAmountFinal', FIELD_TYPES.int),
TX_FIELD('ttl', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('nonce', FIELD_TYPES.int)
]
const CHANNEL_OFFCHAIN_TX = [
...BASE_TX,
TX_FIELD('channelId', FIELD_TYPES.id, 'ch'),
TX_FIELD('round', FIELD_TYPES.int),
TX_FIELD('updates', FIELD_TYPES.offChainUpdates),
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'),
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)
]
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'),
TX_FIELD('fromId', FIELD_TYPES.id, 'ak'),
TX_FIELD('payload', FIELD_TYPES.binary, 'tx'),
TX_FIELD('ttl', FIELD_TYPES.int),
TX_FIELD('fee', FIELD_TYPES.int),
TX_FIELD('nonce', FIELD_TYPES.int)
]
const CHANNEL_OFFCHAIN_CREATE_CONTRACT_TX = [
...BASE_TX,
TX_FIELD('owner', FIELD_TYPES.id, 'ak'),
TX_FIELD('ctVersion', FIELD_TYPES.int),
TX_FIELD('code', FIELD_TYPES.binary, 'cb'),
TX_FIELD('deposit', FIELD_TYPES.int),
TX_FIELD('callData', FIELD_TYPES.binary, 'cb')
]
const CHANNEL_OFFCHAIN_CALL_CONTRACT_TX = [
...BASE_TX,
TX_FIELD('caller', FIELD_TYPES.id, 'ak'),
TX_FIELD('contract', FIELD_TYPES.id, 'ct'),
TX_FIELD('abiVersion', FIELD_TYPES.int),
TX_FIELD('amount', FIELD_TYPES.int),
TX_FIELD('callData', FIELD_TYPES.binary, 'cb'),
TX_FIELD('callStack', FIELD_TYPES.callStack),
TX_FIELD('gasPrice', FIELD_TYPES.int),
TX_FIELD('gasLimit', FIELD_TYPES.int)
]
const CHANNEL_OFFCHAIN_UPDATE_TRANSFER_TX = [
...BASE_TX,
TX_FIELD('from', FIELD_TYPES.id, 'ak'),
TX_FIELD('to', FIELD_TYPES.id, 'ak'),
TX_FIELD('amount', FIELD_TYPES.int)
]
const CHANNEL_OFFCHAIN_UPDATE_DEPOSIT_TX = [
...BASE_TX,
TX_FIELD('from', FIELD_TYPES.id, 'ak'),
TX_FIELD('amount', FIELD_TYPES.int)
]
const CHANNEL_OFFCHAIN_UPDATE_WITHDRAWAL_TX = [
...BASE_TX,
TX_FIELD('from', FIELD_TYPES.id, 'ak'),
TX_FIELD('amount', FIELD_TYPES.int)
]
const PROOF_OF_INCLUSION_TX = [
...BASE_TX,
TX_FIELD('accounts', FIELD_TYPES.mptrees),
TX_FIELD('calls', FIELD_TYPES.mptrees),
TX_FIELD('channels', FIELD_TYPES.mptrees),
TX_FIELD('contracts', FIELD_TYPES.mptrees),
TX_FIELD('ns', FIELD_TYPES.mptrees),
TX_FIELD('oracles', FIELD_TYPES.mptrees)
]
const STATE_TREES_TX = [
...BASE_TX,
TX_FIELD('contracts', FIELD_TYPES.rlpBinary),
TX_FIELD('calls', FIELD_TYPES.rlpBinary),
TX_FIELD('channels', FIELD_TYPES.rlpBinary),
TX_FIELD('ns', FIELD_TYPES.rlpBinary),
TX_FIELD('oracles', FIELD_TYPES.rlpBinary),
TX_FIELD('accounts', FIELD_TYPES.rlpBinary)
]
const MERKLE_PATRICIA_TREE_TX = [
...BASE_TX,
TX_FIELD('values', FIELD_TYPES.rlpBinaries)
]
const MERKLE_PATRICIA_TREE_VALUE_TX = [
...BASE_TX,
TX_FIELD('key', FIELD_TYPES.hex),
TX_FIELD('value', FIELD_TYPES.rawBinary)
]
const CONTRACTS_TREE_TX = [
...BASE_TX,
TX_FIELD('contracts', FIELD_TYPES.rlpBinary)
]
const CONTRACT_CALLS_TREE_TX = [
...BASE_TX,
TX_FIELD('calls', FIELD_TYPES.rlpBinary)
]
const CHANNELS_TREE_TX = [
...BASE_TX,
TX_FIELD('channels', FIELD_TYPES.rlpBinary)
]
const NAMESERVICE_TREE_TX = [
...BASE_TX,
TX_FIELD('mtree', FIELD_TYPES.rlpBinary)
]
const ORACLES_TREE_TX = [
...BASE_TX,
TX_FIELD('otree', FIELD_TYPES.rlpBinary)
]
const ACCOUNTS_TREE_TX = [
...BASE_TX,
TX_FIELD('accounts', FIELD_TYPES.rlpBinary)
]
export const TX_SERIALIZATION_SCHEMA = {
[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]: {
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
const ERROR_TYPE = { ERROR: 'error', WARNING: 'warning' }
const VERIFICATION_FIELD = (msg, verificationFn, error) => [msg, verificationFn, error]
const VALIDATORS = {
signature: 'signature',
insufficientFee: 'insufficientFee',
expiredTTL: 'expiredTTL',
insufficientBalanceForAmountFee: 'insufficientBalanceForAmountFee',
insufficientBalanceForAmount: 'insufficientBalanceForAmount',
nonceUsed: 'nonceUsed',
nonceHigh: 'nonceHigh',
minGasPrice: 'minGasPrice',
vmAndAbiVersion: 'vmAndAbiVersion'
}
const ERRORS = {
invalidSignature: { key: 'InvalidSignature', type: ERROR_TYPE.ERROR, txKey: 'signature' },
insufficientFee: { key: 'InsufficientFee', type: ERROR_TYPE.ERROR, txKey: 'fee' },
expiredTTL: { key: 'ExpiredTTL', type: ERROR_TYPE.ERROR, txKey: 'ttl' },
insufficientBalanceForAmountFee: { key: 'InsufficientBalanceForAmountFee', type: ERROR_TYPE.WARNING, txKey: 'fee' },
insufficientBalanceForAmount: { key: 'InsufficientBalanceForAmount', type: ERROR_TYPE.WARNING, txKey: 'amount' },
nonceUsed: { key: 'NonceUsed', type: ERROR_TYPE.ERROR, txKey: 'nonce' },
nonceHigh: { key: 'NonceHigh', type: ERROR_TYPE.WARNING, txKey: 'nonce' },
minGasPrice: { key: 'minGasPrice', type: ERROR_TYPE.ERROR, txKey: 'gasPrice' },
vmAndAbiVersion: { key: 'vmAndAbiVersion', type: ERROR_TYPE.ERROR, txKey: 'ctVersion' }
}
export const SIGNATURE_VERIFICATION_SCHEMA = [
VERIFICATION_FIELD(
() => `The signature cannot be verified, please verify that you used the correct network id and the correct private key for the sender address`,
VALIDATORS.signature,
ERRORS.invalidSignature
)
]
export const CONTRACT_VERIFICATION_SCHEMA = [
VERIFICATION_FIELD(
({ ctVersion, consensusProtocolVersion, txType }) => `Wrong abi/vm version, Supported is: ${PROTOCOL_VM_ABI[consensusProtocolVersion] ? JSON.stringify(PROTOCOL_VM_ABI[consensusProtocolVersion][txType]) : ' None for this protocol ' + consensusProtocolVersion}`,
VALIDATORS.vmAndAbiVersion,
ERRORS.vmAndAbiVersion
),
VERIFICATION_FIELD(
() => `The gasPrice must be bigger then ${MIN_GAS_PRICE}`,
VALIDATORS.minGasPrice,
ERRORS.minGasPrice
)
]
export const BASE_VERIFICATION_SCHEMA = [
VERIFICATION_FIELD(
({ minFee }) => `The fee for the transaction is too low, the minimum fee for this transaction is ${minFee}`,
VALIDATORS.insufficientFee,
ERRORS.insufficientFee
),
VERIFICATION_FIELD(
({ height }) => `The TTL is already expired, the current height is ${height}`,
VALIDATORS.expiredTTL,
ERRORS.expiredTTL
),
VERIFICATION_FIELD(
({ balance }) => `The account balance ${balance} is not enough to execute the transaction`,
VALIDATORS.insufficientBalanceForAmountFee,
ERRORS.insufficientBalanceForAmountFee
),
VERIFICATION_FIELD(
({ balance }) => `The account balance ${balance} is not enough to execute the transaction`,
VALIDATORS.insufficientBalanceForAmount,
ERRORS.insufficientBalanceForAmount
),
VERIFICATION_FIELD(
({ accountNonce }) => `The nonce is invalid(already used). Next valid nonce is ${accountNonce + 1})`,
VALIDATORS.nonceUsed,
ERRORS.nonceUsed
),
VERIFICATION_FIELD(
({ accountNonce }) => `The nonce is technically valid but will not be processed immediately by the node (next valid nonce is ${accountNonce + 1})`,
VALIDATORS.nonceHigh,
ERRORS.nonceHigh
)
]