| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  | import {Buffer} from 'buffer'; | 
					
						
							| 
									
										
										
										
											2021-02-08 00:57:12 +08:00
										 |  |  | import {keccak_256} from 'js-sha3'; | 
					
						
							| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  | import {privateKeyVerify, ecdsaSign, publicKeyCreate} from 'secp256k1'; | 
					
						
							| 
									
										
										
										
											2020-10-22 13:15:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | import { | 
					
						
							|  |  |  |   Connection, | 
					
						
							| 
									
										
										
										
											2021-05-07 16:59:51 +08:00
										 |  |  |   Keypair, | 
					
						
							| 
									
										
										
										
											2020-10-22 13:15:24 -07:00
										 |  |  |   sendAndConfirmTransaction, | 
					
						
							|  |  |  |   LAMPORTS_PER_SOL, | 
					
						
							|  |  |  |   Transaction, | 
					
						
							| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  |   Secp256k1Program, | 
					
						
							| 
									
										
										
										
											2020-10-22 13:15:24 -07:00
										 |  |  | } from '../src'; | 
					
						
							| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  | import {url} from './url'; | 
					
						
							| 
									
										
										
										
											2020-10-22 13:15:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  | const randomPrivateKey = () => { | 
					
						
							| 
									
										
										
										
											2020-10-22 13:15:24 -07:00
										 |  |  |   let privateKey; | 
					
						
							|  |  |  |   do { | 
					
						
							| 
									
										
										
										
											2021-05-07 16:59:51 +08:00
										 |  |  |     privateKey = Keypair.generate().secretKey.slice(0, 32); | 
					
						
							| 
									
										
										
										
											2020-10-22 13:15:24 -07:00
										 |  |  |   } while (!privateKeyVerify(privateKey)); | 
					
						
							| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  |   return privateKey; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (process.env.TEST_LIVE) { | 
					
						
							|  |  |  |   describe('secp256k1', () => { | 
					
						
							| 
									
										
										
										
											2021-03-03 02:16:36 +08:00
										 |  |  |     const privateKey = randomPrivateKey(); | 
					
						
							|  |  |  |     const publicKey = publicKeyCreate(privateKey, false).slice(1); | 
					
						
							|  |  |  |     const ethAddress = Secp256k1Program.publicKeyToEthAddress(publicKey); | 
					
						
							| 
									
										
										
										
											2021-05-07 16:59:51 +08:00
										 |  |  |     const from = Keypair.generate(); | 
					
						
							| 
									
										
										
										
											2021-03-03 02:16:36 +08:00
										 |  |  |     const connection = new Connection(url, 'confirmed'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     before(async function () { | 
					
						
							|  |  |  |       await connection.confirmTransaction( | 
					
						
							|  |  |  |         await connection.requestAirdrop(from.publicKey, 10 * LAMPORTS_PER_SOL), | 
					
						
							| 
									
										
										
										
											2021-02-08 00:57:12 +08:00
										 |  |  |       ); | 
					
						
							| 
									
										
										
										
											2021-03-03 02:16:36 +08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('create secp256k1 instruction with string address', async () => { | 
					
						
							|  |  |  |       const message = Buffer.from('string address'); | 
					
						
							|  |  |  |       const messageHash = Buffer.from(keccak_256.update(message).digest()); | 
					
						
							| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  |       const {signature, recid: recoveryId} = ecdsaSign(messageHash, privateKey); | 
					
						
							| 
									
										
										
										
											2021-03-03 02:16:36 +08:00
										 |  |  |       const transaction = new Transaction().add( | 
					
						
							|  |  |  |         Secp256k1Program.createInstructionWithEthAddress({ | 
					
						
							|  |  |  |           ethAddress: ethAddress.toString('hex'), | 
					
						
							|  |  |  |           message, | 
					
						
							|  |  |  |           signature, | 
					
						
							|  |  |  |           recoveryId, | 
					
						
							|  |  |  |         }), | 
					
						
							|  |  |  |       ); | 
					
						
							| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-03 02:16:36 +08:00
										 |  |  |       await sendAndConfirmTransaction(connection, transaction, [from]); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('create secp256k1 instruction with 0x prefix string address', async () => { | 
					
						
							|  |  |  |       const message = Buffer.from('0x string address'); | 
					
						
							|  |  |  |       const messageHash = Buffer.from(keccak_256.update(message).digest()); | 
					
						
							|  |  |  |       const {signature, recid: recoveryId} = ecdsaSign(messageHash, privateKey); | 
					
						
							|  |  |  |       const transaction = new Transaction().add( | 
					
						
							|  |  |  |         Secp256k1Program.createInstructionWithEthAddress({ | 
					
						
							|  |  |  |           ethAddress: '0x' + ethAddress.toString('hex'), | 
					
						
							|  |  |  |           message, | 
					
						
							|  |  |  |           signature, | 
					
						
							|  |  |  |           recoveryId, | 
					
						
							|  |  |  |         }), | 
					
						
							| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-03 02:16:36 +08:00
										 |  |  |       await sendAndConfirmTransaction(connection, transaction, [from]); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('create secp256k1 instruction with buffer address', async () => { | 
					
						
							|  |  |  |       const message = Buffer.from('buffer address'); | 
					
						
							|  |  |  |       const messageHash = Buffer.from(keccak_256.update(message).digest()); | 
					
						
							|  |  |  |       const {signature, recid: recoveryId} = ecdsaSign(messageHash, privateKey); | 
					
						
							|  |  |  |       const transaction = new Transaction().add( | 
					
						
							|  |  |  |         Secp256k1Program.createInstructionWithEthAddress({ | 
					
						
							|  |  |  |           ethAddress, | 
					
						
							|  |  |  |           message, | 
					
						
							|  |  |  |           signature, | 
					
						
							|  |  |  |           recoveryId, | 
					
						
							|  |  |  |         }), | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await sendAndConfirmTransaction(connection, transaction, [from]); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('create secp256k1 instruction with public key', async () => { | 
					
						
							|  |  |  |       const message = Buffer.from('public key'); | 
					
						
							|  |  |  |       const messageHash = Buffer.from(keccak_256.update(message).digest()); | 
					
						
							|  |  |  |       const {signature, recid: recoveryId} = ecdsaSign(messageHash, privateKey); | 
					
						
							| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  |       const transaction = new Transaction().add( | 
					
						
							|  |  |  |         Secp256k1Program.createInstructionWithPublicKey({ | 
					
						
							|  |  |  |           publicKey, | 
					
						
							|  |  |  |           message, | 
					
						
							|  |  |  |           signature, | 
					
						
							|  |  |  |           recoveryId, | 
					
						
							|  |  |  |         }), | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-03 02:16:36 +08:00
										 |  |  |       await sendAndConfirmTransaction(connection, transaction, [from]); | 
					
						
							| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('create secp256k1 instruction with private key', async () => { | 
					
						
							| 
									
										
										
										
											2021-03-03 02:16:36 +08:00
										 |  |  |       const message = Buffer.from('private key'); | 
					
						
							| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  |       const transaction = new Transaction().add( | 
					
						
							|  |  |  |         Secp256k1Program.createInstructionWithPrivateKey({ | 
					
						
							|  |  |  |           privateKey, | 
					
						
							| 
									
										
										
										
											2021-03-03 02:16:36 +08:00
										 |  |  |           message, | 
					
						
							| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  |         }), | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-03 02:16:36 +08:00
										 |  |  |       await sendAndConfirmTransaction(connection, transaction, [from]); | 
					
						
							| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-10-22 13:15:24 -07:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2021-02-06 10:59:00 +08:00
										 |  |  | } |