HenryNguyen5 08d4ccbdae Productionize Transaction Stack (#456)
* export conditional input and hoc

* Move typings and fields out of send transaction

* Move fields into their own component for decoupled handling, use conditional inputs to simplify disabled components

* Handle hex and non hex strings automatically in BN conversion

* Fix handling of strings and numbers for BN

* add web3 fixes & comments

* Display short balances on deterministic modals

* add more tests, fix rounding

* Add spacer to balance sidebar network name

* Fix tsc error

* Add offline render CB

* Make more render callbacks

* Transform NonceField into its self contained component

* Remove styling from nonce field

* Better network handling in nonce cb

* Move network nonce initialization to componentDidMount

* Remove unessesary conditional input

* Make nonce component return a BN

* Simplify Query render cb

* Add gas query and token query render cbs

* Re-write address field component, strip out ENS name functionality for now

* Add address and data as unit types

* Cleanup Address Field component

* Export gas query

* Re-write gas field component

* Cleanup gas estimation check

* Re-write Data field

* Transaction field skeleton

* Export transaction field actions

* Rename fields to map to ethtx fields

* Make reducers for fields

* Fix reducer module exports

* Export reducer

* Formatting fix

* Type return of GasQuery

* Add transaction field getter / setter component

* Make transaction fields more flexible

* Formatting fix

* Split transaction fields component into two

* Remove erroneous prop

* Fix field naming to follow ethereum transaction fields

* Merge valid prop into componeent

* Change address field to be redux based

* Convert nonce field to redux based

* Make component for passing in current transaction

* Re-write Gas component to use redux state

* Reduxify data field component

* seperate transaction fields redux state into field data and meta data

* Rename SetTransactionFields to be singular

* Make render callback components for getting/setting meta fields

* Add non-zero option prop for token balance render cb

* re-write unit dropdown component to be redux based

* Make ether the first option

* Fix tsc error on tokenquery

* Handle query string default values in unit drop down

* Add thunks to package

* Add helper function for encoding transfer data

* Handle co-dependencies between fields via thunks, seperate value fields into ether and token based

* Fix wrong typing

* Add token metafield as export

* Start scaffolding out amount field component

* Make render cbs for conditional selection of value and balance

* Make render callbacks nullable

* Progress commit -- get dynaming swapping between tokens and ether working

* Get gas estimation working between ether and tokens

* Remove nonce from breaking gas estimation

* Add better validation for amount field

* Add 500ms debounce to gas saga

* Self contain custom message component

* Add web3 awareness to wallet render cb

* Add render cb for checking if  wallet is unlocked

* Cleanup inline typing

* export available params

* Add render cb to render component when a query string exists

* Add boolean callback param that check that the transaction is filled by user

* Remove uneeded typings from send transaction

* Fix misnomer

* Self contain generate transaction button

* Compartmentalize more send transaction components

* Add query string warning, custom message and generate tx button to fields

* Cleanup send tx component with new components

* export render callbacks

* saga transaction scaffolding

* make gas saga fully declarative

* transaction lib renaming

* Seperate gasprice into its own generator

* Make action creators for tx sign actions

* Clean up signing saga, introduce reducer for signing, make HW wallet libs compatible with new tx format, fix some typing with ethereumjs-tx

* Add TransactionComparison component

* Add pushTx

* Progress commit --  Streamline web3 and local signing / broadcasting flows. Need to still implement reducers for broadcasting and notifications

* Get local transaction broadcasting working

* re-write confirmation modal to be redux based

* Fix spacing and import

* Move confirmation modal to be attached to send button, create send button

* Properly handle broadcasting for conf modal

* Handle gas cost > balance for send everything

* Add signing status as its own component (#454)

* Fix ledger errors not showing on notifs

* Make dedicated actions for swapping from tokens to ether and ether to tokens

* Split actionTypes file

* Cleanup comments

* Cleanup comments

* Fix various tsc errors

* Lay down infrastructure for saving configurations per-wallet.

* Add pending and rejected states properly to token values.

* Add custom token form improvements.

* Fix metamask transaction errors

* Fix send entire balance estimation

* Fix add token form from never being enabled.

* Initial pass at account tab with send and view wallet tabs.

* Fix inactive tab.

* Hide private key, toggling

* Progress commit -- Replacing render callbacks with selectors, put  validation logic in sagas

* Moved the restore keystore functionality to view wallet info, and put it in a modal / util file.

* Fix navigation link active

* Force read only wallets to info tab.

* Remove commented code

* Saga-ify send everything

* Scan for new tokens, track saved tokens, only request tracked tokens on initial load.

* Add custom token to current wallets tracked tokens.

* Rework remove token icon.

* Adjust button margin

* Remove the rest of the needless render callbacks for selectors, sagaify nonce

* Bug fix send transaction

* remove unused redux-thunk

* Move fields to general components

* Clean up saga structure

* Refactor broadcast tx

* Implement better validation logic, get contract deploy working

* PR feedback.

* Convert tokenbalances component to connected redux component.

* Addressed feedback from Henry.

* Progress commit -- Implement Interact logic, needs manual testing

* Get rid of commented code

* move exports after declarations

* add tests, rough draft

* Get contract method calls working

* Bugfix contracts

* Cleanup hex prefixing

* Reset transaction state on wallet change

* Get rid of old send transaction component

* Disable sign transaction button when network request is underway

* Flatten send button tree, make nonce human readable in confirmation modal

* Add ghetto cost breakdown component, fix token field validation

* Create Generic SubTab and use in Send

* MVP of mnemonics with sub-tabs in Create Wallet view.

* Do dynamic revalidation

* move exports after declarations

* add forgotten signing tests

* update token spec

* update currentValue spec

* update validationHelpers spec

* Address TODO - use injected history to push navigation state instead of hardcoding window.location

* Use SubTabs in Contracts

* Fix revertPath prop for AcceptOrRedirectModal

* Use subtabs in SignAndVerifyMessage

* Routing for subtabs

* Fix routes, adjust sizing.

* Remove unused import

* Request nonce in base 10

* Add offline override to unit display

* Make cost breakdown less buggy

* Add non standard transaction warning

* Fix amount validity

* Cleanup datafield validity

* Display notif on gas estimation failure

* Add post-signing verification against fields, clean up gas price

* Fix tsc errors

* Code cleanup

* add exports to functions

* add specs for sendEverything and reset sagas

* delete duplicate files

* make tslint happy

* Merge develop

* Fix develop regressions

* Delegate nonce pulling  to wallet being set

* Clarify non standard transaction

* Make address a buffer to avoid leading 0's bug

* Clarify validation helper comment

* Increase debounce time, add console error

* Better validation for non-standard transactions

* Add verification skipping for broadcasting txs

* Fix state and wallet resetting for contract tabs

* Fix some spec files, remove contract.spec

* Remove broadcasting specs from wallet

* Close DeterministicWalletModal on confirm

* Revert "Close DeterministicWalletModal on confirm"

This reverts commit 16c860e854ca29e9de754164d8be5e24f722cbad.

* Reset hardware wallet state on unlocking. Dont render walletdecrypt content when its hidden.

* Fix client side broadcast checking

* Add more state resetters in error scenarios

* Fix gas estimation

* Add validation for value transactions to contract creation

* Add transaction comparaision differentiation depending on wallet type

* Fix token row display balance showing twice

* Properly handle failed transactions

* Handle bad error messages

* fix broken tests

* fix broken test

* Progress commit -- Implement generic subtab types

* Remove react router v3

* Remove unused routes

* Clean up Tabbing code, add onTabChange handler

* Fix tests

* Add nav fix

* revert opinionated sub-tab implementation

* additional reverts

* Add decimal validation

* Make gas price single source of truth, dont save any transaction state other than gas price

* Get rid of old wallet.spec reducer tests

* Add decimal validation when re-validating gasCost

* remove utilities view

* Remove cost breakdown

* Remove local gas estimation warning

* Create getShownTokenBalances selector; use in UnitDropDown and Equivalent Values

* Convert reducers to switch case

* Clean tsc errors

* Fix failing test

* fix tscheck error

* Add number validation to gas field

* Fix misaligned input dropdown

* Revert "Fix misaligned input dropdown"

This reverts commit a40a4c0e8d52471dea01e6727f741a737b798695.

* Set window timeout long enough for node switch to be persisted to state

* Transaction Refactor Style Fixes (#615)

* Fix unit dropdown alignment by rendering it in AmountField, and fixing a missed bootstrap case.

* Fix modal amount and gas text.

* Fix misaligned dropdown

* Update conditions for NavLink is-active class
2017-12-18 15:23:31 -06:00

541 lines
9.0 KiB
TypeScript

declare module 'bn.js' {
import { Buffer } from 'buffer';
type Endianness = 'le' | 'be';
type IPrimeName = 'k256' | 'p224' | 'p192' | 'p25519';
class RedBN {
redAdd(b: RedBN): RedBN;
redIAdd(b: RedBN): RedBN;
redSub(b: RedBN): RedBN;
redISub(b: RedBN): RedBN;
redShl(num: number): RedBN;
redMul(b: RedBN): RedBN;
redIMul(b: RedBN): RedBN;
redSqr(): RedBN;
redISqr(): RedBN;
/**
* @description square root modulo reduction context's prime
*/
redSqrt(): RedBN;
/**
* @description modular inverse of the number
*/
redInvm(): RedBN;
redNeg(): RedBN;
/**
* @description modular exponentiation
*/
redPow(b: RedBN): RedBN;
fromRed(): BN;
}
// FIXME: not sure how to specify the reduction context here
interface IReductionContext {
m: number;
prime: object;
[key: string]: any;
}
export default class BN {
constructor(
number: number | string | number[] | Buffer | BN,
base?: number,
endian?: Endianness
);
/**
* @description create a reduction context
*/
static red(reductionContext: BN | IPrimeName): IReductionContext;
/**
* @description create a reduction context with the Montgomery trick.
*/
static mont(num: BN): IReductionContext;
/**
* @description Convert number to red
*/
/**
* @description returns true if the supplied object is a BN.js instance
*/
static isBN(b: object): boolean;
toRed(reductionContext: IReductionContext): RedBN;
/**
* @description clone number
*/
clone(): BN;
/**
* @description convert to base-string and pad with zeroes
*/
toString(base?: number | 'hex', length?: number): string;
/**
* @description convert to Javascript Number (limited to 53 bits)
*/
toNumber(): number;
/**
* @description convert to JSON compatible hex string (alias of toString(16))
*/
toJSON(): string;
/**
* @description convert to byte Array, and optionally zero pad to length, throwing if already exceeding
*/
toArray(endian?: Endianness, length?: number): number[];
/**
* @description convert to an instance of `type`, which must behave like an Array
*/
toArrayLike(
ArrayType: Buffer | Array<any>,
endian?: Endianness,
length?: number
): Buffer | Array<any>;
/**
* @description convert to Node.js Buffer (if available). For compatibility with browserify and similar tools, use this instead: a.toArrayLike(Buffer, endian, length)
*/
toBuffer(endian?: Endianness, length?: number): Buffer;
/**
* @description get number of bits occupied
*/
bitLength(): number;
/**
* @description return number of less-significant consequent zero bits (example: 1010000 has 4 zero bits)
*/
zeroBits(): number;
/**
* @description return number of bytes occupied
*/
byteLength(): number;
/**
* @description true if the number is negative
*/
isNeg(): boolean;
/**
* @description no comments
*/
isEven(): boolean;
/**
* @description no comments
*/
isOdd(): boolean;
/**
* @description no comments
*/
isZero(): boolean;
/**
* @description compare numbers and return `-1 (a < b)`, `0 (a == b)`, or `1 (a > b)` depending on the comparison result
*/
cmp(b: BN): -1 | 0 | 1;
/**
* @description compare numbers and return `-1 (a < b)`, `0 (a == b)`, or `1 (a > b)` depending on the comparison result
*/
ucmp(b: BN): -1 | 0 | 1;
/**
* @description compare numbers and return `-1 (a < b)`, `0 (a == b)`, or `1 (a > b)` depending on the comparison result
*/
cmpn(b: number): -1 | 0 | 1;
/**
* @description a less than b
*/
lt(b: BN): boolean;
/**
* @description a less than b
*/
ltn(b: number): boolean;
/**
* @description a less than or equals b
*/
lte(b: BN): boolean;
/**
* @description a less than or equals b
*/
lten(b: number): boolean;
/**
* @description a greater than b
*/
gt(b: BN): boolean;
/**
* @description a greater than b
*/
gtn(b: number): boolean;
/**
* @description a greater than or equals b
*/
gte(b: BN): boolean;
/**
* @description a greater than or equals b
*/
gten(b: number): boolean;
/**
* @description a equals b
*/
eq(b: BN): boolean;
/**
* @description a equals b
*/
eqn(b: number): boolean;
/**
* @description convert to two's complement representation, where width is bit width
*/
toTwos(width: number): BN;
/**
* @description convert from two's complement representation, where width is the bit width
*/
fromTwos(width: number): BN;
/**
* @description negate sign
*/
neg(): BN;
/**
* @description negate sign
*/
ineg(): BN;
/**
* @description absolute value
*/
abs(): BN;
/**
* @description absolute value
*/
iabs(): BN;
/**
* @description addition
*/
add(b: BN): BN;
/**
* @description addition
*/
iadd(b: BN): BN;
addition;
/**
* @description addition
*/
addn(b: number): BN;
/**
* @description addition
*/
iaddn(b: number): BN;
/**
* @description subtraction
*/
sub(b: BN): BN;
/**
* @description subtraction
*/
isub(b: BN): BN;
/**
* @description subtraction
*/
subn(b: number): BN;
/**
* @description subtraction
*/
isubn(b: number): BN;
/**
* @description multiply
*/
mul(b: BN): BN;
/**
* @description multiply
*/
imul(b: BN): BN;
/**
* @description multiply
*/
muln(b: number): BN;
/**
* @description multiply
*/
imuln(b: number): BN;
/**
* @description square
*/
sqr(): BN;
/**
* @description square
*/
isqr(): BN;
/**
* @description raise `a` to the power of `b`
*/
pow(b: BN): BN;
/**
* @description divide
*/
div(b: BN): BN;
/**
* @description divide
*/
divn(b: number): BN;
/**
* @description divide
*/
idivn(b: number): BN;
/**
* @description reduct
*/
mod(b: BN): BN;
/**
* @description reduct
*/
umod(b: BN): BN;
/**
* @description reduct
*/
modn(b: number): BN;
/**
* @description rounded division
*/
divRound(b: BN): BN;
/**
* @description or
*/
or(b: BN): BN;
/**
* @description or
*/
ior(b: BN): BN;
/**
* @description or
*/
uor(b: BN): BN;
/**
* @description or
*/
iuor(b: BN): BN;
/**
* @description and
*/
and(b: BN): BN;
/**
* @description and
*/
iand(b: BN): BN;
/**
* @description and
*/
uand(b: BN): BN;
/**
* @description and
*/
iuand(b: BN): BN;
/**
* @description and (NOTE: `andln` is going to be replaced with `andn` in future)
*/
andln(b: number): BN;
/**
* @description xor
*/
xor(b: BN): BN;
/**
* @description xor
*/
ixor(b: BN): BN;
/**
* @description xor
*/
uxor(b: BN): BN;
/**
* @description xor
*/
iuxor(b: BN): BN;
/**
* @description set specified bit to 1
*/
setn(b: number): BN;
/**
* @description shift left
*/
shln(b: number): BN;
/**
* @description shift left
*/
ishln(b: number): BN;
/**
* @description shift left
*/
ushln(b: number): BN;
/**
* @description shift left
*/
iushln(b: number): BN;
/**
* @description shift right
*/
shrn(b: number): BN;
/**
* @description shift right
*/
ishrn(b: number): BN;
/**
* @description shift right
*/
ushrn(b: number): BN;
/**
* @description shift right
*/
iushrn(b: number): BN;
/**
* @description test if specified bit is set
*/
testn(b: number): boolean;
/**
* @description clear bits with indexes higher or equal to `b`
*/
maskn(b: number): BN;
/**
* @description clear bits with indexes higher or equal to `b`
*/
imaskn(b: number): BN;
/**
* @description add `1 << b` to the number
*/
bincn(b: number): BN;
/**
* @description not (for the width specified by `w`)
*/
notn(w: number): BN;
/**
* @description not (for the width specified by `w`)
*/
inotn(w: number): BN;
/**
* @description GCD
*/
gcd(b: BN): BN;
/**
* @description Extended GCD results `({ a: ..., b: ..., gcd: ... })`
*/
egcd(b: BN): { a: BN; b: BN; gcd: BN };
/**
* @description inverse `a` modulo `b`
*/
invm(b: BN): BN;
}
}