@@ -8,7 +8,7 @@ import { NETWORK_TYPES } from './network';
88import { ledgerSignTransaction } from './ledger';
99import { trezorSignTransaction } from './trezor';
1010import { walletConnectSignTransaction } from './WalletConnect';
11−import { metamaskSignTransaction, FakeMetamaskTransaction } from './metamask';
11+import { metamaskSignTransaction } from './metamask';
1212import { addHexPrefix } from './utils/address';
1313import { CHECK_BLOCK_EVERY_MS, WALLET_TYPES } from './constants';
1414import { patp2dec } from './patp2dec';
@@ -20,6 +20,22 @@ const RETRY_OPTIONS = {
2020 randomize: false,
2121};
2222
23+type SignedTx = {
24+ serialize: () => string;
25+};
26+
27+//TODO merge with FakeSignResult, get it type-checking properly
28+type FakeSignedTx = SignedTx & {
29+ txn: any;
30+ send: (web3: any, txn: any) => Promise<string>; // txhash
31+};
32+
33+function FakeSignResult(txn, send) {
34+ this.txn = txn;
35+ this.serialize = () => '???'; //NOTE update tank.js when changing this!
36+ this.send = send;
37+}
38+
2339const signTransaction = async ({
2440 wallet,
2541 walletType,
@@ -30,7 +46,8 @@ const signTransaction = async ({
3046 chainId, // number
3147 gasPrice, // string, in gwei
3248 gasLimit, // string | number
33− txnSigner, // optionally inject a transaction signing function
49+ txnSigner, // optionally inject a transaction signing function,
50+ txnSender, // and a sending function, for wallets that need these passed in.
3451}) => {
3552 // TODO: require these in txn object
3653 nonce = toHex(nonce);
@@ -115,6 +132,7 @@ const signTransaction = async ({
115132 from,
116133 txn: stx,
117134 txnSigner,
135+ txnSender,
118136 });
119137 } else {
120138 stx = stx.sign(wallet.privateKey);
@@ -123,19 +141,27 @@ const signTransaction = async ({
123141 return stx;
124142};
125143
126−const sendSignedTransaction = (web3, stx, doubtNonceError) => {
127− // Handle fake metamask transaction
128− let eventEmitter;
129− let rawTx;
130− if (stx instanceof FakeMetamaskTransaction) {
131− eventEmitter = web3.eth.sendTransaction(stx.txnData);
132− } else {
133− rawTx = hexify(stx.serialize());
134− eventEmitter = web3.eth.sendSignedTransaction(rawTx);
144+const sendSignedTransaction = (
145+ web3,
146+ stx: SignedTx,
147+ doubtNonceError: boolean
148+): Promise<string> => {
149+ // if we couldn't sign it, we depend on the given sender function
150+ if (stx instanceof FakeSignResult) { //TODO set up for proper typecheck
151+ if (doubtNonceError) {
152+ console.log('why doubting nonce error? tank unavailable without rawtx.');
153+ }
154+ if (!stx.send) {
155+ throw new Error('no sign+sending function available');
156+ }
157+ return stx.send(web3, stx.txn);
135158 }
159+
160+ let rawTx: string = hexify(stx.serialize());
161+ let eventEmitter = web3.eth.sendSignedTransaction(rawTx);
136162 return new Promise(async (resolve, reject) => {
137163 eventEmitter
138− .on('transactionHash', hash => {
164+ .on('transactionHash', (hash: string) => {
139165 resolve(hash);
140166 })
141167 .on('error', err => {
@@ -240,6 +266,7 @@ const canDecodePatp = p => {
240266
241267export {
242268 RETRY_OPTIONS,
269+ FakeSignResult,
243270 signTransaction,
244271 sendSignedTransaction,
245272 waitForTransactionConfirm,