cashscript 0.6.4 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/main/Argument.d.ts +2 -2
  2. package/dist/main/Argument.js +19 -19
  3. package/dist/main/Contract.d.ts +4 -4
  4. package/dist/main/Contract.js +15 -15
  5. package/dist/main/Errors.d.ts +6 -2
  6. package/dist/main/Errors.js +10 -2
  7. package/dist/main/SignatureTemplate.d.ts +1 -1
  8. package/dist/main/SignatureTemplate.js +3 -3
  9. package/dist/main/Transaction.d.ts +3 -3
  10. package/dist/main/Transaction.js +40 -42
  11. package/dist/main/index.d.ts +7 -7
  12. package/dist/main/index.js +22 -14
  13. package/dist/main/interfaces.d.ts +2 -1
  14. package/dist/main/interfaces.js +1 -0
  15. package/dist/main/network/BitboxNetworkProvider.d.ts +2 -2
  16. package/dist/main/network/BitcoinRpcNetworkProvider.d.ts +2 -2
  17. package/dist/main/network/ElectrumNetworkProvider.d.ts +2 -2
  18. package/dist/main/network/ElectrumNetworkProvider.js +13 -9
  19. package/dist/main/network/FullStackNetworkProvider.d.ts +2 -2
  20. package/dist/main/network/NetworkProvider.d.ts +1 -1
  21. package/dist/main/network/index.d.ts +5 -5
  22. package/dist/main/network/index.js +8 -8
  23. package/dist/main/utils.d.ts +3 -2
  24. package/dist/main/utils.js +40 -31
  25. package/dist/module/Argument.d.ts +2 -2
  26. package/dist/module/Argument.js +9 -9
  27. package/dist/module/Contract.d.ts +4 -4
  28. package/dist/module/Contract.js +5 -5
  29. package/dist/module/Errors.d.ts +6 -2
  30. package/dist/module/Errors.js +8 -1
  31. package/dist/module/SignatureTemplate.d.ts +1 -1
  32. package/dist/module/SignatureTemplate.js +1 -1
  33. package/dist/module/Transaction.d.ts +3 -3
  34. package/dist/module/Transaction.js +11 -13
  35. package/dist/module/index.d.ts +7 -7
  36. package/dist/module/index.js +6 -6
  37. package/dist/module/interfaces.d.ts +2 -1
  38. package/dist/module/interfaces.js +1 -0
  39. package/dist/module/network/BitboxNetworkProvider.d.ts +2 -2
  40. package/dist/module/network/BitcoinRpcNetworkProvider.d.ts +2 -2
  41. package/dist/module/network/ElectrumNetworkProvider.d.ts +2 -2
  42. package/dist/module/network/ElectrumNetworkProvider.js +7 -3
  43. package/dist/module/network/FullStackNetworkProvider.d.ts +2 -2
  44. package/dist/module/network/NetworkProvider.d.ts +1 -1
  45. package/dist/module/network/index.d.ts +5 -5
  46. package/dist/module/network/index.js +4 -4
  47. package/dist/module/utils.d.ts +3 -2
  48. package/dist/module/utils.js +11 -3
  49. package/package.json +3 -3
@@ -12,10 +12,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  const libauth_1 = require("@bitauth/libauth");
13
13
  const utils_1 = require("@cashscript/utils");
14
14
  const electrum_cash_1 = require("electrum-cash");
