@@ -37,6 +37,8 @@ function createStakeIntent(
3737 bossApiKey : string ,
3838 request : CreateStakeIntentRequest ,
3939) : Promise < CreateStakeIntentResponse > {
40+
41+ // * Create a stake intent with the Staking Integration API: https://docs.blockdaemon.com/reference/postethereumstakeintent
4042 const requestOptions = {
4143 method : 'POST' ,
4244 headers : {
@@ -49,7 +51,7 @@ function createStakeIntent(
4951 } ;
5052
5153 return fetch (
52- ' https://svc.blockdaemon.com/boss/v1/ethereum/holesky /stake-intents' ,
54+ ` https://svc.blockdaemon.com/boss/v1/ethereum/${ process . env . ETHEREUM_NETWORK } /stake-intents` ,
5355 requestOptions ,
5456 ) . then ( response => response . json ( ) as Promise < CreateStakeIntentResponse > ) ;
5557}
@@ -84,6 +86,7 @@ async function main() {
8486
8587 // Set buildervault endpoints
8688
89+ // * BuilderVault mTLS authentication with publickey pinning: https://builder-vault-tsm.docs.blockdaemon.com/docs/authentication-3#public-key-pinning
8790 const serverMtlsPublicKeys = {
8891 0 : `-----BEGIN CERTIFICATE-----\nMIICMTCCAdegAwIBAgICB+MwCgYIKoZIzj0EAwIwgaAxCzAJBgNVBAYTAlVTMRMw\nEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYDVQQHDAtMb3MgQW5nZWxlczEUMBIGA1UE\nCgwLQmxvY2tkYWVtb24xFDASBgNVBAsMC0Jsb2NrZGFlbW9uMRQwEgYDVQQDDAtC\nbG9ja2RhZW1vbjEkMCIGCSqGSIb3DQEJARYVYWRtaW5AYmxvY2tkYWVtb24uY29t\nMB4XDTI0MDIxMzE3MjE0OFoXDTI5MDIxMzE3MjE0OFowTjELMAkGA1UEBhMCVVMx\nEzARBgNVBAgTCkNhbGlmb3JuaWExFDASBgNVBAcTC0xvcyBBbmdlbGVzMRQwEgYD\nVQQKEwtCbG9ja2RhZW1vbjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGlixcUc\nYC0ByeutoHHdi3zxWCg5iPAJcxVLvzBUdD2+XdCWEgS/xwFEef9Tl3xFdfK4iWSQ\nnjmtYMTaHMM6mfWjUjBQMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEF\nBQcDAgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAUW6ouasv5oWo7MZ4ZzlE/mpbDrIMw\nCgYIKoZIzj0EAwIDSAAwRQIgSDKHZmsnylzL8kopFSeo8L6LQGxyd/NsBRb+8STI\n1cECIQChi4cl5nJgTXCBzJEHicnRk/0vl+9zq6iABMV+KTXJxA==\n-----END CERTIFICATE-----` ,
8992 1 : `-----BEGIN CERTIFICATE-----\nMIICMjCCAdegAwIBAgICB+MwCgYIKoZIzj0EAwIwgaAxCzAJBgNVBAYTAlVTMRMw\nEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYDVQQHDAtMb3MgQW5nZWxlczEUMBIGA1UE\nCgwLQmxvY2tkYWVtb24xFDASBgNVBAsMC0Jsb2NrZGFlbW9uMRQwEgYDVQQDDAtC\nbG9ja2RhZW1vbjEkMCIGCSqGSIb3DQEJARYVYWRtaW5AYmxvY2tkYWVtb24uY29t\nMB4XDTI0MDIxMzE3MjEzMloXDTI5MDIxMzE3MjEzMlowTjELMAkGA1UEBhMCVVMx\nEzARBgNVBAgTCkNhbGlmb3JuaWExFDASBgNVBAcTC0xvcyBBbmdlbGVzMRQwEgYD\nVQQKEwtCbG9ja2RhZW1vbjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABKz8yGcE\nYIhaQYCA2As30cRIL2rLrB2uKpcFpydE55RoI3Hw+QaeNCfR5znZQZM4bVVquT4i\nxDGhVnQKU5EQU/WjUjBQMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEF\nBQcDAgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAUW6ouasv5oWo7MZ4ZzlE/mpbDrIMw\nCgYIKoZIzj0EAwIDSQAwRgIhAO9yXpssqar6IdgmEOIfAsha0ZIWG56nwE8/GbyN\nBiTaAiEAhhEClrSm/TzmWxODXamBz0pmQ9qNFsrtbGsDhLOe8O8=\n-----END CERTIFICATE-----` ,
@@ -104,7 +107,7 @@ async function main() {
104107 await TSMClient . withConfiguration ( config1 ) ,
105108 ] ;
106109
107- const threshold = 1 ; // The security threshold for this key
110+ const threshold = 1 ; // * The security threshold for this key https://builder-vault-tsm.docs.blockdaemon.com/docs/security-overview#security-model
108111
109112 const masterKeyId = await getKeyId ( clients , threshold , "key.txt" ) ;
110113
@@ -174,7 +177,8 @@ async function main() {
174177 const totalDepositAmount =
175178 stakes . reduce ( ( sum , next ) => sum + BigInt ( next . amount ) , 0n ) * gwei ;
176179
177- const web3 = new Web3 ( `https://svc.blockdaemon.com/ethereum/holesky/native?apiKey=${ process . env . BLOCKDAEMON_API_KEY } ` ) ;
180+ // * Using Blockdaemon RPC API for Ethereum: https://docs.blockdaemon.com/reference/how-to-access-ethereum-api
181+ const web3 = new Web3 ( `https://svc.blockdaemon.com/ethereum/${ process . env . ETHEREUM_NETWORK } /native?apiKey=${ process . env . BLOCKDAEMON_API_KEY } ` ) ;
178182
179183 // log initial balances
180184 console . log ( "Initial balance:" , await web3 . eth . getBalance ( address ) ) ;
@@ -201,20 +205,16 @@ async function main() {
201205 console . log ( 'Transaction Hash:' , web3 . utils . toHex ( txHash ) ) ;
202206 const { r, s, v} = await signTx ( txHash , clients , masterKeyId , chainPath ) ;
203207
204- const signedTransaction = transaction . _processSignature ( v , web3 . utils . hexToBytes ( r ) , web3 . utils . hexToBytes ( s ) ) ;
205-
206- console . log ( 'Get Sender Address:' , signedTransaction . getSenderAddress ( ) . toString ( ) ) ;
207- console . log ( 'Get Sender pk:' , web3 . utils . bytesToHex ( signedTransaction . getSenderPublicKey ( ) ) ) ;
208+ const signedTransaction = transaction . _processSignature ( v . valueOf ( ) , web3 . utils . hexToBytes ( r ) , web3 . utils . hexToBytes ( s ) ) ;
208209
209210 const serializeTx = TransactionFactory . fromTxData ( signedTransaction ) . serialize ( ) ;
210211 console . log ( 'Signed Transaction:' , web3 . utils . toHex ( serializeTx ) ) ;
211- const txReceipt = await web3 . eth . sendSignedTransaction ( serializeTx )
212+ const txReceipt = await web3 . eth . sendSignedTransaction ( serializeTx ) ;
212213
213- console . log ( txReceipt ) ;
214+ console . log ( `Broadcasted transaction hash: https:// ${ process . env . ETHEREUM_NETWORK } .etherscan.io/tx/ ${ txReceipt . transactionHash } ` ) ;
214215}
215216
216217
217-
218218async function signTx (
219219 messageToSign : Uint8Array ,
220220 clients : TSMClient [ ] ,
@@ -224,14 +224,31 @@ async function signTx(
224224
225225
226226 console . log ( `Builder Vault signing transaction hash...` ) ;
227+
228+ // ToDo: Change to newStaticSessionConfig once TSM nodes are publically signed
229+
230+ // The public keys of the other players to encrypt MPC protocol data end-to-end
231+ const playerB64Pubkeys = [
232+ "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtDFBfanInAMHNKKDG2RW/DiSnYeI7scVvfHIwUIRdbPH0gBrsilqxlvsKZTakN8om/Psc6igO+224X8T0J9eMg==" ,
233+ "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqvSkhonTeNhlETse8v3X7g4p100EW9xIqg4aRpD8yDXgB0UYjhd+gFtOCsRT2lRhuqNForqqC+YnBsJeZ4ANxg==" ,
234+ ] ;
235+
236+ const playerPubkeys = [ ] ;
237+ const playerIds = new Uint32Array ( Array ( clients . length ) . fill ( 0 ) . map ( ( _ , i ) => i ) ) ;
238+ for ( const i of playerIds ) {
239+ const pubkey = Buffer . from ( playerB64Pubkeys [ i ] , "base64" ) ;
240+ playerPubkeys . push ( pubkey ) ;
241+ }
242+
243+ const sessionConfig = await SessionConfig . newSessionConfig ( await SessionConfig . GenerateSessionID ( ) , playerIds , playerPubkeys ) ;
244+
245+ // const sessionConfig = await SessionConfig.newStaticSessionConfig(
246+ // await SessionConfig.GenerateSessionID(),
247+ // clients.length
248+ // );
227249
228250 const partialSignatures : string [ ] = [ ] ;
229251
230- const sessionConfig = await SessionConfig . newStaticSessionConfig (
231- await SessionConfig . GenerateSessionID ( ) ,
232- clients . length
233- ) ;
234-
235252 const partialSignaturePromises : Promise < void > [ ] = [ ] ;
236253
237254 for ( const [ _ , client ] of clients . entries ( ) ) {
@@ -312,7 +329,8 @@ async function getKeyId(
312329 // await SessionConfig.GenerateSessionID(),
313330 // clients.length
314331 // );
315-
332+
333+ // * Generate an ECDSA master key: https://builder-vault-tsm.docs.blockdaemon.com/docs/getting-started-demo-tsm-golang
316334 const masterKeyIds : string [ ] = [ ] ;
317335
318336 clients . forEach ( ( ) => masterKeyIds . push ( "" ) ) ;
0 commit comments