|
1 | 1 | import { Base58EncodedAddress } from '../base58';
|
2 |
| -import { getProgramDerivedAddress } from '../program-derived-address'; |
| 2 | +import { createAddressWithSeed, getProgramDerivedAddress } from '../computed-address'; |
3 | 3 |
|
4 | 4 | describe('getProgramDerivedAddress()', () => {
|
5 | 5 | it('fatals when supplied more than 16 seeds', async () => {
|
@@ -139,3 +139,38 @@ describe('getProgramDerivedAddress()', () => {
|
139 | 139 | 'fatals when supplied a combination of program address and seeds for which no off-curve point can be found'
|
140 | 140 | );
|
141 | 141 | });
|
| 142 | + |
| 143 | +describe('createAddressWithSeed', () => { |
| 144 | + it('returns an address that is the SHA-256 hash of the concatenated base address, seed, and program address', async () => { |
| 145 | + expect.assertions(2); |
| 146 | + const baseAddress = 'Bh1uUDP3ApWLeccVNHwyQKpnfGQbuE2UECbGA6M4jiZJ' as Base58EncodedAddress; |
| 147 | + const programAddress = 'FGrddpvjBUAG6VdV4fR8Q2hEZTHS6w4SEveVBgfwbfdm' as Base58EncodedAddress; |
| 148 | + const expectedAddress = 'HUKxCeXY6gZohFJFARbLE6L6C9wDEHz1SfK8ENM7QY7z' as Base58EncodedAddress; |
| 149 | + |
| 150 | + await expect(createAddressWithSeed({ baseAddress, programAddress, seed: 'seed' })).resolves.toEqual( |
| 151 | + expectedAddress |
| 152 | + ); |
| 153 | + |
| 154 | + await expect( |
| 155 | + createAddressWithSeed({ baseAddress, programAddress, seed: new Uint8Array([0x73, 0x65, 0x65, 0x64]) }) |
| 156 | + ).resolves.toEqual(expectedAddress); |
| 157 | + }); |
| 158 | + it('fails when the seed is longer than 32 bytes', async () => { |
| 159 | + expect.assertions(1); |
| 160 | + const baseAddress = 'Bh1uUDP3ApWLeccVNHwyQKpnfGQbuE2UECbGA6M4jiZJ' as Base58EncodedAddress; |
| 161 | + const programAddress = 'FGrddpvjBUAG6VdV4fR8Q2hEZTHS6w4SEveVBgfwbfdm' as Base58EncodedAddress; |
| 162 | + |
| 163 | + await expect(createAddressWithSeed({ baseAddress, programAddress, seed: 'a'.repeat(33) })).rejects.toThrow( |
| 164 | + 'The seed exceeds the maximum length of 32 bytes' |
| 165 | + ); |
| 166 | + }); |
| 167 | + it('fails with a malicious programAddress meant to produce an address that would collide with a PDA', async () => { |
| 168 | + expect.assertions(1); |
| 169 | + const baseAddress = 'Bh1uUDP3ApWLeccVNHwyQKpnfGQbuE2UECbGA6M4jiZJ' as Base58EncodedAddress; |
| 170 | + const programAddress = '4vJ9JU1bJJE96FbKdjWme2JfVK1knU936FHTDZV7AC2' as Base58EncodedAddress; |
| 171 | + |
| 172 | + await expect(createAddressWithSeed({ baseAddress, programAddress, seed: 'seed' })).rejects.toThrow( |
| 173 | + 'programAddress cannot end with the PDA marker' |
| 174 | + ); |
| 175 | + }); |
| 176 | +}); |
0 commit comments