15
- const interfaces_1 = require("../interfaces");
16
- const utils_2 = require("../utils");
15
+ const interfaces_js_1 = require("../interfaces.js");
16
+ const utils_js_1 = require("../utils.js");
17
17
  class ElectrumNetworkProvider {
18
- constructor(network = interfaces_1.Network.MAINNET, electrum, manualConnectionManagement) {
18
+ constructor(network = interfaces_js_1.Network.MAINNET, electrum, manualConnectionManagement) {
19
19
  this.network = network;
20
20
  this.manualConnectionManagement = manualConnectionManagement;
21
21
  this.concurrentRequests = 0;
@@ -24,7 +24,7 @@ class ElectrumNetworkProvider {
24
24
  this.electrum = electrum;
25
25
  return;
26
26
  }
27
- if (network === interfaces_1.Network.MAINNET) {
27
+ if (network === interfaces_js_1.Network.MAINNET) {
28
28
  // Initialise a 2-of-3 Electrum Cluster with 6 reliable hardcoded servers
29
29
  // using the first three servers as "priority" servers
30
30
  this.electrum = new electrum_cash_1.ElectrumCluster('CashScript Application', '1.4.1', 2, 3, electrum_cash_1.ClusterOrder.PRIORITY);
@@ -35,14 +35,18 @@ class ElectrumNetworkProvider {
35
35
  this.electrum.addServer('bch.loping.net', 50004, electrum_cash_1.ElectrumTransport.WSS.Scheme, false);
36
36
  this.electrum.addServer('electrum.imaginary.cash', 50004, electrum_cash_1.ElectrumTransport.WSS.Scheme, false);
37
37
  }
38
- else if (network === interfaces_1.Network.TESTNET) {
38
+ else if (network === interfaces_js_1.Network.TESTNET) {
39
39
  // Initialise a 1-of-2 Electrum Cluster with 2 hardcoded servers
40
- this.electrum = new electrum_cash_1.ElectrumCluster('CashScript Application', '1.4.1', 1, 2);
40
+ this.electrum = new electrum_cash_1.ElectrumCluster('CashScript Application', '1.4.1', 1, 2, electrum_cash_1.ClusterOrder.PRIORITY);
41
41
  this.electrum.addServer('blackie.c3-soft.com', 60004, electrum_cash_1.ElectrumTransport.WSS.Scheme, false);
42
42
  this.electrum.addServer('electroncash.de', 60004, electrum_cash_1.ElectrumTransport.WSS.Scheme, false);
43
43
  // this.electrum.addServer('bch.loping.net', 60004, ElectrumTransport.WSS.Scheme, false);
44
44
  // this.electrum.addServer('testnet.imaginary.cash', 50004, ElectrumTransport.WSS.Scheme);
45
45
  }
46
+ else if (network === interfaces_js_1.Network.STAGING) {
47
+ this.electrum = new electrum_cash_1.ElectrumCluster('CashScript Application', '1.4.1', 1, 1, electrum_cash_1.ClusterOrder.PRIORITY);
48
+ this.electrum.addServer('testnet4.imaginary.cash', 50004, electrum_cash_1.ElectrumTransport.WSS.Scheme, false);
49
+ }
46
50
  else {
47
51
  throw new Error(`Tried to instantiate an ElectrumNetworkProvider for unsupported network ${network}`);
48
52
  }
@@ -143,12 +147,12 @@ exports.default = ElectrumNetworkProvider;
143
147
  */
144
148
  function addressToElectrumScriptHash(address) {
145
149
  // Retrieve locking script
146
- const lockScript = utils_2.addressToLockScript(address);
150
+ const lockScript = (0, utils_js_1.addressToLockScript)(address);
147
151
  // Hash locking script
148
- const scriptHash = utils_1.sha256(lockScript);
152
+ const scriptHash = (0, utils_1.sha256)(lockScript);
149
153
  // Reverse scripthash
150
154
  scriptHash.reverse();
151
155
  // Return scripthash as a hex string
152
- return libauth_1.binToHex(scriptHash);
156
+ return (0, libauth_1.binToHex)(scriptHash);
153
157
  }
154
158
  //# sourceMappingURL=ElectrumNetworkProvider.js.map
@@ -1,5 +1,5 @@
1
- import { Utxo, Network } from '../interfaces';
2
- import NetworkProvider from './NetworkProvider';
1
+ import { Utxo, Network } from '../interfaces.js';
2
+ import NetworkProvider from './NetworkProvider.js';
3
3
  export default class FullStackNetworkProvider implements NetworkProvider {
4
4
  network: Network;
5
5
  private bchjs;
@@ -1,4 +1,4 @@
1
- import { Utxo, Network } from '../interfaces';
1
+ import { Utxo, Network } from '../interfaces.js';
2
2
  export default interface NetworkProvider {
3
3
  /**
4
4
  * Variable indicating the network that this provider connects to.
@@ -1,5 +1,5 @@
1
- export { default as NetworkProvider } from './NetworkProvider';
2
- export { default as BitboxNetworkProvider } from './BitboxNetworkProvider';
3
- export { default as BitcoinRpcNetworkProvider } from './BitcoinRpcNetworkProvider';
4
- export { default as ElectrumNetworkProvider } from './ElectrumNetworkProvider';
5
- export { default as FullStackNetworkProvider } from './FullStackNetworkProvider';
1
+ export { default as NetworkProvider } from './NetworkProvider.js';
2
+ export { default as BitboxNetworkProvider } from './BitboxNetworkProvider.js';
3
+ export { default as BitcoinRpcNetworkProvider } from './BitcoinRpcNetworkProvider.js';
4
+ export { default as ElectrumNetworkProvider } from './ElectrumNetworkProvider.js';
5
+ export { default as FullStackNetworkProvider } from './FullStackNetworkProvider.js';
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.FullStackNetworkProvider = exports.ElectrumNetworkProvider = exports.BitcoinRpcNetworkProvider = exports.BitboxNetworkProvider = void 0;
7
- var BitboxNetworkProvider_1 = require("./BitboxNetworkProvider");
8
- Object.defineProperty(exports, "BitboxNetworkProvider", { enumerable: true, get: function () { return __importDefault(BitboxNetworkProvider_1).default; } });
9
- var BitcoinRpcNetworkProvider_1 = require("./BitcoinRpcNetworkProvider");
10
- Object.defineProperty(exports, "BitcoinRpcNetworkProvider", { enumerable: true, get: function () { return __importDefault(BitcoinRpcNetworkProvider_1).default; } });
11
- var ElectrumNetworkProvider_1 = require("./ElectrumNetworkProvider");
12
- Object.defineProperty(exports, "ElectrumNetworkProvider", { enumerable: true, get: function () { return __importDefault(ElectrumNetworkProvider_1).default; } });
13
- var FullStackNetworkProvider_1 = require("./FullStackNetworkProvider");
14
- Object.defineProperty(exports, "FullStackNetworkProvider", { enumerable: true, get: function () { return __importDefault(FullStackNetworkProvider_1).default; } });
7
+ var BitboxNetworkProvider_js_1 = require("./BitboxNetworkProvider.js");
8
+ Object.defineProperty(exports, "BitboxNetworkProvider", { enumerable: true, get: function () { return __importDefault(BitboxNetworkProvider_js_1).default; } });
9
+ var BitcoinRpcNetworkProvider_js_1 = require("./BitcoinRpcNetworkProvider.js");
10
+ Object.defineProperty(exports, "BitcoinRpcNetworkProvider", { enumerable: true, get: function () { return __importDefault(BitcoinRpcNetworkProvider_js_1).default; } });
11
+ var ElectrumNetworkProvider_js_1 = require("./ElectrumNetworkProvider.js");
12
+ Object.defineProperty(exports, "ElectrumNetworkProvider", { enumerable: true, get: function () { return __importDefault(ElectrumNetworkProvider_js_1).default; } });
13
+ var FullStackNetworkProvider_js_1 = require("./FullStackNetworkProvider.js");
14
+ Object.defineProperty(exports, "FullStackNetworkProvider", { enumerable: true, get: function () { return __importDefault(FullStackNetworkProvider_js_1).default; } });
15
15
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,8 @@
1
1
  import { Transaction } from '@bitauth/libauth';
2
2
  import { Script } from '@cashscript/utils';
3
- import { Utxo, Output } from './interfaces';
4
- import { FailedTransactionError } from './Errors';
3
+ import { Utxo, Output, Recipient } from './interfaces.js';
4
+ import { FailedTransactionError } from './Errors.js';
5
+ export declare function validateRecipient(recipient: Recipient): void;
5
6
  export declare function getInputSize(inputScript: Uint8Array): number;
6
7
  export declare function getPreimageSize(script: Uint8Array): number;
7
8
  export declare function getTxSizeWithoutInputs(outputs: Output[]): number;
@@ -1,11 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getNetworkPrefix = exports.addressToLockScript = exports.scriptToLockingBytecode = exports.scriptToAddress = exports.meep = exports.buildError = exports.createSighashPreimage = exports.createOpReturnOutput = exports.createInputScript = exports.getTxSizeWithoutInputs = exports.getPreimageSize = exports.getInputSize = void 0;
3
+ exports.getNetworkPrefix = exports.addressToLockScript = exports.scriptToLockingBytecode = exports.scriptToAddress = exports.meep = exports.buildError = exports.createSighashPreimage = exports.createOpReturnOutput = exports.createInputScript = exports.getTxSizeWithoutInputs = exports.getPreimageSize = exports.getInputSize = exports.validateRecipient = void 0;
4
4
  const libauth_1 = require("@bitauth/libauth");
5
5
  const utils_1 = require("@cashscript/utils");
6
- const interfaces_1 = require("./interfaces");
7
- const constants_1 = require("./constants");
8
- const Errors_1 = require("./Errors");
6
+ const interfaces_js_1 = require("./interfaces.js");
7
+ const constants_js_1 = require("./constants.js");
8
+ const Errors_js_1 = require("./Errors.js");
9
+ // ////////// PARAMETER VALIDATION ////////////////////////////////////////////
10
+ function validateRecipient(recipient) {
11
+ if (recipient.amount < constants_js_1.DUST_LIMIT) {
12
+ throw new Errors_js_1.OutputSatoshisTooSmallError(recipient.amount);
13
+ }
14
+ }
15
+ exports.validateRecipient = validateRecipient;
9
16
  // ////////// SIZE CALCULATIONS ///////////////////////////////////////////////
10
17
  function getInputSize(inputScript) {
11
18
  const scriptSize = inputScript.byteLength;
@@ -34,16 +41,16 @@ function getTxSizeWithoutInputs(outputs) {
34
41
  // Script Length(1 ~ 9B)*
35
42
  // Script (?)*
36
43
  // LockTime (4B)
37
- let size = constants_1.VERSION_SIZE + constants_1.LOCKTIME_SIZE;
44
+ let size = constants_js_1.VERSION_SIZE + constants_js_1.LOCKTIME_SIZE;
38
45
  size += outputs.reduce((acc, output) => {
39
46
  if (typeof output.to === 'string') {
40
- return acc + constants_1.P2PKH_OUTPUT_SIZE;
47
+ return acc + constants_js_1.P2PKH_OUTPUT_SIZE;
41
48
  }
42
49
  // Size of an OP_RETURN output = byteLength + 8 (amount) + 2 (scriptSize)
43
50
  return acc + output.to.byteLength + 8 + 2;
44
51
  }, 0);
45
52
  // Add tx-out count (accounting for a potential change output)
46
- size += utils_1.encodeInt(outputs.length + 1).byteLength;
53
+ size += (0, utils_1.encodeInt)(outputs.length + 1).byteLength;
47
54
  return size;
48
55
  }
49
56
  exports.getTxSizeWithoutInputs = getTxSizeWithoutInputs;
@@ -54,10 +61,10 @@ function createInputScript(redeemScript, encodedArgs, selector, preimage) {
54
61
  if (preimage !== undefined)
55
62
  unlockScript.push(preimage);
56
63
  if (selector !== undefined)
57
- unlockScript.push(utils_1.encodeInt(selector));
64
+ unlockScript.push((0, utils_1.encodeInt)(selector));
58
65
  // Create input script and compile it to bytecode
59
- const inputScript = [...unlockScript, utils_1.scriptToBytecode(redeemScript)];
60
- return utils_1.scriptToBytecode(inputScript);
66
+ const inputScript = [...unlockScript, (0, utils_1.scriptToBytecode)(redeemScript)];
67
+ return (0, utils_1.scriptToBytecode)(inputScript);
61
68
  }
62
69
  exports.createInputScript = createInputScript;
63
70
  function createOpReturnOutput(opReturnData) {
@@ -74,12 +81,12 @@ function toBin(output) {
74
81
  return encode(data);
75
82
  }
76
83
  function createSighashPreimage(transaction, input, inputIndex, coveredBytecode, hashtype) {
77
- const state = libauth_1.createTransactionContextCommon({
84
+ const state = (0, libauth_1.createTransactionContextCommon)({
78
85
  inputIndex,
79
- sourceOutput: { satoshis: libauth_1.bigIntToBinUint64LE(BigInt(input.satoshis)) },
86
+ sourceOutput: { satoshis: (0, libauth_1.bigIntToBinUint64LE)(BigInt(input.satoshis)) },
80
87
  spendingTransaction: transaction,
81
88
  });
82
- const sighashPreimage = libauth_1.generateSigningSerializationBCH({
89
+ const sighashPreimage = (0, libauth_1.generateSigningSerializationBCH)({
83
90
  correspondingOutput: state.correspondingOutput,
84
91
  coveredBytecode,
85
92
  forkId: new Uint8Array([0, 0, 0]),
@@ -100,24 +107,24 @@ function createSighashPreimage(transaction, input, inputIndex, coveredBytecode,
100
107
  exports.createSighashPreimage = createSighashPreimage;
101
108
  function buildError(reason, meepStr) {
102
109
  const require = [
103
- Errors_1.Reason.EVAL_FALSE, Errors_1.Reason.VERIFY, Errors_1.Reason.EQUALVERIFY, Errors_1.Reason.CHECKMULTISIGVERIFY,
104
- Errors_1.Reason.CHECKSIGVERIFY, Errors_1.Reason.CHECKDATASIGVERIFY, Errors_1.Reason.NUMEQUALVERIFY,
110
+ Errors_js_1.Reason.EVAL_FALSE, Errors_js_1.Reason.VERIFY, Errors_js_1.Reason.EQUALVERIFY, Errors_js_1.Reason.CHECKMULTISIGVERIFY,
111
+ Errors_js_1.Reason.CHECKSIGVERIFY, Errors_js_1.Reason.CHECKDATASIGVERIFY, Errors_js_1.Reason.NUMEQUALVERIFY,
105
112
  ];
106
- const timeCheck = [Errors_1.Reason.NEGATIVE_LOCKTIME, Errors_1.Reason.UNSATISFIED_LOCKTIME];
113
+ const timeCheck = [Errors_js_1.Reason.NEGATIVE_LOCKTIME, Errors_js_1.Reason.UNSATISFIED_LOCKTIME];
107
114
  const sigCheck = [
108
- Errors_1.Reason.SIG_COUNT, Errors_1.Reason.PUBKEY_COUNT, Errors_1.Reason.SIG_HASHTYPE, Errors_1.Reason.SIG_DER,
109
- Errors_1.Reason.SIG_HIGH_S, Errors_1.Reason.SIG_NULLFAIL, Errors_1.Reason.SIG_BADLENGTH, Errors_1.Reason.SIG_NONSCHNORR,
115
+ Errors_js_1.Reason.SIG_COUNT, Errors_js_1.Reason.PUBKEY_COUNT, Errors_js_1.Reason.SIG_HASHTYPE, Errors_js_1.Reason.SIG_DER,
116
+ Errors_js_1.Reason.SIG_HIGH_S, Errors_js_1.Reason.SIG_NULLFAIL, Errors_js_1.Reason.SIG_BADLENGTH, Errors_js_1.Reason.SIG_NONSCHNORR,
110
117
  ];
111
118
  if (toRegExp(require).test(reason)) {
112
- return new Errors_1.FailedRequireError(reason, meepStr);
119
+ return new Errors_js_1.FailedRequireError(reason, meepStr);
113
120
  }
114
121
  if (toRegExp(timeCheck).test(reason)) {
115
- return new Errors_1.FailedTimeCheckError(reason, meepStr);
122
+ return new Errors_js_1.FailedTimeCheckError(reason, meepStr);
116
123
  }
117
124
  if (toRegExp(sigCheck).test(reason)) {
118
- return new Errors_1.FailedSigCheckError(reason, meepStr);
125
+ return new Errors_js_1.FailedSigCheckError(reason, meepStr);
119
126
  }
120
- return new Errors_1.FailedTransactionError(reason, meepStr);
127
+ return new Errors_js_1.FailedTransactionError(reason, meepStr);
121
128
  }
122
129
  exports.buildError = buildError;
123
130
  function toRegExp(reasons) {
@@ -125,21 +132,21 @@ function toRegExp(reasons) {
125
132
  }
126
133
  // ////////// MISC ////////////////////////////////////////////////////////////
127
134
  function meep(tx, utxos, script) {
128
- const scriptPubkey = libauth_1.binToHex(scriptToLockingBytecode(script));
135
+ const scriptPubkey = (0, libauth_1.binToHex)(scriptToLockingBytecode(script));
129
136
  return `meep debug --tx=${tx} --idx=0 --amt=${utxos[0].satoshis} --pkscript=${scriptPubkey}`;
130
137
  }
131
138
  exports.meep = meep;
132
139
  function scriptToAddress(script, network) {
133
140
  const lockingBytecode = scriptToLockingBytecode(script);
134
141
  const prefix = getNetworkPrefix(network);
135
- const address = libauth_1.lockingBytecodeToCashAddress(lockingBytecode, prefix);
142
+ const address = (0, libauth_1.lockingBytecodeToCashAddress)(lockingBytecode, prefix);
136
143
  return address;
137
144
  }
138
145
  exports.scriptToAddress = scriptToAddress;
139
146
  function scriptToLockingBytecode(script) {
140
- const scriptHash = utils_1.hash160(utils_1.scriptToBytecode(script));
147
+ const scriptHash = (0, utils_1.hash160)((0, utils_1.scriptToBytecode)(script));
141
148
  const addressContents = { payload: scriptHash, type: libauth_1.AddressType.p2sh };
142
- const lockingBytecode = libauth_1.addressContentsToLockingBytecode(addressContents);
149
+ const lockingBytecode = (0, libauth_1.addressContentsToLockingBytecode)(addressContents);
143
150
  return lockingBytecode;
144
151
  }
145
152
  exports.scriptToLockingBytecode = scriptToLockingBytecode;
@@ -151,7 +158,7 @@ exports.scriptToLockingBytecode = scriptToLockingBytecode;
151
158
  * @returns a locking script corresponding to the passed address
152
159
  */
153
160
  function addressToLockScript(address) {
154
- const result = libauth_1.cashAddressToLockingBytecode(address);
161
+ const result = (0, libauth_1.cashAddressToLockingBytecode)(address);
155
162
  if (typeof result === 'string')
156
163
  throw new Error(result);
157
164
  return result.bytecode;
@@ -159,11 +166,13 @@ function addressToLockScript(address) {
159
166
  exports.addressToLockScript = addressToLockScript;
160
167
  function getNetworkPrefix(network) {
161
168
  switch (network) {
162
- case interfaces_1.Network.MAINNET:
169
+ case interfaces_js_1.Network.MAINNET:
163
170
  return 'bitcoincash';
164
- case interfaces_1.Network.TESTNET:
171
+ case interfaces_js_1.Network.STAGING:
172
+ return 'bchtest';
173
+ case interfaces_js_1.Network.TESTNET:
165
174
  return 'bchtest';
166
- case interfaces_1.Network.REGTEST:
175
+ case interfaces_js_1.Network.REGTEST:
167
176
  return 'bchreg';
168
177
  default:
169
178
  return 'bitcoincash';
@@ -173,7 +182,7 @@ exports.getNetworkPrefix = getNetworkPrefix;
173
182
  // ////////////////////////////////////////////////////////////////////////////
174
183
  // For encoding OP_RETURN data (doesn't require BIP62.3 / MINIMALDATA)
175
184
  function encodeNullDataScript(chunks) {
176
- return libauth_1.flattenBinArray(chunks.map((chunk) => {
185
+ return (0, libauth_1.flattenBinArray)(chunks.map((chunk) => {
177
186
  if (typeof chunk === 'number') {
178
187
  return new Uint8Array([chunk]);
179
188
  }
@@ -1,3 +1,3 @@
1
- import SignatureTemplate from './SignatureTemplate';
2
- export declare type Argument = number | boolean | string | Uint8Array | SignatureTemplate;
1
+ import SignatureTemplate from './SignatureTemplate.js';
2
+ export declare type Argument = number | bigint | boolean | string | Uint8Array | SignatureTemplate;
3
3
  export declare function encodeArgument(argument: Argument, typeStr: string): Uint8Array | SignatureTemplate;
@@ -1,7 +1,7 @@
1
1
  import { hexToBin } from '@bitauth/libauth';
2
2
  import { BytesType, encodeBool, encodeInt, encodeString, parseType, PrimitiveType, } from '@cashscript/utils';
3
- import { TypeError } from './Errors';
4
- import SignatureTemplate from './SignatureTemplate';
3
+ import { TypeError } from './Errors.js';
4
+ import SignatureTemplate from './SignatureTemplate.js';
5
5
  export function encodeArgument(argument, typeStr) {
6
6
  let type = parseType(typeStr);
7
7
  if (type === PrimitiveType.BOOL) {
@@ -11,7 +11,7 @@ export function encodeArgument(argument, typeStr) {
11
11
  return encodeBool(argument);
12
12
  }
13
13
  if (type === PrimitiveType.INT) {
14
- if (typeof argument !== 'number') {
14
+ if (typeof argument !== 'number' && typeof argument !== 'bigint') {
15
15
  throw new TypeError(typeof argument, type);
16
16
  }
17
17
  return encodeInt(argument);
@@ -36,14 +36,14 @@ export function encodeArgument(argument, typeStr) {
36
36
  }
37
37
  // Redefine SIG as a bytes65 so it is included in the size checks below
38
38
  // Note that ONLY Schnorr signatures are accepted
39
- if (type === PrimitiveType.SIG) {
39
+ if (type === PrimitiveType.SIG && argument.byteLength !== 0) {
40
40
  type = new BytesType(65);
41
41
  }
42
- // TODO: Set DATASIG to 64 bytes (enforcing Schnorr) in a new MINOR version upgrade
43
- // (backwards incompatible)
44
- // if (type === PrimitiveType.DATASIG) {
45
- // type = new BytesType(64);
46
- // }
42
+ // Redefine SIG as a bytes64 so it is included in the size checks below
43
+ // Note that ONLY Schnorr signatures are accepted
44
+ if (type === PrimitiveType.DATASIG && argument.byteLength !== 0) {
45
+ type = new BytesType(64);
46
+ }
47
47
  // Bounded bytes types require a correctly sized argument
48
48
  if (type instanceof BytesType && type.bound && argument.byteLength !== type.bound) {
49
49
  throw new TypeError(`bytes${argument.byteLength}`, type);
@@ -1,8 +1,8 @@
1
1
  import { Artifact } from '@cashscript/utils';
2
- import { Transaction } from './Transaction';
3
- import { Argument } from './Argument';
4
- import { Utxo } from './interfaces';
5
- import NetworkProvider from './network/NetworkProvider';
2
+ import { Transaction } from './Transaction.js';
3
+ import { Argument } from './Argument.js';
4
+ import { Utxo } from './interfaces.js';
5
+ import NetworkProvider from './network/NetworkProvider.js';
6
6
  export declare class Contract {
7
7
  private artifact;
8
8
  private provider;
@@ -9,11 +9,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import { binToHex } from '@bitauth/libauth';
11
11
  import { asmToScript, calculateBytesize, countOpcodes, generateRedeemScript, scriptToBytecode, } from '@cashscript/utils';
12
- import { Transaction } from './Transaction';
13
- import { encodeArgument } from './Argument';
14
- import { scriptToAddress, } from './utils';
15
- import SignatureTemplate from './SignatureTemplate';
16
- import { ElectrumNetworkProvider } from './network';
12
+ import { Transaction } from './Transaction.js';
13
+ import { encodeArgument } from './Argument.js';
14
+ import { scriptToAddress, } from './utils.js';
15
+ import SignatureTemplate from './SignatureTemplate.js';
16
+ import { ElectrumNetworkProvider } from './network/index.js';
17
17
  export class Contract {
18
18
  constructor(artifact, constructorArgs, provider = new ElectrumNetworkProvider()) {
19
19
  this.artifact = artifact;
@@ -2,6 +2,9 @@ import { Type } from '@cashscript/utils';
2
2
  export declare class TypeError extends Error {
3
3
  constructor(actual: string, expected: Type);
4
4
  }
5
+ export declare class OutputSatoshisTooSmallError extends Error {
6
+ constructor(satoshis: number);
7
+ }
5
8
  export declare class FailedTransactionError extends Error {
6
9
  reason: string;
7
10
  meep: string;
@@ -28,7 +31,7 @@ export declare enum Reason {
28
31
  SIG_COUNT = "Signature count negative or greater than pubkey count",
29
32
  PUBKEY_COUNT = "Pubkey count negative or limit exceeded",
30
33
  INVALID_OPERAND_SIZE = "Invalid operand size",
31
- INVALID_NUMBER_RANGE = "Given operand is not a number within the valid range [-2^31...2^31]",
34
+ INVALID_NUMBER_RANGE = "Given operand is not a number within the valid range",
32
35
  IMPOSSIBLE_ENCODING = "The requested encoding is impossible to satisfy",
33
36
  INVALID_SPLIT_RANGE = "Invalid OP_SPLIT range",
34
37
  INVALID_BIT_COUNT = "Invalid number of bit set in OP_CHECKMULTISIG",
@@ -58,5 +61,6 @@ export declare enum Reason {
58
61
  CLEANSTACK = "Script did not clean its stack",
59
62
  NONCOMPRESSED_PUBKEY = "Using non-compressed public key",
60
63
  ILLEGAL_FORKID = "Illegal use of SIGHASH_FORKID",
61
- MUST_USE_FORKID = "Signature must use SIGHASH_FORKID"
64
+ MUST_USE_FORKID = "Signature must use SIGHASH_FORKID",
65
+ UNKNOWN = "unknown error"
62
66
  }
@@ -1,8 +1,14 @@
1
+ import { DUST_LIMIT } from './constants.js';
1
2
  export class TypeError extends Error {
2
3
  constructor(actual, expected) {
3
4
  super(`Found type '${actual}' where type '${expected.toString()}' was expected`);
4
5
  }
5
6
  }
7
+ export class OutputSatoshisTooSmallError extends Error {
8
+ constructor(satoshis) {
9
+ super(`Tried to add an output with ${satoshis} satoshis, which is less than the DUST limit (${DUST_LIMIT})`);
10
+ }
11
+ }
6
12
  export class FailedTransactionError extends Error {
7
13
  constructor(reason, meep) {
8
14
  super(`Transaction failed with reason: ${reason}\n${meep}`);
@@ -33,7 +39,7 @@ export var Reason;
33
39
  Reason["SIG_COUNT"] = "Signature count negative or greater than pubkey count";
34
40
  Reason["PUBKEY_COUNT"] = "Pubkey count negative or limit exceeded";
35
41
  Reason["INVALID_OPERAND_SIZE"] = "Invalid operand size";
36
- Reason["INVALID_NUMBER_RANGE"] = "Given operand is not a number within the valid range [-2^31...2^31]";
42
+ Reason["INVALID_NUMBER_RANGE"] = "Given operand is not a number within the valid range";
37
43
  Reason["IMPOSSIBLE_ENCODING"] = "The requested encoding is impossible to satisfy";
38
44
  Reason["INVALID_SPLIT_RANGE"] = "Invalid OP_SPLIT range";
39
45
  Reason["INVALID_BIT_COUNT"] = "Invalid number of bit set in OP_CHECKMULTISIG";
@@ -64,5 +70,6 @@ export var Reason;
64
70
  Reason["NONCOMPRESSED_PUBKEY"] = "Using non-compressed public key";
65
71
  Reason["ILLEGAL_FORKID"] = "Illegal use of SIGHASH_FORKID";
66
72
  Reason["MUST_USE_FORKID"] = "Signature must use SIGHASH_FORKID";
73
+ Reason["UNKNOWN"] = "unknown error";
67
74
  })(Reason || (Reason = {}));
68
75
  //# sourceMappingURL=Errors.js.map
@@ -1,5 +1,5 @@
1
1
  import { Secp256k1 } from '@bitauth/libauth';
2
- import { HashType } from './interfaces';
2
+ import { HashType } from './interfaces.js';
3
3
  export default class SignatureTemplate {
4
4
  private hashtype;
5
5
  private privateKey;
@@ -1,6 +1,6 @@
1
1
  import { decodePrivateKeyWif, SigningSerializationFlag } from '@bitauth/libauth';
2
2
  import { sha256 } from '@cashscript/utils';
3
- import { HashType } from './interfaces';
3
+ import { HashType } from './interfaces.js';
4
4
  export default class SignatureTemplate {
5
5
  constructor(signer, hashtype = HashType.SIGHASH_ALL) {
6
6
  this.hashtype = hashtype;
@@ -1,7 +1,7 @@
1
1
  import { AbiFunction, Script } from '@cashscript/utils';
2
- import { Utxo, Recipient, TransactionDetails } from './interfaces';
3
- import NetworkProvider from './network/NetworkProvider';
4
- import SignatureTemplate from './SignatureTemplate';
2
+ import { Utxo, Recipient, TransactionDetails } from './interfaces.js';
3
+ import NetworkProvider from './network/NetworkProvider.js';
4
+ import SignatureTemplate from './SignatureTemplate.js';
5
5
  export declare class Transaction {
6
6
  private address;
7
7
  private provider;
@@ -10,10 +10,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  import { bigIntToBinUint64LE, hexToBin, binToHex, encodeTransaction, addressContentsToLockingBytecode, AddressType, decodeTransaction, instantiateSecp256k1, } from '@bitauth/libauth';
11
11
  import delay from 'delay';
12
12
  import { hash160, hash256, placeholder, scriptToBytecode, } from '@cashscript/utils';
13
- import { isSignableUtxo, } from './interfaces';
14
- import { meep, createInputScript, getInputSize, createOpReturnOutput, getTxSizeWithoutInputs, getPreimageSize, buildError, addressToLockScript, createSighashPreimage, } from './utils';
15
- import { P2SH_OUTPUT_SIZE, DUST_LIMIT } from './constants';
16
- import SignatureTemplate from './SignatureTemplate';
13
+ import { isSignableUtxo, } from './interfaces.js';
14
+ import { meep, createInputScript, getInputSize, createOpReturnOutput, getTxSizeWithoutInputs, getPreimageSize, buildError, addressToLockScript, createSighashPreimage, validateRecipient, } from './utils.js';
15
+ import { P2SH_OUTPUT_SIZE, DUST_LIMIT } from './constants.js';
16
+ import SignatureTemplate from './SignatureTemplate.js';
17
17
  const bip68 = require('bip68');
18
18
  export class Transaction {
19
19
  constructor(address, provider, redeemScript, abiFunction, args, selector) {
@@ -46,15 +46,14 @@ export class Transaction {
46
46
  }
47
47
  to(toOrOutputs, amount) {
48
48
  if (typeof toOrOutputs === 'string' && typeof amount === 'number') {
49
- this.outputs.push({ to: toOrOutputs, amount });
49
+ return this.to([{ to: toOrOutputs, amount }]);
50
50
  }
51
- else if (Array.isArray(toOrOutputs) && amount === undefined) {
51
+ if (Array.isArray(toOrOutputs) && amount === undefined) {
52
+ toOrOutputs.forEach(validateRecipient);
52
53
  this.outputs = this.outputs.concat(toOrOutputs);
54
+ return this;
53
55
  }
54
- else {
55
- throw new Error('Incorrect arguments passed to function \'to\'');
56
- }
57
- return this;
56
+ throw new Error('Incorrect arguments passed to function \'to\'');
58
57
  }
59
58
  withOpReturn(chunks) {
60
59
  this.outputs.push(createOpReturnOutput(chunks));
@@ -188,6 +187,7 @@ export class Transaction {
188
187
  });
189
188
  }
190
189
  setInputsAndOutputs() {
190
+ var _a;
191
191
  return __awaiter(this, void 0, void 0, function* () {
192
192
  if (this.outputs.length === 0) {
193
193
  throw Error('Attempted to build a transaction without outputs');
@@ -205,9 +205,7 @@ export class Transaction {
205
205
  const inputSize = getInputSize(placeholderScript) + 1;
206
206
  // Calculate amount to send and base fee (excluding additional fees per UTXO)
207
207
  const amount = this.outputs.reduce((acc, output) => acc + output.amount, 0);
208
- let fee = this.hardcodedFee
209
- ? this.hardcodedFee
210
- : getTxSizeWithoutInputs(this.outputs) * this.feePerByte;
208
+ let fee = (_a = this.hardcodedFee) !== null && _a !== void 0 ? _a : getTxSizeWithoutInputs(this.outputs) * this.feePerByte;
211
209
  // Select and gather UTXOs and calculate fees and available funds
212
210
  let satsAvailable = 0;
213
211
  if (this.inputs.length > 0) {
@@ -1,9 +1,9 @@
1
- export { Contract } from './Contract';
2
- export { Transaction } from './Transaction';
3
- export { Argument } from './Argument';
4
- export { default as SignatureTemplate } from './SignatureTemplate';
1
+ export { Contract } from './Contract.js';
2
+ export { Transaction } from './Transaction.js';
3
+ export { Argument } from './Argument.js';
4
+ export { default as SignatureTemplate } from './SignatureTemplate.js';
5
5
  export { Artifact, AbiFunction, AbiInput } from '@cashscript/utils';
6
6
  export * as utils from '@cashscript/utils';
7
- export { Utxo, Recipient, SignatureAlgorithm, HashType, Network, } from './interfaces';
8
- export * from './Errors';
9
- export * from './network';
7
+ export { Utxo, Recipient, SignatureAlgorithm, HashType, Network, } from './interfaces.js';
8
+ export * from './Errors.js';
9
+ export { NetworkProvider, BitboxNetworkProvider, BitcoinRpcNetworkProvider, ElectrumNetworkProvider, FullStackNetworkProvider, } from './network/index.js';
@@ -1,9 +1,9 @@
1
- export { Contract } from './Contract';
2
- export { Transaction } from './Transaction';
3
- export { default as SignatureTemplate } from './SignatureTemplate';
1
+ export { Contract } from './Contract.js';
2
+ export { Transaction } from './Transaction.js';
3
+ export { default as SignatureTemplate } from './SignatureTemplate.js';
4
4
  import * as utils_1 from '@cashscript/utils';
5
5
  export { utils_1 as utils };
6
- export { SignatureAlgorithm, HashType, Network, } from './interfaces';
7
- export * from './Errors';
8
- export * from './network';
6
+ export { SignatureAlgorithm, HashType, Network, } from './interfaces.js';
7
+ export * from './Errors.js';
8
+ export { BitboxNetworkProvider, BitcoinRpcNetworkProvider, ElectrumNetworkProvider, FullStackNetworkProvider, } from './network/index.js';
9
9
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  import { Transaction } from '@bitauth/libauth';
2
- import SignatureTemplate from './SignatureTemplate';
2
+ import type SignatureTemplate from './SignatureTemplate.js';
3
3
  export interface Utxo {
4
4
  txid: string;
5
5
  vout: number;
@@ -30,6 +30,7 @@ export declare enum HashType {
30
30
  export declare const Network: {
31
31
  MAINNET: "mainnet";
32
32
  TESTNET: "testnet";
33
+ STAGING: "staging";
33
34
  REGTEST: "regtest";
34
35
  };
35
36
  export declare type Network = (typeof Network)[keyof typeof Network];
@@ -19,6 +19,7 @@ const literal = (l) => l;
19
19
  export const Network = {
20
20
  MAINNET: literal('mainnet'),
21
21
  TESTNET: literal('testnet'),
22
+ STAGING: literal('staging'),
22
23
  REGTEST: literal('regtest'),
23
24
  };
24
25
  //# sourceMappingURL=interfaces.js.map
@@ -1,5 +1,5 @@
1
- import { Utxo, Network } from '../interfaces';
2
- import NetworkProvider from './NetworkProvider';
1
+ import { Utxo, Network } from '../interfaces.js';
2
+ import NetworkProvider from './NetworkProvider.js';
3
3
  export default class BitboxNetworkProvider implements NetworkProvider {
4
4
  network: Network;
5
5
  private bitbox;
@@ -1,5 +1,5 @@
1
- import { Utxo, Network } from '../interfaces';
2
- import NetworkProvider from './NetworkProvider';
1
+ import { Utxo, Network } from '../interfaces.js';
2
+ import NetworkProvider from './NetworkProvider.js';
3
3
  declare const RpcClientRetry: any;
4
4
  export default class BitcoinRpcNetworkProvider implements NetworkProvider {
5
5
  network: Network;
@@ -1,6 +1,6 @@
1
1
  import { ElectrumCluster } from 'electrum-cash';
2
- import { Utxo, Network } from '../interfaces';
3
- import NetworkProvider from './NetworkProvider';
2
+ import { Utxo, Network } from '../interfaces.js';
3
+ import NetworkProvider from './NetworkProvider.js';
4
4
  export default class ElectrumNetworkProvider implements NetworkProvider {
5
5
  network: Network;
6
6
  private manualConnectionManagement?;