edge-core-js
Version:
Edge account & wallet management library
385 lines (248 loc) • 6.88 kB
JavaScript
import {
asArray,
asBoolean,
asEither,
asNull,
asNumber,
asObject,
asOptional,
asString,
asValue,
} from 'cleaners'
import { asMap, asTokenIdMap } from '../../../util/asMap'
import { asJsonObject } from '../../../util/file-helpers'
import { asEdgeMetadata } from './metadata'
// ---------------------------------------------------------------------
// building-block cleaners
// ---------------------------------------------------------------------
const asFeeRate = asValue(
'high',
'standard',
'low'
)
export const asEdgeTxSwap = asObject({
orderId: asOptional(asString),
orderUri: asOptional(asString),
isEstimate: asBoolean,
// The EdgeSwapInfo from the swap plugin:
plugin: asObject({
pluginId: asString,
displayName: asString,
supportEmail: asOptional(asString)
}),
// Address information:
payoutAddress: asString,
payoutCurrencyCode: asString,
payoutNativeAmount: asString,
payoutWalletId: asString,
refundAddress: asOptional(asString)
})
export function asIntegerString(raw) {
const clean = asString(raw)
if (!/^\d+$/.test(clean)) {
throw new Error('Expected an integer string')
}
return clean
}
// ---------------------------------------------------------------------
// file cleaners
// ---------------------------------------------------------------------
export const asEdgeTokenId = asEither(asString, asNull)
export const asEdgeAssetAmount = asObject({
pluginId: asString,
tokenId: asEdgeTokenId,
nativeAmount: asOptional(asIntegerString)
})
export const asEdgeFiatAmount = asObject({
// core-js style fiat code including 'iso:'
fiatCurrencyCode: asString,
fiatAmount: asString
})
export const asEdgeSwapInfo = asObject({
pluginId: asString,
displayName: asString,
isDex: asOptional(asBoolean),
orderUri: asOptional(asString), // The orderId would be appended to this
supportEmail: asString
})
export const asEdgeTxActionSwap = asObject({
actionType: asValue('swap'),
swapInfo: asEdgeSwapInfo,
orderId: asOptional(asString),
orderUri: asOptional(asString),
isEstimate: asOptional(asBoolean),
canBePartial: asOptional(asBoolean),
fromAsset: asEdgeAssetAmount,
toAsset: asEdgeAssetAmount,
payoutWalletId: asString,
payoutAddress: asString,
refundAddress: asOptional(asString)
})
export const asEdgeTxActionStake = asObject({
actionType: asValue('stake'),
pluginId: asString,
stakeAssets: asArray(asEdgeAssetAmount)
})
export const asEdgeTxActionFiat = asObject({
actionType: asValue('fiat'),
orderId: asString,
orderUri: asOptional(asString),
isEstimate: asBoolean,
fiatPlugin: asObject({
providerId: asString,
providerDisplayName: asString,
supportEmail: asOptional(asString)
}),
payinAddress: asOptional(asString),
payoutAddress: asOptional(asString),
fiatAsset: asEdgeFiatAmount,
cryptoAsset: asEdgeAssetAmount
})
export const asEdgeTxActionTokenApproval = asObject({
actionType: asValue('tokenApproval'),
tokenApproved: asEdgeAssetAmount,
tokenContractAddress: asString,
contractAddress: asString
})
export const asEdgeTxAction = asEither(
asEdgeTxActionSwap,
asEdgeTxActionStake,
asEdgeTxActionFiat,
asEdgeTxActionTokenApproval
)
export const asEdgeAssetActionType = asValue(
'claim',
'claimOrder',
'stake',
'stakeNetworkFee',
'stakeOrder',
'unstake',
'unstakeNetworkFee',
'unstakeOrder',
'swap',
'swapNetworkFee',
'swapOrderPost',
'swapOrderFill',
'swapOrderCancel',
'buy',
'sell',
'sellNetworkFee',
'tokenApproval',
'transfer',
'transferNetworkFee'
)
export const asEdgeAssetAction = asObject({
assetActionType: asEdgeAssetActionType
})
/**
* Old core versions used currency codes instead of tokenId's.
*/
export const asLegacyTokensFile = asArray(asString)
/**
* Stores enabled tokenId's on disk.
*/
export const asTokensFile = asObject({
// All the tokens that the engine should check.
// This includes both manually-enabled tokens and auto-enabled tokens:
enabledTokenIds: asArray(asString),
// These tokenId's have been detected on-chain at least once.
// The user can still remove them from the enabled tokens list.
detectedTokenIds: asArray(asString)
})
const asTransactionAsset = asObject({
assetAction: asOptional(asEdgeAssetAction),
metadata: asEdgeMetadata,
nativeAmount: asOptional(asString),
providerFeeSent: asOptional(asString)
})
export const asTransactionFile = asObject({
txid: asString,
internal: asBoolean,
creationDate: asNumber,
currencies: asMap(asTransactionAsset),
tokens: asOptional(asTokenIdMap(asTransactionAsset), () => new Map()),
deviceDescription: asOptional(asString),
feeRateRequested: asOptional(asEither(asFeeRate, asJsonObject)),
feeRateUsed: asOptional(asJsonObject),
payees: asOptional(
asArray(
asObject({
address: asString,
amount: asString,
currency: asString,
tag: asOptional(asString)
})
)
),
savedAction: asOptional(asEdgeTxAction),
secret: asOptional(asString),
swap: asOptional(asEdgeTxSwap)
})
export const asLegacyTransactionFile = asObject({
airbitzFeeWanted: asNumber,
meta: asObject({
amountFeeAirBitzSatoshi: asNumber,
balance: asNumber,
fee: asNumber,
// Metadata:
amountCurrency: asNumber,
bizId: asNumber,
category: asString,
name: asString,
notes: asString,
// Obsolete/moved fields:
attributes: asNumber,
amountSatoshi: asNumber,
amountFeeMinersSatoshi: asNumber,
airbitzFee: asNumber
}),
ntxid: asString,
state: asObject({
creationDate: asNumber,
internal: asBoolean,
malleableTxId: asString
})
})
export const asLegacyAddressFile = asObject({
seq: asNumber, // index
address: asString,
state: asObject({
recycleable: asOptional(asBoolean, true),
creationDate: asOptional(asNumber, 0)
}),
meta: asObject({
amountSatoshi: asOptional(asNumber, 0) // requestAmount
// TODO: Normal EdgeMetadata
}).withRest
})
export const asLegacyMapFile = asObject(
asObject({
timestamp: asNumber,
txidHash: asString
})
)
/**
* Public keys cached in the wallet's local storage.
*/
export const asPublicKeyFile = asObject({
walletInfo: asObject({
id: asString,
keys: asJsonObject,
type: asString
})
})
/**
* The wallet's local storage file for the last seen "checkpoint". The core
* does not know the contents of the checkpoint, so it just as an arbitrary
* string.
*/
export const asSeenCheckpointFile = asObject({
checkpoint: asString
})
export const asWalletFiatFile = asObject({
fiat: asOptional(asString),
num: asOptional(asNumber)
})
export const asWalletNameFile = asObject({
walletName: asEither(asString, asNull)
})