Skip to content

Commit ea411a5

Browse files
committed
Add utilities to create UTXOs when running tests on Chipnet (closes #376)
1 parent b72f9d0 commit ea411a5

18 files changed

Lines changed: 225 additions & 107 deletions

packages/cashscript/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151
"@types/semver": "^7.5.8",
5252
"@vitest/coverage-v8": "^4.0.15",
5353
"eslint": "^8.54.0",
54+
"p-queue": "^9.1.2",
55+
"p-retry": "^8.0.0",
5456
"typescript": "^5.9.2",
5557
"vitest": "^4.0.15"
5658
},

packages/cashscript/test/Contract.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
aliceAddress,
1414
alicePkh, alicePriv, alicePub, bobPriv,
1515
} from './fixture/vars.js';
16+
import { addUtxo } from './test-util.js';
1617
import { generateLibauthSourceOutputs } from '../src/utils.js';
1718
import p2pkhArtifact from './fixture/p2pkh.artifact.js';
1819
import twtArtifact from './fixture/transfer_with_timeout.artifact.js';
@@ -115,7 +116,7 @@ describe('Contract', () => {
115116
// Not very robust, as this depends on the example P2PKH contract having balance
116117
it('should return balance for existing contract', async () => {
117118
const instance = new Contract(p2pkhArtifact, [alicePkh], { provider });
118-
(provider as any).addUtxo?.(instance.address, randomUtxo());
119+
await addUtxo(provider, instance.address, randomUtxo());
119120

120121
expect(await instance.getBalance()).toBeGreaterThan(0n);
121122
});

packages/cashscript/test/TransactionBuilder.test.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { utxoComparator, calculateDust, randomUtxo, randomToken, isNonTokenUtxo,
1717
import p2pkhArtifact from './fixture/p2pkh.artifact.js';
1818
import twtArtifact from './fixture/transfer_with_timeout.artifact.js';
1919
import { TransactionBuilder } from '../src/TransactionBuilder.js';
20-
import { getTxOutputs } from './test-util.js';
20+
import { addUtxo, getTxOutputs } from './test-util.js';
2121
import { generateWcTransactionObjectFixture } from './fixture/walletconnect/fixtures.js';
2222

2323
describe('Transaction Builder', () => {
@@ -28,23 +28,23 @@ describe('Transaction Builder', () => {
2828
let p2pkhInstance: Contract<typeof p2pkhArtifact>;
2929
let twtInstance: Contract<typeof twtArtifact>;
3030

31-
beforeAll(() => {
31+
beforeAll(async () => {
3232
// Note: We instantiate the contract with carolPkh to avoid mempool conflicts with other (P2PKH) tests
3333
p2pkhInstance = new Contract(p2pkhArtifact, [carolPkh], { provider });
3434
twtInstance = new Contract(twtArtifact, [bobPub, carolPub, 100000n], { provider });
3535
console.log(p2pkhInstance.tokenAddress);
3636
console.log(twtInstance.tokenAddress);
37-
(provider as any).addUtxo?.(p2pkhInstance.address, randomUtxo());
38-
(provider as any).addUtxo?.(p2pkhInstance.address, randomUtxo());
39-
(provider as any).addUtxo?.(p2pkhInstance.address, randomUtxo({ token: randomToken() }));
40-
(provider as any).addUtxo?.(twtInstance.address, randomUtxo());
41-
(provider as any).addUtxo?.(twtInstance.address, randomUtxo());
42-
(provider as any).addUtxo?.(aliceAddress, randomUtxo());
43-
(provider as any).addUtxo?.(aliceAddress, randomUtxo());
44-
(provider as any).addUtxo?.(bobAddress, randomUtxo());
45-
(provider as any).addUtxo?.(bobAddress, randomUtxo());
46-
(provider as any).addUtxo?.(carolAddress, randomUtxo());
47-
(provider as any).addUtxo?.(carolAddress, randomUtxo());
37+
await addUtxo(provider, p2pkhInstance.address, randomUtxo());
38+
await addUtxo(provider, p2pkhInstance.address, randomUtxo());
39+
await addUtxo(provider, p2pkhInstance.address, randomUtxo({ token: randomToken() }));
40+
await addUtxo(provider, twtInstance.address, randomUtxo());
41+
await addUtxo(provider, twtInstance.address, randomUtxo());
42+
await addUtxo(provider, aliceAddress, randomUtxo());
43+
await addUtxo(provider, aliceAddress, randomUtxo());
44+
await addUtxo(provider, bobAddress, randomUtxo());
45+
await addUtxo(provider, bobAddress, randomUtxo());
46+
await addUtxo(provider, carolAddress, randomUtxo());
47+
await addUtxo(provider, carolAddress, randomUtxo());
4848
});
4949

5050
describe('test TransactionBuilder.build', () => {

packages/cashscript/test/e2e/Announcement.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Contract, ElectrumNetworkProvider, MockNetworkProvider, Network, TransactionBuilder } from '../../src/index.js';
2-
import { getLargestUtxo, getTxOutputs } from '../test-util.js';
2+
import { addUtxo, getLargestUtxo, getTxOutputs } from '../test-util.js';
33
import { FailedRequireError } from '../../src/Errors.js';
44
import { createOpReturnOutput, randomUtxo } from '../../src/utils.js';
55
import { aliceAddress } from '../fixture/vars.js';
@@ -13,9 +13,9 @@ describe('Announcement', () => {
1313
const announcement = new Contract(artifact, [], { provider });
1414
const minerFee = 1000n;
1515

16-
beforeAll(() => {
16+
beforeAll(async () => {
1717
console.log(announcement.address);
18-
(provider as any).addUtxo?.(announcement.address, randomUtxo());
18+
await addUtxo(provider, announcement.address, randomUtxo());
1919
});
2020

2121
describe('send', () => {

packages/cashscript/test/e2e/BigInt.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
} from '../../src/index.js';
99
import artifact from '../fixture/bigint.artifact.js';
1010
import { randomUtxo } from '../../src/utils.js';
11-
import { gatherUtxos } from '../test-util.js';
11+
import { addUtxo, gatherUtxos } from '../test-util.js';
1212

1313
describe('BigInt', () => {
1414
const provider = process.env.TESTS_USE_CHIPNET
@@ -18,9 +18,9 @@ describe('BigInt', () => {
1818
const bigintContract = new Contract(artifact, [], { provider });
1919
const MAX_INT64 = BigInt('9223372036854775807');
2020

21-
beforeAll(() => {
21+
beforeAll(async () => {
2222
console.log(bigintContract.address);
23-
(provider as any).addUtxo?.(bigintContract.address, randomUtxo());
23+
await addUtxo(provider, bigintContract.address, randomUtxo());
2424
});
2525

2626
describe('proofOfBigInt', () => {

packages/cashscript/test/e2e/HodlVault.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
oracle,
1515
oraclePub,
1616
} from '../fixture/vars.js';
17-
import { gatherUtxos, getTxOutputs } from '../test-util.js';
17+
import { addUtxo, gatherUtxos, getTxOutputs } from '../test-util.js';
1818
import { FailedRequireError } from '../../src/Errors.js';
1919
import artifact from '../fixture/hodl_vault.artifact.js';
2020
import artifactUnenforcedTypes from '../fixture/hodl_vault-unenforced-types.artifact.js';
@@ -28,9 +28,9 @@ describe('HodlVault', () => {
2828

2929
const hodlVault = new Contract(artifact, [alicePub, oraclePub, 99000n, 30000n], { provider });
3030

31-
beforeAll(() => {
31+
beforeAll(async () => {
3232
console.log(hodlVault.address);
33-
(provider as any).addUtxo?.(hodlVault.address, randomUtxo());
33+
await addUtxo(provider, hodlVault.address, randomUtxo());
3434
});
3535

3636
describe('send', () => {

packages/cashscript/test/e2e/Mecenas.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
aliceAddress,
66
bobAddress,
77
} from '../fixture/vars.js';
8-
import { getLargestUtxo, getTxOutputs } from '../test-util.js';
8+
import { addUtxo, getLargestUtxo, getTxOutputs } from '../test-util.js';
99
import { FailedRequireError } from '../../src/Errors.js';
1010
import artifact from '../fixture/mecenas.artifact.js';
1111
import { randomUtxo } from '../../src/utils.js';
@@ -20,9 +20,9 @@ describe('Mecenas', () => {
2020
const mecenas = new Contract(artifact, [alicePkh, bobPkh, pledge], { provider });
2121
const minerFee = 1000n;
2222

23-
beforeAll(() => {
23+
beforeAll(async () => {
2424
console.log(mecenas.address);
25-
(provider as any).addUtxo?.(mecenas.address, randomUtxo());
25+
await addUtxo(provider, mecenas.address, randomUtxo());
2626
});
2727

2828
describe('send', () => {

packages/cashscript/test/e2e/MultiContract.test.ts

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ import {
1818
carolPriv,
1919
carolPub,
2020
} from '../fixture/vars.js';
21-
import { Network } from '../../src/interfaces.js';
21+
import { Network, Utxo } from '../../src/interfaces.js';
2222
import { addressToLockScript, randomUtxo } from '../../src/utils.js';
2323
import p2pkhArtifact from '../fixture/p2pkh.artifact.js';
2424
import twtArtifact from '../fixture/transfer_with_timeout.artifact.js';
25-
import { getTxOutputs } from '../test-util.js';
25+
import { addUtxo, getTxOutputs } from '../test-util.js';
2626
import SiblingIntrospectionArtifact from '../fixture/SiblingIntrospection.artifact.js';
2727

2828
describe('Multi Contract', () => {
@@ -38,16 +38,16 @@ describe('Multi Contract', () => {
3838
const p2pkhInstance1 = new Contract(p2pkhArtifact, [bobPkh], { provider });
3939
const p2pkhInstance2 = new Contract(p2pkhArtifact, [carolPkh], { provider });
4040

41-
beforeAll(() => {
41+
beforeAll(async () => {
4242
// Note: We instantiate the contract with carolPkh to avoid mempool conflicts with other (P2PKH) tests
4343
console.log(p2pkhInstance1.tokenAddress);
4444
console.log(p2pkhInstance2.tokenAddress);
45-
(provider as any).addUtxo?.(p2pkhInstance1.address, randomUtxo());
46-
(provider as any).addUtxo?.(p2pkhInstance1.address, randomUtxo());
47-
(provider as any).addUtxo?.(p2pkhInstance2.address, randomUtxo());
48-
(provider as any).addUtxo?.(p2pkhInstance2.address, randomUtxo());
49-
(provider as any).addUtxo?.(bobAddress, randomUtxo());
50-
(provider as any).addUtxo?.(bobAddress, randomUtxo());
45+
await addUtxo(provider, p2pkhInstance1.address, randomUtxo());
46+
await addUtxo(provider, p2pkhInstance1.address, randomUtxo());
47+
await addUtxo(provider, p2pkhInstance2.address, randomUtxo());
48+
await addUtxo(provider, p2pkhInstance2.address, randomUtxo());
49+
await addUtxo(provider, bobAddress, randomUtxo());
50+
await addUtxo(provider, bobAddress, randomUtxo());
5151
});
5252

5353
it('should fail with correct errors when using incorrect unlocker for p2pkhInstance1', async () => {
@@ -126,14 +126,14 @@ describe('Multi Contract', () => {
126126

127127
describe('Different contracts', () => {
128128
const p2pkhContract = new Contract(p2pkhArtifact, [bobPkh], { provider });
129-
const twtContract = new Contract(twtArtifact, [bobPub, carolPub, 100000n], { provider });
129+
const twtContract = new Contract(twtArtifact, [bobPub, carolPub, 100_000n], { provider });
130130

131-
beforeAll(() => {
131+
beforeAll(async () => {
132132
console.log(p2pkhContract.tokenAddress);
133133
console.log(twtContract.tokenAddress);
134134

135-
(provider as any).addUtxo?.(p2pkhContract.address, randomUtxo());
136-
(provider as any).addUtxo?.(twtContract.address, randomUtxo());
135+
await addUtxo(provider, p2pkhContract.address, randomUtxo());
136+
await addUtxo(provider, twtContract.address, randomUtxo());
137137
});
138138

139139
it('should fail with correct errors when using incorrect unlocker for p2pkhContract', async () => {
@@ -198,7 +198,7 @@ describe('Multi Contract', () => {
198198
.addInput(twtContractUtxos[0], twtContract.unlock.timeout(bobSignatureTemplate))
199199
.addInput(bobAddressUtxos[0], bobSignatureTemplate.unlockP2PKH())
200200
.addOutput({ to, amount })
201-
.setLocktime(1000000)
201+
.setLocktime(100_000)
202202
.send();
203203

204204
// then
@@ -214,13 +214,15 @@ describe('Multi Contract', () => {
214214
const correctLockingBytecode = addressToLockScript(correctContract.address);
215215
const siblingIntrospectionContract = new Contract(SiblingIntrospectionArtifact, [correctLockingBytecode], { provider });
216216

217-
const correctContractUtxo = randomUtxo();
218-
const incorrectContractUtxo = randomUtxo();
219-
const siblingIntrospectionUtxo = randomUtxo();
217+
let correctContractUtxo: Utxo;
218+
let incorrectContractUtxo: Utxo;
219+
let siblingIntrospectionUtxo: Utxo;
220220

221-
(provider as any).addUtxo?.(correctContract.address, correctContractUtxo);
222-
(provider as any).addUtxo?.(incorrectContract.address, incorrectContractUtxo);
223-
(provider as any).addUtxo?.(siblingIntrospectionContract.address, siblingIntrospectionUtxo);
221+
beforeAll(async () => {
222+
correctContractUtxo = await addUtxo(provider, correctContract.address, randomUtxo());
223+
incorrectContractUtxo = await addUtxo(provider, incorrectContract.address, randomUtxo());
224+
siblingIntrospectionUtxo = await addUtxo(provider, siblingIntrospectionContract.address, randomUtxo());
225+
});
224226

225227
it('should succeed when introspecting correct sibling UTXOs', async () => {
226228
// given

packages/cashscript/test/e2e/P2PKH-tokens.test.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,45 +9,45 @@ import {
99
alicePub,
1010
alicePriv,
1111
} from '../fixture/vars.js';
12-
import { getTxOutputs } from '../test-util.js';
12+
import { addUtxo, getTxOutputs } from '../test-util.js';
1313
import { Network, TokenDetails, Utxo } from '../../src/interfaces.js';
1414
import artifact from '../fixture/p2pkh.artifact.js';
1515

1616
describe('P2PKH-tokens', () => {
1717
let p2pkhInstance: Contract<typeof artifact>;
1818
let provider: NetworkProvider;
1919

20-
beforeAll(() => {
20+
beforeAll(async () => {
2121
provider = process.env.TESTS_USE_CHIPNET
2222
? new ElectrumNetworkProvider(Network.CHIPNET)
2323
: new MockNetworkProvider();
2424

2525
p2pkhInstance = new Contract(artifact, [alicePkh], { provider });
2626
console.log(p2pkhInstance.tokenAddress);
27-
(provider as any).addUtxo?.(p2pkhInstance.address, randomUtxo());
28-
(provider as any).addUtxo?.(p2pkhInstance.address, randomUtxo());
29-
(provider as any).addUtxo?.(p2pkhInstance.address, randomUtxo({ vout: 0 }));
30-
(provider as any).addUtxo?.(p2pkhInstance.address, randomUtxo({
27+
await addUtxo(provider, p2pkhInstance.address, randomUtxo());
28+
await addUtxo(provider, p2pkhInstance.address, randomUtxo());
29+
await addUtxo(provider, p2pkhInstance.address, randomUtxo({ vout: 0 }));
30+
await addUtxo(provider, p2pkhInstance.address, randomUtxo({
3131
satoshis: 1000n,
3232
token: randomToken(),
3333
}));
34-
(provider as any).addUtxo?.(p2pkhInstance.address, randomUtxo({
34+
await addUtxo(provider, p2pkhInstance.address, randomUtxo({
3535
satoshis: 1000n,
3636
token: randomToken(),
3737
}));
38-
(provider as any).addUtxo?.(p2pkhInstance.address, randomUtxo({
38+
await addUtxo(provider, p2pkhInstance.address, randomUtxo({
3939
satoshis: 1000n,
4040
token: randomNFT(),
4141
}));
42-
(provider as any).addUtxo?.(p2pkhInstance.address, randomUtxo({
42+
await addUtxo(provider, p2pkhInstance.address, randomUtxo({
4343
satoshis: 1000n,
4444
token: randomNFT(),
4545
}));
46-
(provider as any).addUtxo?.(p2pkhInstance.address, randomUtxo({
46+
await addUtxo(provider, p2pkhInstance.address, randomUtxo({
4747
satoshis: 1000n,
4848
token: { ...randomNFT(), ...randomToken() },
4949
}));
50-
(provider as any).addUtxo?.(p2pkhInstance.address, randomUtxo({
50+
await addUtxo(provider, p2pkhInstance.address, randomUtxo({
5151
satoshis: 1000n,
5252
token: { ...randomToken(), ...randomNFT() },
5353
}));

packages/cashscript/test/e2e/P2PKH.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
alicePub,
1414
aliceAddress,
1515
} from '../fixture/vars.js';
16-
import { gatherUtxos, getTxOutputs } from '../test-util.js';
16+
import { addUtxo, gatherUtxos, getTxOutputs } from '../test-util.js';
1717
import { Network } from '../../src/interfaces.js';
1818
import {
1919
createOpReturnOutput, randomUtxo,
@@ -28,13 +28,13 @@ describe('P2PKH-no-tokens', () => {
2828
// define contract in the describe block so artifact typings aren't lost
2929
const p2pkhContract = new Contract(artifact, [bobPkh], { provider });
3030

31-
beforeAll(() => {
31+
beforeAll(async () => {
3232
// Note: We instantiate the contract with bobPkh to avoid mempool conflicts with other (P2PKH tokens) tests
3333
console.log(p2pkhContract.tokenAddress);
34-
(provider as any).addUtxo?.(p2pkhContract.address, randomUtxo({ satoshis: 10000000n }));
35-
(provider as any).addUtxo?.(p2pkhContract.address, randomUtxo({ satoshis: 10000000n }));
36-
(provider as any).addUtxo?.(bobAddress, randomUtxo());
37-
(provider as any).addUtxo?.(bobAddress, randomUtxo());
34+
await addUtxo(provider, p2pkhContract.address, randomUtxo());
35+
await addUtxo(provider, p2pkhContract.address, randomUtxo());
36+
await addUtxo(provider, bobAddress, randomUtxo());
37+
await addUtxo(provider, bobAddress, randomUtxo());
3838
});
3939

4040
describe('send', () => {

0 commit comments

Comments
 (0)