main.go 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. // vaa-test generates VAA test fixtures used by the ETH devnet tests
  2. package main
  3. import (
  4. "crypto/ecdsa"
  5. "encoding/hex"
  6. "fmt"
  7. "math/big"
  8. "math/rand"
  9. "time"
  10. "github.com/ethereum/go-ethereum/common"
  11. "github.com/ethereum/go-ethereum/crypto"
  12. "github.com/certusone/wormhole/node/pkg/ethereum"
  13. "github.com/certusone/wormhole/node/pkg/vaa"
  14. )
  15. type signerInfo struct {
  16. signer *ecdsa.PrivateKey
  17. index int
  18. }
  19. var i = 0
  20. var defaultTargetAddress = vaa.Address{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
  21. func main() {
  22. keys := generateKeys(6)
  23. for i, key := range keys {
  24. fmt.Printf("Key [%d]: %s\n", i, crypto.PubkeyToAddress(key.PublicKey).String())
  25. }
  26. // 0 - Valid transfer, single signer
  27. signAndPrintVAA(&vaa.VAA{
  28. Version: 1,
  29. GuardianSetIndex: 0,
  30. Timestamp: time.Unix(2000, 0),
  31. Payload: &vaa.BodyTransfer{
  32. Nonce: 56,
  33. SourceChain: 1,
  34. TargetChain: 3,
  35. SourceAddress: vaa.Address{2, 1, 4},
  36. TargetAddress: defaultTargetAddress,
  37. Asset: &vaa.AssetMeta{
  38. Chain: vaa.ChainIDSolana,
  39. Address: hexToAddress("0x347ef34687bdc9f189e87a9200658d9c40e9988"),
  40. Decimals: 8,
  41. },
  42. Amount: big.NewInt(1000000000000000000),
  43. },
  44. }, []*signerInfo{{keys[0], 0}})
  45. // 1 - 2 signers, invalid order
  46. signAndPrintVAA(&vaa.VAA{
  47. Version: 1,
  48. GuardianSetIndex: 0,
  49. Timestamp: time.Unix(2000, 0),
  50. Payload: &vaa.BodyTransfer{
  51. Nonce: 56,
  52. SourceChain: 1,
  53. TargetChain: 3,
  54. SourceAddress: vaa.Address{2, 1, 4},
  55. TargetAddress: defaultTargetAddress,
  56. Asset: &vaa.AssetMeta{
  57. Chain: vaa.ChainIDEthereum,
  58. Address: hexToAddress("0xd833215cbcc3f914bd1c9ece3ee7bf8b14f841bb"),
  59. Decimals: 8,
  60. },
  61. Amount: big.NewInt(1000000000000000000),
  62. },
  63. }, []*signerInfo{{keys[1], 1}, {keys[0], 0}})
  64. // 2 - Valid transfer, 2 signers
  65. signAndPrintVAA(&vaa.VAA{
  66. Version: 1,
  67. GuardianSetIndex: 0,
  68. Timestamp: time.Unix(2000, 0),
  69. Payload: &vaa.BodyTransfer{
  70. Nonce: 56,
  71. SourceChain: 1,
  72. TargetChain: 3,
  73. SourceAddress: vaa.Address{2, 1, 4},
  74. TargetAddress: defaultTargetAddress,
  75. Asset: &vaa.AssetMeta{
  76. Chain: vaa.ChainIDEthereum,
  77. Address: hexToAddress("0xd833215cbcc3f914bd1c9ece3ee7bf8b14f841bb"),
  78. Decimals: 8,
  79. },
  80. Amount: big.NewInt(1000000000000000000),
  81. },
  82. }, []*signerInfo{{keys[0], 0}, {keys[1], 1}})
  83. // 3 - Valid transfer, 3 signers
  84. signAndPrintVAA(&vaa.VAA{
  85. Version: 1,
  86. GuardianSetIndex: 0,
  87. Timestamp: time.Unix(2000, 0),
  88. Payload: &vaa.BodyTransfer{
  89. Nonce: 56,
  90. SourceChain: 1,
  91. TargetChain: 3,
  92. SourceAddress: vaa.Address{2, 1, 4},
  93. TargetAddress: defaultTargetAddress,
  94. Asset: &vaa.AssetMeta{
  95. Chain: vaa.ChainIDEthereum,
  96. Address: hexToAddress("0xd833215cbcc3f914bd1c9ece3ee7bf8b14f841bb"),
  97. Decimals: 8,
  98. },
  99. Amount: big.NewInt(1000000000000000000),
  100. },
  101. }, []*signerInfo{{keys[0], 0}, {keys[1], 1}, {keys[2], 2}})
  102. // 4 - Invalid signature, single signer
  103. signAndPrintVAA(&vaa.VAA{
  104. Version: 1,
  105. GuardianSetIndex: 0,
  106. Timestamp: time.Unix(2000, 0),
  107. Payload: &vaa.BodyTransfer{
  108. Nonce: 56,
  109. SourceChain: 1,
  110. TargetChain: 3,
  111. SourceAddress: vaa.Address{2, 1, 4},
  112. TargetAddress: defaultTargetAddress,
  113. Asset: &vaa.AssetMeta{
  114. Chain: vaa.ChainIDSolana,
  115. Address: hexToAddress("0x347ef34687bdc9f189e87a9200658d9c40e9988"),
  116. Decimals: 8,
  117. },
  118. Amount: big.NewInt(1000000000000000000),
  119. },
  120. }, []*signerInfo{{keys[1], 0}})
  121. // 5 - Valid guardian set change
  122. signAndPrintVAA(&vaa.VAA{
  123. Version: 1,
  124. GuardianSetIndex: 0,
  125. Timestamp: time.Unix(2000, 0),
  126. Payload: &vaa.BodyGuardianSetUpdate{
  127. Keys: []common.Address{
  128. crypto.PubkeyToAddress(keys[1].PublicKey),
  129. },
  130. NewIndex: 1,
  131. },
  132. }, []*signerInfo{{keys[0], 0}})
  133. // 6 - Change from set 0 to set 1, single guardian with key#2 (zero-based)
  134. signAndPrintVAA(&vaa.VAA{
  135. Version: 1,
  136. GuardianSetIndex: 0,
  137. Timestamp: time.Unix(2000, 0),
  138. Payload: &vaa.BodyGuardianSetUpdate{
  139. Keys: []common.Address{
  140. crypto.PubkeyToAddress(keys[2].PublicKey),
  141. },
  142. NewIndex: 1,
  143. },
  144. }, []*signerInfo{{keys[0], 0}})
  145. // 7 - Guardian set index jump
  146. signAndPrintVAA(&vaa.VAA{
  147. Version: 1,
  148. GuardianSetIndex: 0,
  149. Timestamp: time.Unix(2000, 0),
  150. Payload: &vaa.BodyGuardianSetUpdate{
  151. Keys: []common.Address{
  152. crypto.PubkeyToAddress(keys[2].PublicKey),
  153. },
  154. NewIndex: 2,
  155. },
  156. }, []*signerInfo{{keys[0], 0}})
  157. // 8 - Invalid target address format
  158. signAndPrintVAA(&vaa.VAA{
  159. Version: 1,
  160. GuardianSetIndex: 0,
  161. Timestamp: time.Unix(2000, 0),
  162. Payload: &vaa.BodyTransfer{
  163. Nonce: 56,
  164. SourceChain: 1,
  165. TargetChain: 3,
  166. SourceAddress: vaa.Address{2, 1, 4},
  167. TargetAddress: hexToAddress("0x347ef34687bdc9f189e87a9200658d9c40e9988"),
  168. Asset: &vaa.AssetMeta{
  169. Chain: vaa.ChainIDSolana,
  170. Address: hexToAddress("0x347ef34687bdc9f189e87a9200658d9c40e9988"),
  171. Decimals: 8,
  172. },
  173. Amount: big.NewInt(1000000000000000000),
  174. },
  175. }, []*signerInfo{{keys[0], 0}})
  176. // 9 - Amount too high (max u128 + 1)
  177. amount, ok := new(big.Int).SetString("100000000000000000000000000000000", 16)
  178. if !ok {
  179. panic("Cannot convert big amount")
  180. }
  181. signAndPrintVAA(&vaa.VAA{
  182. Version: 1,
  183. GuardianSetIndex: 0,
  184. Timestamp: time.Unix(2000, 0),
  185. Payload: &vaa.BodyTransfer{
  186. Nonce: 56,
  187. SourceChain: 1,
  188. TargetChain: 3,
  189. SourceAddress: vaa.Address{2, 1, 4},
  190. TargetAddress: defaultTargetAddress,
  191. Asset: &vaa.AssetMeta{
  192. Chain: vaa.ChainIDSolana,
  193. Address: hexToAddress("0x347ef34687bdc9f189e87a9200658d9c40e9988"),
  194. Decimals: 8,
  195. },
  196. Amount: amount,
  197. },
  198. }, []*signerInfo{{keys[0], 0}})
  199. // 10 - Same source and target
  200. signAndPrintVAA(&vaa.VAA{
  201. Version: 1,
  202. GuardianSetIndex: 0,
  203. Timestamp: time.Unix(1000, 0),
  204. Payload: &vaa.BodyTransfer{
  205. Nonce: 56,
  206. SourceChain: 3,
  207. TargetChain: 3,
  208. SourceAddress: vaa.Address{2, 1, 4},
  209. TargetAddress: defaultTargetAddress,
  210. Asset: &vaa.AssetMeta{
  211. Chain: vaa.ChainIDSolana,
  212. Address: hexToAddress("0x347ef34687bdc9f189e87a9200658d9c40e9988"),
  213. Decimals: 8,
  214. },
  215. Amount: big.NewInt(1000000000000000000),
  216. },
  217. }, []*signerInfo{{keys[0], 0}})
  218. // 11 - Wrong target chain
  219. signAndPrintVAA(&vaa.VAA{
  220. Version: 1,
  221. GuardianSetIndex: 0,
  222. Timestamp: time.Unix(1000, 0),
  223. Payload: &vaa.BodyTransfer{
  224. Nonce: 56,
  225. SourceChain: 1,
  226. TargetChain: 2,
  227. SourceAddress: vaa.Address{2, 1, 4},
  228. TargetAddress: defaultTargetAddress,
  229. Asset: &vaa.AssetMeta{
  230. Chain: vaa.ChainIDSolana,
  231. Address: hexToAddress("0x347ef34687bdc9f189e87a9200658d9c40e9988"),
  232. Decimals: 8,
  233. },
  234. Amount: big.NewInt(1000000000000000000),
  235. },
  236. }, []*signerInfo{{keys[0], 0}})
  237. // 12 - Change guardian set to 6 addresses
  238. signAndPrintVAA(&vaa.VAA{
  239. Version: 1,
  240. GuardianSetIndex: 0,
  241. Timestamp: time.Unix(4000, 0),
  242. Payload: &vaa.BodyGuardianSetUpdate{
  243. Keys: []common.Address{
  244. crypto.PubkeyToAddress(keys[0].PublicKey),
  245. crypto.PubkeyToAddress(keys[1].PublicKey),
  246. crypto.PubkeyToAddress(keys[2].PublicKey),
  247. crypto.PubkeyToAddress(keys[3].PublicKey),
  248. crypto.PubkeyToAddress(keys[4].PublicKey),
  249. crypto.PubkeyToAddress(keys[5].PublicKey),
  250. },
  251. NewIndex: 1,
  252. },
  253. }, []*signerInfo{{keys[0], 0}})
  254. // 13 - Valid transfer, partial quorum
  255. signAndPrintVAA(&vaa.VAA{
  256. Version: 1,
  257. GuardianSetIndex: 1,
  258. Timestamp: time.Unix(4000, 0),
  259. Payload: &vaa.BodyTransfer{
  260. Nonce: 57,
  261. SourceChain: 1,
  262. TargetChain: 3,
  263. SourceAddress: vaa.Address{2, 1, 5},
  264. TargetAddress: defaultTargetAddress,
  265. Asset: &vaa.AssetMeta{
  266. Chain: vaa.ChainIDSolana,
  267. Address: hexToAddress("0x347ef34687bdc9f189e87a9200658d9c40e9988"),
  268. Decimals: 8,
  269. },
  270. Amount: big.NewInt(1000000000000000000),
  271. },
  272. }, []*signerInfo{{keys[0], 0}, {keys[1], 1}, {keys[3], 3}, {keys[4], 4}, {keys[5], 5}})
  273. }
  274. func signAndPrintVAA(vaa *vaa.VAA, signers []*signerInfo) {
  275. for _, signer := range signers {
  276. vaa.AddSignature(signer.signer, uint8(signer.index))
  277. }
  278. vData, err := vaa.Marshal()
  279. if err != nil {
  280. panic(err)
  281. }
  282. println(i, hex.EncodeToString(vData))
  283. i++
  284. }
  285. func generateKeys(n int) (keys []*ecdsa.PrivateKey) {
  286. r := rand.New(rand.NewSource(555))
  287. for i := 0; i < n; i++ {
  288. key, err := ecdsa.GenerateKey(crypto.S256(), r)
  289. if err != nil {
  290. panic(err)
  291. }
  292. keys = append(keys, key)
  293. }
  294. return
  295. }
  296. func hexToAddress(hex string) vaa.Address {
  297. hexAddr := common.HexToAddress(hex)
  298. return ethereum.PadAddress(hexAddr)
  299. }