Compare commits

...

9 Commits

Author SHA1 Message Date
bruce-riley 25f9ba6e62
Merge 32b1665ed7 into d44451d7b5 2024-04-26 09:50:49 -07:00
Bruce Riley d44451d7b5 Client/js: Scroll and blast mainnet support 2024-04-26 12:37:18 -04:00
Bruce Riley 32b1665ed7 Add admin command tests 2024-04-26 10:37:17 -05:00
Bruce Riley ec80f937c7 Code review rework 2024-04-26 10:37:17 -05:00
Bruce Riley 34fb0a816d Node: Adminserver commands should not panic 2024-04-26 10:37:17 -05:00
Evan Gray 6adb1e899a deployments: update standardRelayerVAAs.csv to gs4 2024-04-26 11:24:01 -04:00
Bruce Riley 473b095b3f Client/js: Wormholescan URL is wrong 2024-04-26 11:04:38 -04:00
bruce-riley 73cbcabcec
Deploy Scroll and Blast mainnet (#3909)
* Deploy Scroll and Blast mainnet

* Rework
2024-04-26 10:04:29 -05:00
Dirk Brink d63f2ca532 node: Manual initial token list for Blast and Scroll 2024-04-26 09:48:21 -04:00
23 changed files with 1693 additions and 207 deletions

View File

@ -10,7 +10,7 @@
"license": "Apache-2.0",
"dependencies": {
"@celo-tools/celo-ethers-wrapper": "^0.1.0",
"@certusone/wormhole-sdk": "^0.10.14",
"@certusone/wormhole-sdk": "^0.10.15",
"@cosmjs/encoding": "^0.26.2",
"@improbable-eng/grpc-web-node-http-transport": "^0.15.0",
"@injectivelabs/networks": "^1.10.7",
@ -683,9 +683,9 @@
}
},
"node_modules/@certusone/wormhole-sdk": {
"version": "0.10.14",
"resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk/-/wormhole-sdk-0.10.14.tgz",
"integrity": "sha512-36pEcLZbG+DLFKL2N7khLLnSYBMPoMpJrUs7IFqps3i+PhCZ6e8xb2ohNcIKX58G9Ibj+xRmc5ilo+D37WodVg==",
"version": "0.10.15",
"resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk/-/wormhole-sdk-0.10.15.tgz",
"integrity": "sha512-XECfrvdYjsGPZWyR1bqWCPOiRw7+6upszpSvAXjKIqEnTNXOCYRkt5ae8TVh5oZxPjpts2X3t4Oi9WGcEssHpQ==",
"dependencies": {
"@certusone/wormhole-sdk-proto-web": "0.0.7",
"@certusone/wormhole-sdk-wasm": "^0.0.1",
@ -11917,9 +11917,9 @@
"requires": {}
},
"@certusone/wormhole-sdk": {
"version": "0.10.14",
"resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk/-/wormhole-sdk-0.10.14.tgz",
"integrity": "sha512-36pEcLZbG+DLFKL2N7khLLnSYBMPoMpJrUs7IFqps3i+PhCZ6e8xb2ohNcIKX58G9Ibj+xRmc5ilo+D37WodVg==",
"version": "0.10.15",
"resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk/-/wormhole-sdk-0.10.15.tgz",
"integrity": "sha512-XECfrvdYjsGPZWyR1bqWCPOiRw7+6upszpSvAXjKIqEnTNXOCYRkt5ae8TVh5oZxPjpts2X3t4Oi9WGcEssHpQ==",
"requires": {
"@certusone/wormhole-sdk-proto-web": "0.0.7",
"@certusone/wormhole-sdk-wasm": "^0.0.1",

View File

@ -1,6 +1,6 @@
{
"name": "@wormhole-foundation/wormhole-cli",
"version": "0.0.3",
"version": "0.0.4",
"sideEffects": [
"src/side-effects.ts"
],
@ -30,7 +30,7 @@
],
"dependencies": {
"@celo-tools/celo-ethers-wrapper": "^0.1.0",
"@certusone/wormhole-sdk": "^0.10.14",
"@certusone/wormhole-sdk": "^0.10.15",
"@cosmjs/encoding": "^0.26.2",
"@improbable-eng/grpc-web-node-http-transport": "^0.15.0",
"@injectivelabs/networks": "^1.10.7",

View File

@ -172,7 +172,7 @@ export const handler = async (
}));
} else if (argv.wormscan) {
const wormscanurl =
"https://api.wormscan.io/api/v1/observations/" +
"https://api.wormholescan.io/api/v1/observations/" +
vaa.emitterChain.toString() +
"/" +
vaa.emitterAddress.replace(/^(0x)/, "") +

View File

@ -172,9 +172,9 @@ const MAINNET = {
chain_id: 30,
},
scroll: {
rpc: undefined,
key: undefined,
chain_id: undefined,
rpc: "https://rpc.ankr.com/scroll",
key: getEnvVar("ETH_KEY"),
chain_id: 534352,
},
mantle: {
rpc: undefined,
@ -182,9 +182,9 @@ const MAINNET = {
chain_id: undefined,
},
blast: {
rpc: undefined,
key: undefined,
chain_id: undefined,
rpc: "https://rpc.ankr.com/blast",
key: getEnvVar("ETH_KEY"),
chain_id: 81457,
},
xlayer: {
rpc: undefined,

View File

@ -1,11 +1,11 @@
Ethereum (2) Standard Relayer,01000000030d003f39e29280cb340fdea6e91de35155ce11fac49da591cf7efd61f12f4d3f46663d7c4575ec830c35c1cc19017a79e28eedc1d10fcfff4595b1dbbfc9047d55990103bb91bf8f33762ee6b07abb3119c4ba748d092bfafe87d360db962d99c96462920abb4e6d076e9d54aeafe8dec563b1930a4305e2b3961cd363bc203be0649f270005245ef83e663fbc6e9cb3f2c9eebbe44eac2f6e5844c13610333d64340c7e4407611f4e11d676e9773502f6ca6c070975297cf6f372dce0875de3f8ba80b48f58010696ea72db18de430b5c071bb09d51d53d03197a33b1df0711b5f859149ddcfc7358c84573a7518b3719b67ec01fa07140dda7241b087807c1d4548c1876559d2801086fb2063f49bc33d1f25ee13ac31cbb2a0ba540f419df1cd03c91d0aeb8e97d5e6feae3da4362897531428190a8b458c327e256016ab6ac62cc1b1e931225baee01098bfe9db66d5d50eb6177143e8db1b23200c677266f02ac2d1c04b90ee9a1d1b476a9f4f93752555e86a54e2f5bb666866310f8f587356c594218aaf41d20fbce010ab66121eb5bf8f432e1ae32bb988dd7c33d482fe4d63abe1386d38cdddae0c03964d792f2704309bceaae0c1b322e46aa651c6e2a3c2611903cddbc87363bdc75000cb22b8172a90abf14aaee5a80bb97380275798e1f89479be50b54b4549e2fcbbf285af8ed730998caa93612dac4e80eff36ea82e945672e46128d7abe12c1936a000d4ef0a4d42e2be648eb6bd37d6184c123ab0a31dd804970416972e5be3fbd6a0044d9d2dd64a430cca95110ff36f2f363fa90a0ceb524f229b46caa85f9b18bc4000e0ddb23380953eaba05b8d493f2193860f10079a2ff6ffc00bd11db94e22b5f0e1ab3bf4517972a0aa2d7ed18551231e083e48ccc07e8d64ed20fbb6d57151b8200108a585d5960d95a50f9cd6c8ca4b8ae7a70b4549a052771edff1a0c3a409ea5cd286eae6c53eb280038605384d051e04e8c2c531c0f8713e36a5c4d71a044a40b0011fa3cd95765d64bbdc070008c3111ffaf46ada75e4dc39607c643b547c3f70d423f0f4ee2ae5d7ed4361869896dcb012368a0a9586881c579a877728fd761f53a0112447e5b97e5341c5ff2e91c0aba8b48ca985f369992f00fb17fdc9c0f6576b93c6beaf3a44dfe8972df1f28c4eda7336a7955e6d33a4cc1e1c324ad45de72d56e0000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdccca8200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000200000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
BSC (4) Standard Relayer,01000000030d002e0a85cefc9dc34ead9571b45e9a296c58d8c43c4272ef5e50c8d1d0367e828a37bc44055960b5542ec79b5081c2de229ae7a5555d409235792e3cdfac3d495201030941c73fc173d2f1bfa810a141db2343f3d4ff420c56ff09354b2718b5baa4887922208e9097f19f6607d8b79bfc7ad469d4bacd3f60ae9589fdad238aa1d95301051da5b430178acfde6091d4cfd836926097be2862e30b96d89d03f9d6b9bc1a8319c814c9186d30a564db790136e24229be6c21a115518fb2e0a7f3f5053771c4010616dbe51c1f120717f6522d72cf85e42315d65dd049fce9e691658d1a0e3d98c865c71d6fc5cf7682991c476bb5ade4048d71e3ce81ba5fa2632dbd17a352260f0108fbd37725bc32e5e9a872f0477be346ed302afd45d9b0e5724347adc0cd142c020f134770727c9d57fffa249980c3687cc98d62196064c30df7a7147f07ce3af60009f6a21b63b3c8c18f96b5ff71256d5ed0f630de90ee65eebdaf6b5916b4d6fdb276d7dfdae5e05ff52a2f77b8801cbcb1fb988c6b4adcddd9aaef2e78847500f1010abc2784590de571f08bf3003ecd50a564303376c0da7a145118153022be444d940238147ca54bf65f2c312389f568ba80b0c547413a8fb527452f09320f23347f000ce6b17e707f79583df2837cec6cf05f5d3f70b99f04ef6c3a54d55e770f2aca4a78da87446c11bb39ffbaebd324d7b369944049457bbc97256dd7b06a61127263010d42c86ce3294e2cae5304d94aeb30de4c686612d090f41998af8a1473fab4fa605579308201183510ba56602f2dbba3694959e052e0d2ec973f127308517898ba010e113a38c219ebb990c5bf15c9b155bb45bcc773b53dbc2c3fcac866ab00e0f2be61e3962b99e25bbe5fefe2b0af5fde001e35a71e1856b369b5a179d3c0a826b20110ea9e738d883dc8a194c9f180a1123c2496be82678047d6220600657df77b28fd1ec53df79bc47487af116070ed44a58ab86e05030892c2107342dba5f742eb390011759c6d8c25ed3f4a60b7c30473cef12f1652231ee5e2d98efc29ffe3290a6ef37fbee021b0dcddbfbf11104ca1d9451d3ed455816821e2c089538e7d605e0a380012a07c722f449b863d996f15185efa1fb5b056be6d404c8e793492edb5736372f27a9ee67e7b4998e81cee5f45626984d801b81ef7ebc980cde1959a48b1ad57c70000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdccca9200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000400000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Polygon (5) Standard Relayer,01000000030d004e90dfa99044e47b564eecadb2c658583064ac566daf77286761684cc687e9d65173cca86b6188c277847846681ae11bdbf1b966ae65180c7d878ff48135cfa00003f100618c84ff56ea49f563b432bad076350fae7cfcfb3dec92540803d84ea93b5da4c7fa7bd7ec363b9b612dcda7cfec9fbebdbce517dc30903f13c2ec5cb14e0105ce71d2e594f36caf27e8b769261e59b91e9e57fa16205c6d375074615088917e05130f24f1bf948431bcb025aecbf24dcf286297a3002c37ebe72acb5c2430c601068445c65befad456f1cc427c80b2243b23700c152afc60b298ccf5d24261bd9ee1627bc40aa527bc67de91de14cc0dfb2d99b9ec08d31a7ae3e1acef1ff22acbf0008991ec96f347b242770e978a6473da8c82b14dcb9a5ccc05dde4bcf1125e3d9481c25f188d07e1e4e68a916cd79ab21f41a5433d779660d15808e6c172c55accd0009425e5f3f71af0a6ebed1bb037590319bad260e2ebd8b889bc64f782e594792a52874c1973cf69b76f20a33317fa8f16e982afc85fe147ba742be1222d942dcf8000acb1b63f1a4f30702e2b883eecc8048ba91b38a09fffed33299b0e5aeabe09f7809fca5f75fc6a4022b902be7caf793a18d1371aecb3d9bf0d7d27640777b2cd7000cb6f2500ce351272a1d874e2c9516c566cd85702872e2b8b0fa09c54a0f03dbcd27c1ecb367da1dce046b4eeaea922f9ff172886ae4e50799248f58821e543f6d000d2c307443c8329b1c9e456334253c604b5d6c1d7f5dcd4406d9d8c4ed138b72f479ff2f412a41474f3d619a41c8bf216898b8e8a17d3cd7275e6929bcc221b848010e79b575b4795c6d3cccaef379c2f533de626df9a87a52389f38fac3f5d77b57aa317aaefa4386aac86638a9e19cd0dcbd92f9f087fed54c9e28cbb7eb7cc75b8401108d63f8802b17d2ae03a138c123b06a3be5fbed3d478672dc5009a6b6cdb13dea467ac4dcb16784cccd9ca9459ee98ceeafa0c9f444cdbd3654f034f288a24fe90111bd3e4eb9455c06c3aff08836f55add7b1bc5d389a1a02d02abcd5d54e5c1df1c31796b93b0b0e85320f8036a38513bc48008b4acc0890936bd46165f2589d69400127f69a920ebe11ad7b73eb13a8b2729d7a2972ef6b86ec2d9b2ca5f4e3b8b9cb70195f59e62b715724ed2221e32c4f537858d12506ec4d4cbf566982bf63bfb5a0100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccaa200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000500000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Avalanche (6) Standard Relayer,01000000030d00bbfe94366547d476cc80ea55d4e62ee810c59951089c89f07d5e6dc088761384178868b90f76f3858fb749573a2eb03a4d05f8f680972d38ce5055385018a7bf010301035d39f88f4d0751269ae4e098bbe47f3591357c1b616b3e34a5c21c4c1f2c6bfd2b19a8078419699405f38d4c30b3d4970c8a7a37729dfc5c319f299883ac010566ec129bfd891f510f4b350743f2ba9c061b0b94d9cc20d0a75c20dd863722d830ad196d3cd9fb5158337e875a7848e8653d50ff7e7e63c41c2995e57e1c0397010604b345098da327b1ce27ee48a6d2bfd26a744090540042dc1d698a458f726b730f39815ab1254cc9b45bf1fb12ca62ea9b5f9f3285974c350fa7e23fe4a9c8bf010881a52213d65d8fcca6c99cea3b2d134518a451a277a0b92fcf0dba0684fc52c37254b8a2ffb450a1e0777bad5097d907cf5a48c7d70c037b3a362f1973b143d2010928b25ec1394bf9caaf9c95ef074babef722c15b0a4edccedac3fdbd6a6bd87d36ac2fb490e4605eb0d53db3eda85527fe5f00171a5a5a81b283c401ef0369794010ab5470061217ac4b94fcc45fc23292d51c04719493a2785a0caf76eb3497a402e13890bde914f07b680b84079f87bd1448ed8e4f2b1d6a60661986a6f51593d66000c28468c40328aca78777e19c2722b37057250178d92a2d66aab52d8b60bdfcb407696bdb1e2df2b002fa8e99647540a00b58c1d1f11e86a274ced8f8d8b268083010d5fa87309ca8cb8ac33c516a3c3ce860c2c69411c4f5abfec0d8ee7f08a917718371fc2e5445d27f9915cfd72396ab0b0f76fdc820f87dedfa6a129a376d39671000e028b814eb1f74fbf10a5fb2c465a254b0002830aad9201555d7f9b5061bf99f41cbeca0fbb2b6dda51fda40dfcf88be08b3c9a9ee1410347a0dff0f70a76fd560010fa217241fb64df96812ba7adea8ff477b4c03a76c25ebb3f8bc817afca2a735c7c8d0c57e02ced4c522dc5c5c02758eee91fd3bbf8f69057e93cce6ed177c9d500115cd9c43d6c791a3ad05cea7cfd97f76a1eefa267e134f0d8144b9fc527f93d2e017c44c427670248954d1d119b712412e032ace9f4879b8c36439c100318d0f000127cb2e52609a2ef2838b24744233ba084f76748d2b553abefc70cef8f05eb16731e013081b28eae042ef40f73104ba2b91760e9369168ed91bb98d985edc025f10100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccab200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000600000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Fantom (10) Standard Relayer,01000000030d000afc75cbef72bcf6cc35dafdf4547edb0051789ac0afbd34c7cefa561a1cc2f0199f316ce3bb93d339f86dc44986d41e33677f33d9f9742c624befefbda05a370103d3cf95aa84035358f41d4b0f5dd0c59c2de8b69af4db84e29b5df51781d4a4437cb885054e625a4ad03324573e033bee6e4169fa7fa169c2fb4a5c4c7e69bee001051f843a340ffd3a605fd84480ef14d8595b1fffdd45a7e1c919c686ac1bd234bb4255d6ff88990e33dbeb751c06ff6ba5c63469fef50fb9924c135a2e81db0f91000678e5e902519def669dc1b03d3c9be4b84589a6322bcdf3c8cb056192a13774487a49709566d0cc68fdd9c6d1f368152f1c0728bba71031a867dbf8a170cf694e0008b25df04e7b4147bd3ae3960fe7f181968c084b63a89ca11c28e557d516e6ac3b623b56e9472041a8ce9fab0be14e9f6593caf203242f5a1a8c00c8a23f947183000919c402479e75615c767de34eb463099fc752c82aa9def7bb5dca812dc5d1a14c268f8c8a4c659be8fae0e51d2f0ed120cccac58344ca9b3df9a9cd21fe1919f9000a7c96e0c21eb74310637c8bccfac24bf91190dfca3a7499bae885a4dec541c58f241933b0d567854b6d8c2fcc284e9077ffab16d6c9c0f9b24cdc2f7875e0a8fc010ccdad41a3722e94317d99ec9542e3aa59ea9cf0297f450edc57c037408bdc5d5770df000375a79ae231aff1eb128c657d0965fe8e4fb5efef26720848b6e68a14010d419a91a2299ba3d983171250bfcda19b462c6cecd6c689ab44cd06d77b3c9bc71f532521b1334308bfed01640ab3c8d212f2e69f349c7697fabcf95f43afdce7010e2238dd50fac23d82778680768dc5cf4ffd02bbb351483dd625e034c9dd0be00a1a2c49f95238a7cfd7ec45038b4478a457e9b9c217fff574b7dd9d5663c6534600100fafc125ed044c06597a7563f22a5ed5071cda2e928bf401a71592af7abd6cf45b114d1d69ab5c784cd4adddbbf51b461e85c41f5792c5e309f86787196f9f560011141a93514e4236da671151dfce33f1fd24dd6e9cc88d16ba2fb8e04c664576b122cf795666f5b5df601b2243382b99852cd23840d91c6fd7dfbb33e27753794a0012880041feece8698f81bb66e9817ffeaa30eb58b5ee4f667a24fb05030fa2ffbc347cfc3f30bd9a18ae8e5e9c01ed40d46459d25e96c486cf849d5f4dbea188480000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccac200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000a00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Klaytn (13) Standard Relayer,01000000030d00c9b9d25eaf56c5936f66f147fe45061729bfad0514c1dbc21a6b3e8c41fd669c43f8fc2dd2792ad106d9b23d7d2161374fdb24084e4dc44b246986243177e4e30003a73bdd6b228644bdc483bc8910c39f120b83c315c33764c308d9f73bc2b30c4f26ce6b93e3de1cceab441db14445318075bde8e15e9aa77fa6c311e40bdc068000053e88ee079e28c6ebd2cdd47cee327b7ba9cd985c5b01352efc25689ebeca85844f7bc66da3266dbe5d5bba69ce0f3c217e87a051fb2de74c253c1193e52b171c01064a46327c3abc0f34caa2cef14341903e14a3b84e67d594f45d0105e2e3b4ebac3793967c20da12aa3f38101fae3f071fe870fbe574657c021949d3df3003a6a701082d5c3b48bd744256c9eeab8845402e5a937481c8ae1fc525da22c9987953e3467e19a6a31c66ba8bff7dcd24d7d23b02d44c79a09da9efacb5d9be8f0dce269d0109bc3c217eb4557cbd5b486ce13e577322808eddad286ff56f8c6403de7217a32a102e634be26acadd332b24a05a04068f823a74a6a41c4e2f91ab23f6217d8ac8010a823b3773e8a5c222bf5a28b95d2ebaa992ba4f8522337e8d2aba19bbe1ad72b4222e6a86a97e346ca937464098bf5f649f5f7e6e18e71d5b4aabdc0c19bb5130000cc6d232cfefef4ec108fbef959aa294074eacb83b6c7a8fe5f6b3e76b6d4b3c4679e1e6acb3186651d7fe984c1fa895c4afbb421b18074f917e3224b684d9006e000dd4936f7cbe9cbc64a98a654d4673e66dde3a5ccd52f8f3e16fa69c01f1e63b80362aa8f70c771b04a080bf847b5015914e189c9053e659c996dfb4e1275bd4ea000e8ab19b52ecc453b221bd23b3b437243da76ac0ad88e49e71baeaae300654d8344687f7cb1d69df24426e3d18e90ba39c1267c63725712ab125749642f8742c530110ab99b0e5b37c20f786b296923131c5df829498559e46f1e5c2971fed93ceab1700a61354b60fb640e369755a9978bc57df01a55391cb5fc7400c6caed0121a890111c844b51223b2fe13448366c8cd00edc91e688ec419aeec97bd41ae9776f317f1770c1742825c3cc1bde2c0f8928edc24874abf23d94d3d12f121b661d313913b0012f46057fb23e8b994dfd0168f8dce2f661ee24fb9ffa0be22a8b0ab4424f3ffc6567d9e5c124d2dcee0d3dae8eb786f0c1d4b38fa857e17310bd25e4092c371c20000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccaf200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000d00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Celo (14) Standard Relayer,01000000030d0059eacacdd28f4646e520abfc7ef33cf313a1b8f020a27e1808f0a58df34a5ebd1d8bf0e8aca4fb0db614558b1100c80be7ddb4d8ae50232d93240fc9364887ad01032085d87ad27eaa019d14cdeeea575f926ec1db44180cb1932b6ff54b56f0a9d73bab0e952fabcba8135fad9f187db120ea6fdf260cfb3869d973d3eb725c457a01050c37eebf1a94032b3fb7f53ffabeee25610a804c7f58c7ab7e82b8d103adbe1f3af1ae9967f1045c040aa5f3a4c8e4d8d5a3802ca826483e9a1a15f8e42399050106f88d72d019b83cb9b10309c8146e19769da72bb59a26369249fe39b51d475d570e57f5e19cd864af9835c4809b2668afb6690b24f271d37d9caf7089402a67140108e7ec94efd6c6c06e792c3a7e8885bf305cd652a76876d49697c99ddfc9a98b786bc215521a03151718cd81fc4619c72ffeeb29e6cd968dab9d512f7d2d0eba8800095b6f138e529675fe335e5a72f6bc1a35d20cf518786519c24ab014ceef61eb7133adcb701a7f75ccbacc12ab5e74dbc7c083ea8318d0eede51f486292c901e74010a538c2fbf35b4630f13e694da19fd3e2fa57438622af490fd3bb19a620f88be3678b5d6408c7177575d04a6559bc0bd19538f93e6dd5288d9931511ab8c512d31000c6563e95259a53f854c5441759804111e52ce42e5332df7ca601cb14091d3c6d81a37ffb91829cafc053e14af24a59ffcabc3fd774e1399901154d52d634057fa000dd639c68822ed4f29afbdfe349fb31cc367b065f5a3bfb73587e0aaf8dd0ad5161be5fd99d78628a7bdfa8c07ffaa47d6c4b58e6b470dabecfbe95db39a96496a010eb85a203b18444f5d26beac38279081d618a50a77f0fcb7d7ff3f51fb2705d9a167bf7c7a2506dc4ac90b946ee63d8a9ea6bfad8aa8494f99f2af5d15d190801b011018d5a390d01b98d9762222d97d3cb988573f256a7a3d512bb26db78f2e1284be020a6d5a9660a869dceba199308db403e0708c785e1c2715821f69a091f39d8b01110767d6f4f27f9db7ae9e4256b9a857e78571e92197cbc8218551da332fb4110e07dfcc73438b8473b91f3a93a4bd96be9dbaff86b524eb8dc1639da33f1f79a00012b00387cd213e2e6ec3973bd90d98eb4c500c9c6aa893cb1d607d9842a326b6e75a5644785dd5ff7c2eef012e938b6df215ed4e97b8223c078fc8a8dba92787770100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb0200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000e00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Moonbeam (16) Standard Relayer,01000000030d00147ce69eaecfb38adcf8f953bf97f1718fa3db81c1609e42ecedefee95f6fb216f20a5e3562e53a8016b4c5ac45c93f749ed3ba9381685037490286a55e5dbc50003aea201f953a34c7b5cbbccbec6c42d474107efa3c1f5f25137f0f7f1f8f3446f53fbf9b1d475f396cd04878e0bf9ef58014beec38c3fb698d38602fbdfb5f18b0105fb93126334289857302eaf327690a0d8457098fac094a6817b49f38841c385295998dfc8d50071f296053d8fc472685fee36dd8990c8230f3e276e1b873a75be0006241945f86c1abef3ee1286b1422c92bafed7b38c3daec22ba602526675b4d35e1938ab844b416b6a803bde5b12648d66e9bae68e34dc87450a69a64bbd2034ba00084ee90ad3baa0ee4ccb987f686246958634fd8834790f8b664f8ff60bf1d83e25636b9e9ccf6323234cdbd8e52c138c98f85d4ad2c40a15b136520adcf36180010109a76104932e8c3a7336ca6cdd33b1b69cbf750eb724e368fae15334ec880921963c9f5e317de2b6d7bfc634c1cf6d26567662dbe90a0f78989c2e09d8671ee004000a4b57433c1f5608e4c0e78fbb597271bdb79060a01126d555db0a00e4160e2a0e6194e6a2c815109b3ca69b14b8995fb8b5123c11e769b65865c0c48d547c15b0000c7be055a164a254ef1a8d423fb8a740f365e384dbfb1df6279ec1aa2f8e8ec33f5359e3dbc50ed0b6a6f81cc28a8df550e0b22f4039197c939fb08bf9af6207a2000dffa23f41b9167fbbcbff97425f015f62d68d4f469f0973bdecb8fab41a44c1f131ac820ee22318ea239a7455e1611c77aa7d26783aa1a11203b72f447519520c010e3ef1157fe2d4df059a0d4d3796783bcd9acbd30b9ba81273841a6f82c56b710417dbe60447e5c1bc362bdae2eb15cdcf2af4d0b76577b1b13925e0ab105b43340010443e60d8ca17b58f77996ddac9525cfaeaf5092ebea04f13fdf0aab8204bbaa23c04b1987b95836d36d706597b2439acddd2539d9f6c0bbeea970de801f9eaa500114a111aeaf1f695515f01fb174e606835292a99a2d953db84753369b7f6aec89a4e9e12db15b76a880b92983f28937e8e2569bd3a7eeddfe710c8fc4fce011ed80112433a42154cbdb6f1b1bdbccff6fdcb90e8b174540e63825af039b8fc43c1bd6211c1cb4849d6ca8cb2aaefedc684717faebe50b111a44f8224debf9aa0bbe5b00100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb1200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001000000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Arbitrum (23) Standard Relayer,01000000030d002a7523753fc4db66ca547f99a7d2f3369ec80ba3694dc80270b7efced21f900454e5968e3d6b3166f98c53dee11aa62d537bca8016eab1371d155de2146fb0790003d60b1a8ec2b4ce27e2b7298bb3cb503008b945480d537546dba2a0b1afdc80e26bc0b07d9ee4f3ef40048e25d72d23de26d22dbbc7c23df6eef0367111ea466d00053542fa8dba6b62072372bf92ef566f1ade2a95f7abe97692d20bec89c9ad220e49718ebccd0697ca592458d79a73c3f489ba7b5bfc51d9cafc9fd3b54e5d82fa0006b1f4dfb7ee4bb3059c0f9fb81c6afd5b7703d7e0b54720067d7ff7c62755aa3f0e806c426c5a7238917f89cfda30b80e7633cff6005a5965cf61356f551964a50008ebe7c99a2e83a7515927246ac0accad976a388245acce1f41ab198d37b32dcd72717e17dd7339e04d0b97a89356fa994e5b1a036ec80eb681a9c3472c26dfa1400090e98acccf12cba83b7bb65b88f532afa0f86bc068e1313e186b49e9850650c7c6ebaccc02e627b5d7470ef9035c08cae8d874dc4b371945b289706deac7d9008010aa0f27bcfc63715902446fdf352554ea699e361b8e3dcbc57b840f8b5f7dc745e02847d83317d2029b73d47daca88852f1beb2a49004c1c1e9ef4b501f417dcc6010c724aa60c084bcc159af35a9d58078d667534cb67bcfca5f959e05eb1b0956d4a02ef98abc9ac677b779b1fbd7505b1621b0935d1a58d7373c36b96b99f8cc0fb000d3139b25069520a4bd9c61905e7fd83ce21eb5786b26b1e5b96772e4933a6eb163dd4031a1bed0cc65e39e00d0a000c917b69015696cb1eed816be864b65abfb2000e794260e5d734ae20e53ff34799b2a9a39f0f792371f8f27e70cd5c14a3d781816b7dc8a3da6ba886f2c21b304648c51c16892da6bacd10776182cb65c9c46b0101100efc7a08cb812ab047bd67e624197e8244adc6a1ce0d9ef30c469bb5918606e55e3aca65054e0f46e6e7eca8f20b9c4128791ba04496ae9713c5242883777a67011137416a6f4a919b2b4dfafb55c38669b93d66810ab0c77cd9285c71fe3a3e38a36b18c4fb1f6e0700b89afb8f74f056dd58846fb8d0444c3b405afb7755faa3990012747f08fba62aa374373a5c36b6fb29a36d4e382efb2b0a54b039aeb8f76fc764683b02c529802297429d0fb5320b1e6e5c63acf309e03e0f15f7a1fe74eff30f0000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb2200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001700000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Optimism (24) Standard Relayer,01000000030d006706123794be8c86c236a0416cc1d7730e1a892ae2f5f83cdce8cadf42d61ff10ced17f17d6e2af4cd2689b8e0ebd903cce7f5643e8d8b76f55411129c575365010311e848aaea7323cddfe9d1f45189acf490d3130b9961855aa00c20e7149395a17f133ce44cd4a16078f2f884806d901eb3c56c7fa11a6c628ae659ba602913ea01059d830b8110639295a06447b4f54ed72585a30256bf600b7f0fca48f71b30b74f02a4e64c1f2c4152a2f3b7e8ac28e8029c0f60fe4c92f00f5cff8e5daf2395210006dd08a89b93920292bafca3ab963d171e884cd3bbb9b857bf6f87ab27ad2792150ed5bf038693e6ccb855d2376fc0a4087747fd1154dcc4c20b75df05a758196f010809d6a0821706b2fda0e73c4ddb551981dad9dc1c2c8e85a902195cebd1d8565e528fd078005dfed95fdb92dcad5971ce68f7b5f897f72544a346a073129ac6a700098f24b7e0e5a26410c66b1b1945494d36b9fff6dacf16c5a6a22f01a9ecc021951fd6f992c0ba7ab688b5a90fcd9f96a7fd28bf044a576d58b1a9b85f6964d430000a0323d4671721c0262265a37ff9e3459196ebb928c3568ef4b15f5812ae411f1e4cf9acf02be0f66d380abdcbd1cede4c35483e680a0c330d4fa04551e7b39a63000c4d0e32decb9285203ec763ed6cab15a1fd91fa8bfaf3bfaf449a08e52b79bdb76a10fe2a67974ca57549811cea6b51f39d8abc47b7cd9969e7d6f3b86c3949a6000df8b8844a14ed09439311cf4588760e80ad2a6c460759a85145ded663c503882a367a8ea4727e147822bb6396102d0ce6b90d1e6b87b6ce727d5fdc202b83579f000eea060f748330d8c31e520b8c3b68873e47a6dabe9bd0889dcd7525700b90134b4892bb973ed3aca95343644e5e87b3615409f2a872be97b9a8aaa3566135465000105f7c654722a67c678528e8d6a64a26f5999c70cf33adacd1cfb64d0f8b0c26f81810ba862ac88aafaa90ab5a0669aad2610dd7ad16b1133f4c0dcd4d491a462f0111b698f2fe7cd834d2bdff5d4e2f0289d9631bb910db3e64b91689b7aee09b273679c4cc40da83f0a579a06c756abb9ad9d2ba150a4d18be34c5e88010c46dce6700120ff19d84f49d84cadf0c27f91955b36980271a571c17ac85daf121bb6d0490857cd79a89eb5e1532b74439887ea0f66a5f9ae804ff063b896b24d5014b8e95ff0000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb3200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001800000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Base (30) Standard Relayer,01000000030d00df8b4dd3d24304810ddbf4cf43fc4507b56728f76e6b1d102a6ba646d0c63b2b4148223e19ae06f40ca072fe16333a4c44748bc37457835966c69f35b4d27501010247e8f4a5a1e5a4f858444a50f419a477866f7ad10af94d62251ff5a7f4a42a9215002d6b5a7939224d6221d743a0107792b4a1efd42619732a34c7c2cdc4401100036fb6ef9f9c50657d7791bb344b948d6c812f1b4070381003a942419b174c4fc94cb8d63cec79e13982a2642d789054d0746498807da03d3c59a39efa29232dbf0104bbf027b263137578ea240576f12e3dc1470ceda63391dfeaaf0f71af0adfa764772a206847aa10646aef2ebdba8ca21b6c08088cb58942f2145c5120e0f94b86000674719843c99e12cd2b9b37f98431f8dd8bd2d74b0794291fd8d7b8b575bcc8964ee2c7982fb4932621996d587eb4ff4861e1d0e6d873ee1ee8b9f684f08426250108f33ed961639ec82c1be05528b8a75f6657bcebec68827e8f295899e41423e22205312e5e7bb6453004df0eadbe11eb79588ee16f5b35fc8db2f7dc7d457bfaa20009e439e5b37dacdec25d12cba1531efceb2f130a812d2d99fcb728282bce06dbe91fab11228716ea1d430ae8a08ecc2482e30b439b912b7b0dcc95cc80e98fe6da010a5224519f03cf83b67ed6d31a5495edcf66ac10da2d94bac542109be2d075f7230b63c1576641ad6d9a54b1fbd5fa7fbe3c08cd08f673318476aaf9fcef48c6e5010ba277e69a71938f8b1197cb6975968f7e4780fda8e6136d23d2c9f5cbbb15d2ae682321eb8b5f683c5825b74492e7a2a4d18ac20cd8c30fe3fa712bd71c8b6033010d06fba68375dfdf6d76c97d3a2e0ea1c9b243d8f7a37114406fc67cb7545c717402faf5175907d1ccd943f20d539b815eb936d430fc3dfb35c3316a2342dba38d010e4ca329b5c61f7faa4223595fe3dd4d14d77506c36013c6ce8e34834d48380f75536d12e3a9cef5446a33766a500a676c3d59b09e984e0f31be780bd736a8150b0010788d6362177378258f98c0a1a5a85b229b2316e43b28a08c68e0303fe2bae4a27cf109f07ed6efa6be02379b07b4ba02c9d81c478263eda7a3c279af2d4987fa0112d5b4f5a87674f8c4a686ac67806a45440d30861a43191ec72e5f75a733a8b51c189659e8ed8ff7be73d3a14780a46cb34a58a5308f7381d668e8db58198f185501000000006b45a1a900010000000000000000000000000000000000000000000000000000000000000004555704dcd5046cc4200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001e000000000000000000000000706f82e9bb5b0813501714ab5974216704980e31
Ethereum (2) Standard Relayer,010000000411011cc9ccac1e8e7926f87bba430c7d44bd74f2d894aff5f254ccc38117ea60dcdd5d5fe8764291740cc0b3bf9a933af8b7d5831a4036fd724cb4c4394ce681149a0102798dd4c1f6ed41f190eaeb8243f08678808cccb7e467d69abb83a88414211c032fba01893f5c408e307ceebd74ceae8d6605f5911e682d566cb66dd501e04f570103bb91bf8f33762ee6b07abb3119c4ba748d092bfafe87d360db962d99c96462920abb4e6d076e9d54aeafe8dec563b1930a4305e2b3961cd363bc203be0649f270004a87c289caf311c65374cbb573fb30b489aff09a66d7a09f9a95ec50f05981bca5266c862bc9bbeafd793debd4cf3eac2ee50f010df931bb6877f1090bad5b9b50105245ef83e663fbc6e9cb3f2c9eebbe44eac2f6e5844c13610333d64340c7e4407611f4e11d676e9773502f6ca6c070975297cf6f372dce0875de3f8ba80b48f58010696ea72db18de430b5c071bb09d51d53d03197a33b1df0711b5f859149ddcfc7358c84573a7518b3719b67ec01fa07140dda7241b087807c1d4548c1876559d280107451380b740bb8688e23e7e0875bfe5a44e511c4a581f81db9a8f097290bb42cc16ca0c609356f692ccedf5d8fc40bb12cdf0ed7af252992da2eac282e3de9fd000086fb2063f49bc33d1f25ee13ac31cbb2a0ba540f419df1cd03c91d0aeb8e97d5e6feae3da4362897531428190a8b458c327e256016ab6ac62cc1b1e931225baee01098bfe9db66d5d50eb6177143e8db1b23200c677266f02ac2d1c04b90ee9a1d1b476a9f4f93752555e86a54e2f5bb666866310f8f587356c594218aaf41d20fbce010ab66121eb5bf8f432e1ae32bb988dd7c33d482fe4d63abe1386d38cdddae0c03964d792f2704309bceaae0c1b322e46aa651c6e2a3c2611903cddbc87363bdc75000b443a31980905ef953c262a9521a815c6c676b84b00d3ae2e8783b212785863da7ca89406b27f9343529ca245552b5ddbcff32b84ff42c62bbad28e5cbd2f874d000d4ef0a4d42e2be648eb6bd37d6184c123ab0a31dd804970416972e5be3fbd6a0044d9d2dd64a430cca95110ff36f2f363fa90a0ceb524f229b46caa85f9b18bc4000e0ddb23380953eaba05b8d493f2193860f10079a2ff6ffc00bd11db94e22b5f0e1ab3bf4517972a0aa2d7ed18551231e083e48ccc07e8d64ed20fbb6d57151b82000f39eebea1eec93d3afc71cb9ce966daafc586d47863cdff25a413470d3cd5ee2d55fb1edbddfa5c7fcc9d5834db2f6f82a380e1e5d6da9112d4497ab28d3c385501108a585d5960d95a50f9cd6c8ca4b8ae7a70b4549a052771edff1a0c3a409ea5cd286eae6c53eb280038605384d051e04e8c2c531c0f8713e36a5c4d71a044a40b0011fa3cd95765d64bbdc070008c3111ffaf46ada75e4dc39607c643b547c3f70d423f0f4ee2ae5d7ed4361869896dcb012368a0a9586881c579a877728fd761f53a0112447e5b97e5341c5ff2e91c0aba8b48ca985f369992f00fb17fdc9c0f6576b93c6beaf3a44dfe8972df1f28c4eda7336a7955e6d33a4cc1e1c324ad45de72d56e0000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdccca8200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000200000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
BSC (4) Standard Relayer,010000000412017e9b9065c4e951aa2be60cf6245381abbccb02a3ac6b0f4ef3ad4cf5d20653d3523e21898e03fe391eb12b187da849ffe1126d85f4d11f94c428086e67e3680901026da8015f1f571f50d3a53846ac0f1c75edef71e7207f818605a0096083fa3095144fd514006caca2456c0924e44480115702b733bb10b51f7ae742a4980bd72d01030941c73fc173d2f1bfa810a141db2343f3d4ff420c56ff09354b2718b5baa4887922208e9097f19f6607d8b79bfc7ad469d4bacd3f60ae9589fdad238aa1d95301047e8ab11f6a80c2d09eb9717766af25cd68bcf8dd90385395110094ea4bde30393b1ce9caa4ad41cb254462a9ec56f9838b26ebf72f9034e9bd89a6be3c5d318100051da5b430178acfde6091d4cfd836926097be2862e30b96d89d03f9d6b9bc1a8319c814c9186d30a564db790136e24229be6c21a115518fb2e0a7f3f5053771c4010616dbe51c1f120717f6522d72cf85e42315d65dd049fce9e691658d1a0e3d98c865c71d6fc5cf7682991c476bb5ade4048d71e3ce81ba5fa2632dbd17a352260f0107e1725d04e8ae2dd9a418d04c4cda324c1e0ab23d4dc710e7a962231b5daf083c39e2ece6968a26bbf62f88af603b8191d39d0fcd7d66375e49010de37f5c52030108fbd37725bc32e5e9a872f0477be346ed302afd45d9b0e5724347adc0cd142c020f134770727c9d57fffa249980c3687cc98d62196064c30df7a7147f07ce3af60009f6a21b63b3c8c18f96b5ff71256d5ed0f630de90ee65eebdaf6b5916b4d6fdb276d7dfdae5e05ff52a2f77b8801cbcb1fb988c6b4adcddd9aaef2e78847500f1010abc2784590de571f08bf3003ecd50a564303376c0da7a145118153022be444d940238147ca54bf65f2c312389f568ba80b0c547413a8fb527452f09320f23347f000b09cfc420c968ea26f5ca6f4cffaeca802ad7419b7fd62b616d9d677ece38665712367d18c22deeec861ccc97dbb42b862493426639ae7d77f6594a6ec3a4dabb010ce6b17e707f79583df2837cec6cf05f5d3f70b99f04ef6c3a54d55e770f2aca4a78da87446c11bb39ffbaebd324d7b369944049457bbc97256dd7b06a61127263010d42c86ce3294e2cae5304d94aeb30de4c686612d090f41998af8a1473fab4fa605579308201183510ba56602f2dbba3694959e052e0d2ec973f127308517898ba010e113a38c219ebb990c5bf15c9b155bb45bcc773b53dbc2c3fcac866ab00e0f2be61e3962b99e25bbe5fefe2b0af5fde001e35a71e1856b369b5a179d3c0a826b2010ffddb788ef1f70a205d08d44a8d5762c5f5ae5b236eb2534b55e80193c558a6f460bf89a618cf57530ef32102b2e880fb088c062e0bae28f3386dc65cdd58c19c0110ea9e738d883dc8a194c9f180a1123c2496be82678047d6220600657df77b28fd1ec53df79bc47487af116070ed44a58ab86e05030892c2107342dba5f742eb390011759c6d8c25ed3f4a60b7c30473cef12f1652231ee5e2d98efc29ffe3290a6ef37fbee021b0dcddbfbf11104ca1d9451d3ed455816821e2c089538e7d605e0a380012a07c722f449b863d996f15185efa1fb5b056be6d404c8e793492edb5736372f27a9ee67e7b4998e81cee5f45626984d801b81ef7ebc980cde1959a48b1ad57c70000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdccca9200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000400000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Polygon (5) Standard Relayer,01000000041001f100c23d38d57e97e66009b25adc7ebcaf920f5a1f621d5755d331de61c5f21631a6f0c9fbea8ad75534af4947a4df72cc293944b1aafbbcf0727f31e4071b810003f100618c84ff56ea49f563b432bad076350fae7cfcfb3dec92540803d84ea93b5da4c7fa7bd7ec363b9b612dcda7cfec9fbebdbce517dc30903f13c2ec5cb14e01044a5a94e02266383a11d1c63fdf50b2cf4a4c75fbebf158843865377f01a0cc4710e908e5190abbcabcfef294d7a054eee84a9bb0ead041c09d10f7a9cb2077000105ce71d2e594f36caf27e8b769261e59b91e9e57fa16205c6d375074615088917e05130f24f1bf948431bcb025aecbf24dcf286297a3002c37ebe72acb5c2430c601068445c65befad456f1cc427c80b2243b23700c152afc60b298ccf5d24261bd9ee1627bc40aa527bc67de91de14cc0dfb2d99b9ec08d31a7ae3e1acef1ff22acbf00074569b66d9ee98c4f2ac6f5498c721f3bc66fa9bbb0ec5e783ee381f9f06046ad54042a921a3f7367ddb192ce880ed5794272dedf0a34f791ef4370bc07743ef60008991ec96f347b242770e978a6473da8c82b14dcb9a5ccc05dde4bcf1125e3d9481c25f188d07e1e4e68a916cd79ab21f41a5433d779660d15808e6c172c55accd0009425e5f3f71af0a6ebed1bb037590319bad260e2ebd8b889bc64f782e594792a52874c1973cf69b76f20a33317fa8f16e982afc85fe147ba742be1222d942dcf8000acb1b63f1a4f30702e2b883eecc8048ba91b38a09fffed33299b0e5aeabe09f7809fca5f75fc6a4022b902be7caf793a18d1371aecb3d9bf0d7d27640777b2cd7000bad7121a6512bfe27856dcbd5c1aa96ef1fdb6110b322a0750870b96aed6f06a30678ed78b4e7dc8c57a6171aefc1b9ca7e991ac4a47d2655caf38d22858d0cb6000d2c307443c8329b1c9e456334253c604b5d6c1d7f5dcd4406d9d8c4ed138b72f479ff2f412a41474f3d619a41c8bf216898b8e8a17d3cd7275e6929bcc221b848010e79b575b4795c6d3cccaef379c2f533de626df9a87a52389f38fac3f5d77b57aa317aaefa4386aac86638a9e19cd0dcbd92f9f087fed54c9e28cbb7eb7cc75b84010fa8c983e5931d1276f84540c4005a16d53071e7a65013c5a9812c4e213556739b687a483eb19abb3f1cb73db7d6cd924d212d3c261d4f3018e8dd96c99dc8104500108d63f8802b17d2ae03a138c123b06a3be5fbed3d478672dc5009a6b6cdb13dea467ac4dcb16784cccd9ca9459ee98ceeafa0c9f444cdbd3654f034f288a24fe90111bd3e4eb9455c06c3aff08836f55add7b1bc5d389a1a02d02abcd5d54e5c1df1c31796b93b0b0e85320f8036a38513bc48008b4acc0890936bd46165f2589d69400127f69a920ebe11ad7b73eb13a8b2729d7a2972ef6b86ec2d9b2ca5f4e3b8b9cb70195f59e62b715724ed2221e32c4f537858d12506ec4d4cbf566982bf63bfb5a0100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccaa200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000500000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Avalanche (6) Standard Relayer,010000000411018a3011f6bab8f816897c708383adf3f5d49be545bb889f4f63133f373c54f02d62237e540224cfc4378bc2e09ff6127a5e2cb8e49bc5d8d96c9d4209ec772bbc0102c09524e6fa41789b556325a4a893546508e5c730ef7f52e4ea7640c381dd476e125708b397751ee2f344b6e123c044ade712f7f83be418c0ced63a2aecae3968010301035d39f88f4d0751269ae4e098bbe47f3591357c1b616b3e34a5c21c4c1f2c6bfd2b19a8078419699405f38d4c30b3d4970c8a7a37729dfc5c319f299883ac01041f645ef4100c53a244d4963a122657e93e8999baa3f6d1ba4f85377fecb9175a31b6e00635e4d06229892e922e79ce817847476e4f3a0be7d83ff59b472610d6000566ec129bfd891f510f4b350743f2ba9c061b0b94d9cc20d0a75c20dd863722d830ad196d3cd9fb5158337e875a7848e8653d50ff7e7e63c41c2995e57e1c0397010604b345098da327b1ce27ee48a6d2bfd26a744090540042dc1d698a458f726b730f39815ab1254cc9b45bf1fb12ca62ea9b5f9f3285974c350fa7e23fe4a9c8bf0107c9f099ea1e931af596d0def924eccb4b2e64fb77b0afca8b112c1b30ab3aa26e765d0ad8ed0128a31c0fc4048f1cdcefcd4c7678c259d06ea7dabbd720fbc8a8000881a52213d65d8fcca6c99cea3b2d134518a451a277a0b92fcf0dba0684fc52c37254b8a2ffb450a1e0777bad5097d907cf5a48c7d70c037b3a362f1973b143d2010928b25ec1394bf9caaf9c95ef074babef722c15b0a4edccedac3fdbd6a6bd87d36ac2fb490e4605eb0d53db3eda85527fe5f00171a5a5a81b283c401ef0369794010ab5470061217ac4b94fcc45fc23292d51c04719493a2785a0caf76eb3497a402e13890bde914f07b680b84079f87bd1448ed8e4f2b1d6a60661986a6f51593d66000ba84a3b14fd2843dfdc408190f1330539d7db5204cada959b82c9a118ff9c633a1c3ff7abf7b2a0bfd7003fec72303a0f39dacd6bb905b2c721bef7f9250b3f1e000d5fa87309ca8cb8ac33c516a3c3ce860c2c69411c4f5abfec0d8ee7f08a917718371fc2e5445d27f9915cfd72396ab0b0f76fdc820f87dedfa6a129a376d39671000e028b814eb1f74fbf10a5fb2c465a254b0002830aad9201555d7f9b5061bf99f41cbeca0fbb2b6dda51fda40dfcf88be08b3c9a9ee1410347a0dff0f70a76fd56000f1cc4a10a0875fad35c42b795c9357be35a67acace09706af13b4009bc72cfc8d3957a2baeb28bbbf0d22256f0896ed0f6fcd098f688b64b53dd111c4cc3c2ac10010fa217241fb64df96812ba7adea8ff477b4c03a76c25ebb3f8bc817afca2a735c7c8d0c57e02ced4c522dc5c5c02758eee91fd3bbf8f69057e93cce6ed177c9d500115cd9c43d6c791a3ad05cea7cfd97f76a1eefa267e134f0d8144b9fc527f93d2e017c44c427670248954d1d119b712412e032ace9f4879b8c36439c100318d0f000127cb2e52609a2ef2838b24744233ba084f76748d2b553abefc70cef8f05eb16731e013081b28eae042ef40f73104ba2b91760e9369168ed91bb98d985edc025f10100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccab200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000600000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Fantom (10) Standard Relayer,010000000412015298eba9662833bebf84896d4950977e2b3a798843724b0f94e6cc593104ad0f3da6a81c3cc2a5de08913eb26290c66fa618e6fac82b6ca253c423994d7d17190002477859073938199baa195303f6c2ba8cae0c858f61bf459a833114e84ab2c6762e798b91db2623a67704c58656caea49c7459afc820f910742125fdef6b6cc270103d3cf95aa84035358f41d4b0f5dd0c59c2de8b69af4db84e29b5df51781d4a4437cb885054e625a4ad03324573e033bee6e4169fa7fa169c2fb4a5c4c7e69bee001042e63b87f925d6d9b48f8b6df815593f8cc41d12af45ca58cef567a2dee37236c734a714cf2ef110dced59b0b019b89fc06b16328d4331e905db3934f21874dbf00051f843a340ffd3a605fd84480ef14d8595b1fffdd45a7e1c919c686ac1bd234bb4255d6ff88990e33dbeb751c06ff6ba5c63469fef50fb9924c135a2e81db0f91000678e5e902519def669dc1b03d3c9be4b84589a6322bcdf3c8cb056192a13774487a49709566d0cc68fdd9c6d1f368152f1c0728bba71031a867dbf8a170cf694e0007738f6d2e42d49ab86137f8e0f1c1bc2b2b95b9f0f28f3698afb11ac5024261ae1b41b5d705a29ee77abbd7ac27d237fa4e37ae1b40df56b9a067024c90ca6d860008b25df04e7b4147bd3ae3960fe7f181968c084b63a89ca11c28e557d516e6ac3b623b56e9472041a8ce9fab0be14e9f6593caf203242f5a1a8c00c8a23f947183000919c402479e75615c767de34eb463099fc752c82aa9def7bb5dca812dc5d1a14c268f8c8a4c659be8fae0e51d2f0ed120cccac58344ca9b3df9a9cd21fe1919f9000a7c96e0c21eb74310637c8bccfac24bf91190dfca3a7499bae885a4dec541c58f241933b0d567854b6d8c2fcc284e9077ffab16d6c9c0f9b24cdc2f7875e0a8fc010b0aa4e824c96cab81bcb799c62076cbcc8c88d81dd8760d2999188704fc18251e35936882eb00ed58656432be6f60fbf144bc337d1aeb146e19d80359764f72dd000ccdad41a3722e94317d99ec9542e3aa59ea9cf0297f450edc57c037408bdc5d5770df000375a79ae231aff1eb128c657d0965fe8e4fb5efef26720848b6e68a14010d419a91a2299ba3d983171250bfcda19b462c6cecd6c689ab44cd06d77b3c9bc71f532521b1334308bfed01640ab3c8d212f2e69f349c7697fabcf95f43afdce7010e2238dd50fac23d82778680768dc5cf4ffd02bbb351483dd625e034c9dd0be00a1a2c49f95238a7cfd7ec45038b4478a457e9b9c217fff574b7dd9d5663c65346000feb07dee3c5ec9c0a74f181f76f2356d34adccd09cc889758fb1afbc180ff52ee6a6d6c04afcfb4b92afdbb79eed5f8c7e67c7c90bc9c7cf289887eacad42c9a601100fafc125ed044c06597a7563f22a5ed5071cda2e928bf401a71592af7abd6cf45b114d1d69ab5c784cd4adddbbf51b461e85c41f5792c5e309f86787196f9f560011141a93514e4236da671151dfce33f1fd24dd6e9cc88d16ba2fb8e04c664576b122cf795666f5b5df601b2243382b99852cd23840d91c6fd7dfbb33e27753794a0012880041feece8698f81bb66e9817ffeaa30eb58b5ee4f667a24fb05030fa2ffbc347cfc3f30bd9a18ae8e5e9c01ed40d46459d25e96c486cf849d5f4dbea188480000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccac200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000a00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Klaytn (13) Standard Relayer,01000000041201202b6807f3b8bf18ad8d3097829f84c89430a2c342e71f839bb426b8285aa0bd2cc96c07baf96a4e72c90d4c00e402847482d2bd1829e8fe6ce70a9cd2a2583301028e48df820ca4eab9737aa1d5efe784d061e11062944b5035f9c24500e644b1b747752dcdb2d58dd9ffb4b08db098121c884897df42b704fc9914f79e11072fde0103a73bdd6b228644bdc483bc8910c39f120b83c315c33764c308d9f73bc2b30c4f26ce6b93e3de1cceab441db14445318075bde8e15e9aa77fa6c311e40bdc0680000426c3fe6bd835c32b64c567d246b7efe5b4b76319beb8bdc8e02583d921dca6105ed671393ab77a71aa0bae34cc3873a747eac3baf004b2e77a571220d3329b0301053e88ee079e28c6ebd2cdd47cee327b7ba9cd985c5b01352efc25689ebeca85844f7bc66da3266dbe5d5bba69ce0f3c217e87a051fb2de74c253c1193e52b171c01064a46327c3abc0f34caa2cef14341903e14a3b84e67d594f45d0105e2e3b4ebac3793967c20da12aa3f38101fae3f071fe870fbe574657c021949d3df3003a6a70107e61150b95b83e7d8a86f817751fd75e9c8b1c3819cedce83ffe95b656f2a46605aad1a5d78ebb394ede8fd56df0caea9ca865de55205caa35e85b63f60a5fa4801082d5c3b48bd744256c9eeab8845402e5a937481c8ae1fc525da22c9987953e3467e19a6a31c66ba8bff7dcd24d7d23b02d44c79a09da9efacb5d9be8f0dce269d0109bc3c217eb4557cbd5b486ce13e577322808eddad286ff56f8c6403de7217a32a102e634be26acadd332b24a05a04068f823a74a6a41c4e2f91ab23f6217d8ac8010a823b3773e8a5c222bf5a28b95d2ebaa992ba4f8522337e8d2aba19bbe1ad72b4222e6a86a97e346ca937464098bf5f649f5f7e6e18e71d5b4aabdc0c19bb5130000bf67da3d9002c91e9aa913687980a22692ce1ade3995eaad46525928990bef07f0e87ef7709fc2fa77437978b105cc7be084f134ff992f69002f4165e0a60cbfa010cc6d232cfefef4ec108fbef959aa294074eacb83b6c7a8fe5f6b3e76b6d4b3c4679e1e6acb3186651d7fe984c1fa895c4afbb421b18074f917e3224b684d9006e000dd4936f7cbe9cbc64a98a654d4673e66dde3a5ccd52f8f3e16fa69c01f1e63b80362aa8f70c771b04a080bf847b5015914e189c9053e659c996dfb4e1275bd4ea000e8ab19b52ecc453b221bd23b3b437243da76ac0ad88e49e71baeaae300654d8344687f7cb1d69df24426e3d18e90ba39c1267c63725712ab125749642f8742c53010f0e201b577e11fa0c0f85642a40352951615226295e7c9ad18218e00d3994d31d67632a6bd6445a6ba2eb02172c09ff293e4f06ba8498a9e360281de535cbd0760110ab99b0e5b37c20f786b296923131c5df829498559e46f1e5c2971fed93ceab1700a61354b60fb640e369755a9978bc57df01a55391cb5fc7400c6caed0121a890111c844b51223b2fe13448366c8cd00edc91e688ec419aeec97bd41ae9776f317f1770c1742825c3cc1bde2c0f8928edc24874abf23d94d3d12f121b661d313913b0012f46057fb23e8b994dfd0168f8dce2f661ee24fb9ffa0be22a8b0ab4424f3ffc6567d9e5c124d2dcee0d3dae8eb786f0c1d4b38fa857e17310bd25e4092c371c20000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccaf200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000d00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Celo (14) Standard Relayer,0100000004120121285f733587727520973bf05a22418d34f6b5aa27504c4053d5ee5ce23a02c31153495f3c533ca16f71107af7a54b88bb8fc7d64d20206ed0eb26ffc6cfe5a70002d17c60f1fa5a84d2ae69fba2cf46edd03e3283ae74991abaaaa017ddb3d9fb4e239a82eebe14e89f794ca32a421f2516d9fe57c97133f20bd4a34da78a50102e00032085d87ad27eaa019d14cdeeea575f926ec1db44180cb1932b6ff54b56f0a9d73bab0e952fabcba8135fad9f187db120ea6fdf260cfb3869d973d3eb725c457a0104c7af4c135eee9cfb346bb97350f4c0ca5832cc36485d3fa11603f05d42cf9c9f65e4518bc5483dbde664518abc30d2e4741d18649689fb5c9f47dc288a22b1c101050c37eebf1a94032b3fb7f53ffabeee25610a804c7f58c7ab7e82b8d103adbe1f3af1ae9967f1045c040aa5f3a4c8e4d8d5a3802ca826483e9a1a15f8e42399050106f88d72d019b83cb9b10309c8146e19769da72bb59a26369249fe39b51d475d570e57f5e19cd864af9835c4809b2668afb6690b24f271d37d9caf7089402a67140107ad463df69a2591bbb892fdd1b28009802ce29b3d8c98c58248178c927ef514245e2c4d99968a30bf642e750d5345aeb85bcc2f23fca01e0cbeff8e2b3be32a930108e7ec94efd6c6c06e792c3a7e8885bf305cd652a76876d49697c99ddfc9a98b786bc215521a03151718cd81fc4619c72ffeeb29e6cd968dab9d512f7d2d0eba8800095b6f138e529675fe335e5a72f6bc1a35d20cf518786519c24ab014ceef61eb7133adcb701a7f75ccbacc12ab5e74dbc7c083ea8318d0eede51f486292c901e74010a538c2fbf35b4630f13e694da19fd3e2fa57438622af490fd3bb19a620f88be3678b5d6408c7177575d04a6559bc0bd19538f93e6dd5288d9931511ab8c512d31000b4b193a05edc48b51eeaa302473168dba70821a22541a0ef2cfad161b2aa3bc82066a56f9f0f222116f2904701b05201d619fb3f486fefd08876c7a5bebd67c09000c6563e95259a53f854c5441759804111e52ce42e5332df7ca601cb14091d3c6d81a37ffb91829cafc053e14af24a59ffcabc3fd774e1399901154d52d634057fa000dd639c68822ed4f29afbdfe349fb31cc367b065f5a3bfb73587e0aaf8dd0ad5161be5fd99d78628a7bdfa8c07ffaa47d6c4b58e6b470dabecfbe95db39a96496a010eb85a203b18444f5d26beac38279081d618a50a77f0fcb7d7ff3f51fb2705d9a167bf7c7a2506dc4ac90b946ee63d8a9ea6bfad8aa8494f99f2af5d15d190801b010fc87ba5e8a9caff6cfd7e83376dfd97a6840906ebec31e299d2fd0940f936061d605b244bf2427cb36114d39cff7fba122d6baa6d6207257d42e4fa43473f0887001018d5a390d01b98d9762222d97d3cb988573f256a7a3d512bb26db78f2e1284be020a6d5a9660a869dceba199308db403e0708c785e1c2715821f69a091f39d8b01110767d6f4f27f9db7ae9e4256b9a857e78571e92197cbc8218551da332fb4110e07dfcc73438b8473b91f3a93a4bd96be9dbaff86b524eb8dc1639da33f1f79a00012b00387cd213e2e6ec3973bd90d98eb4c500c9c6aa893cb1d607d9842a326b6e75a5644785dd5ff7c2eef012e938b6df215ed4e97b8223c078fc8a8dba92787770100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb0200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000e00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Moonbeam (16) Standard Relayer,0100000004120179716c0fb88b8859d07f660f1732af0f8e239dc21a69958235d1dbef7572588c6ad3669b231555bfae49e6a81dc27160026b1a86f2ec813a650967741475b9a2010211fa62ed1fb2e4ac5762da890ae39f0542522987555ce69ce8336a189f138f7100ff0999d9cc68dbcb74078e8b2e64e32513414dadf6873018a5e0245795acc70003aea201f953a34c7b5cbbccbec6c42d474107efa3c1f5f25137f0f7f1f8f3446f53fbf9b1d475f396cd04878e0bf9ef58014beec38c3fb698d38602fbdfb5f18b0104e355004e39c7042982a07a50d0e7995180f3336f6c72fe0edb17f1d0acefb13302799ad1b84d4bd4d5f11b2633a02b3ad7f955cd30387ba46d20546dc109ac010105fb93126334289857302eaf327690a0d8457098fac094a6817b49f38841c385295998dfc8d50071f296053d8fc472685fee36dd8990c8230f3e276e1b873a75be0006241945f86c1abef3ee1286b1422c92bafed7b38c3daec22ba602526675b4d35e1938ab844b416b6a803bde5b12648d66e9bae68e34dc87450a69a64bbd2034ba000728253f463ea16bf1c509575955a47d2a88020fec9db1f5e779a66875be054176795bdad1c04ba3b7ca6aee98d2fd05cacb06aeef0d6bf693c59f14da5d60c0df01084ee90ad3baa0ee4ccb987f686246958634fd8834790f8b664f8ff60bf1d83e25636b9e9ccf6323234cdbd8e52c138c98f85d4ad2c40a15b136520adcf36180010109a76104932e8c3a7336ca6cdd33b1b69cbf750eb724e368fae15334ec880921963c9f5e317de2b6d7bfc634c1cf6d26567662dbe90a0f78989c2e09d8671ee004000a4b57433c1f5608e4c0e78fbb597271bdb79060a01126d555db0a00e4160e2a0e6194e6a2c815109b3ca69b14b8995fb8b5123c11e769b65865c0c48d547c15b0000b76add1069fd8d6ac522acec5153b0aefcad592d9e7a5fcaa8b0b1c42306fb18e746cf5eedb4e9279f4021aa0c6e189447d4e1d6529fdabe5659ed348a98dc64c010c7be055a164a254ef1a8d423fb8a740f365e384dbfb1df6279ec1aa2f8e8ec33f5359e3dbc50ed0b6a6f81cc28a8df550e0b22f4039197c939fb08bf9af6207a2000dffa23f41b9167fbbcbff97425f015f62d68d4f469f0973bdecb8fab41a44c1f131ac820ee22318ea239a7455e1611c77aa7d26783aa1a11203b72f447519520c010e3ef1157fe2d4df059a0d4d3796783bcd9acbd30b9ba81273841a6f82c56b710417dbe60447e5c1bc362bdae2eb15cdcf2af4d0b76577b1b13925e0ab105b4334000f9a5bab2b554ce1cbb63d47a3be885fde9b7d5afc82ef3abc6341b79f182de5b65170b70ef3b015ea5f18aea87546f1abbb35f8fb6a2748d1e6f5bf55907d03fa0010443e60d8ca17b58f77996ddac9525cfaeaf5092ebea04f13fdf0aab8204bbaa23c04b1987b95836d36d706597b2439acddd2539d9f6c0bbeea970de801f9eaa500114a111aeaf1f695515f01fb174e606835292a99a2d953db84753369b7f6aec89a4e9e12db15b76a880b92983f28937e8e2569bd3a7eeddfe710c8fc4fce011ed80112433a42154cbdb6f1b1bdbccff6fdcb90e8b174540e63825af039b8fc43c1bd6211c1cb4849d6ca8cb2aaefedc684717faebe50b111a44f8224debf9aa0bbe5b00100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb1200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001000000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Arbitrum (23) Standard Relayer,010000000412010ec78f0da9032eda3bf39f793f612a1f91a40ba7b2791726b5d78b8669d63c2d53ced3e8daf9ad7c7a9eed68b9e4fc7c418403c0e76bade1cefa5d08e9ded7a60102254161d961c9f8e4f84cb48c12e45cb40dddd43a3c7215c480e3d295d7018e5163cf27ad2d53f692eaf5461fe60ff0b0edd33e6989f313df802ed5ffa0a664780003d60b1a8ec2b4ce27e2b7298bb3cb503008b945480d537546dba2a0b1afdc80e26bc0b07d9ee4f3ef40048e25d72d23de26d22dbbc7c23df6eef0367111ea466d0004990843481a1f07312418d822eb817d24ca80d7a53464af9b1f4bf81772dca47e33eb46dd579703c4ae31fb9164e5508f474b4055aa703b0a7c8eebe6f60be04b00053542fa8dba6b62072372bf92ef566f1ade2a95f7abe97692d20bec89c9ad220e49718ebccd0697ca592458d79a73c3f489ba7b5bfc51d9cafc9fd3b54e5d82fa0006b1f4dfb7ee4bb3059c0f9fb81c6afd5b7703d7e0b54720067d7ff7c62755aa3f0e806c426c5a7238917f89cfda30b80e7633cff6005a5965cf61356f551964a500075883d0f908800f54a9feb4211810e14a0a0d65827c051f3793d1511048deef8b7b687003455f2ff07a3395f1297936de1785fea7568fdb62d347ef1b6a1502d30108ebe7c99a2e83a7515927246ac0accad976a388245acce1f41ab198d37b32dcd72717e17dd7339e04d0b97a89356fa994e5b1a036ec80eb681a9c3472c26dfa1400090e98acccf12cba83b7bb65b88f532afa0f86bc068e1313e186b49e9850650c7c6ebaccc02e627b5d7470ef9035c08cae8d874dc4b371945b289706deac7d9008010aa0f27bcfc63715902446fdf352554ea699e361b8e3dcbc57b840f8b5f7dc745e02847d83317d2029b73d47daca88852f1beb2a49004c1c1e9ef4b501f417dcc6010b08ca6babf828e69e3b5fdd0db9c34dca35ff6fd2a2bb261a01216abfd31cb95239af719cf2ba294a2c1b45dfd3d901f68bca3a44d1cc71a180ec6ddc6172282f010c724aa60c084bcc159af35a9d58078d667534cb67bcfca5f959e05eb1b0956d4a02ef98abc9ac677b779b1fbd7505b1621b0935d1a58d7373c36b96b99f8cc0fb000d3139b25069520a4bd9c61905e7fd83ce21eb5786b26b1e5b96772e4933a6eb163dd4031a1bed0cc65e39e00d0a000c917b69015696cb1eed816be864b65abfb2000e794260e5d734ae20e53ff34799b2a9a39f0f792371f8f27e70cd5c14a3d781816b7dc8a3da6ba886f2c21b304648c51c16892da6bacd10776182cb65c9c46b01010ff9bd86279193140979c846052ba99d6f9e8411da7f7004a8e02728579f2283a9510c090466ef71922a58184b5be558a790866125bd76211f308aaa70f080becb00100efc7a08cb812ab047bd67e624197e8244adc6a1ce0d9ef30c469bb5918606e55e3aca65054e0f46e6e7eca8f20b9c4128791ba04496ae9713c5242883777a67011137416a6f4a919b2b4dfafb55c38669b93d66810ab0c77cd9285c71fe3a3e38a36b18c4fb1f6e0700b89afb8f74f056dd58846fb8d0444c3b405afb7755faa3990012747f08fba62aa374373a5c36b6fb29a36d4e382efb2b0a54b039aeb8f76fc764683b02c529802297429d0fb5320b1e6e5c63acf309e03e0f15f7a1fe74eff30f0000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb2200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001700000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Optimism (24) Standard Relayer,0100000004110188474b81330c0fa2db74ea40139146de4c3f62fa3eb23df25125a26142845d011de1aa9d844605a8d113bd1142e45434f1690812686d7161aade3588e94ac698010311e848aaea7323cddfe9d1f45189acf490d3130b9961855aa00c20e7149395a17f133ce44cd4a16078f2f884806d901eb3c56c7fa11a6c628ae659ba602913ea01046a87b3416c3569a2c41fcab24fff66b07701a5fd6df72a3e6d044398054e048742febab5b5f8903703c6c73ea32902dc94c7ee1c4f31dcfb04c52e0f27d93b2100059d830b8110639295a06447b4f54ed72585a30256bf600b7f0fca48f71b30b74f02a4e64c1f2c4152a2f3b7e8ac28e8029c0f60fe4c92f00f5cff8e5daf2395210006dd08a89b93920292bafca3ab963d171e884cd3bbb9b857bf6f87ab27ad2792150ed5bf038693e6ccb855d2376fc0a4087747fd1154dcc4c20b75df05a758196f010771a162500b2783c74223ab5d28e04f1269e49254630a440bb9f0eacd8b59586f01adf5ecbc7c9abe0bd83235a813b41026b19f571e0af31bbf799fc54e54bd3f010809d6a0821706b2fda0e73c4ddb551981dad9dc1c2c8e85a902195cebd1d8565e528fd078005dfed95fdb92dcad5971ce68f7b5f897f72544a346a073129ac6a700098f24b7e0e5a26410c66b1b1945494d36b9fff6dacf16c5a6a22f01a9ecc021951fd6f992c0ba7ab688b5a90fcd9f96a7fd28bf044a576d58b1a9b85f6964d430000a0323d4671721c0262265a37ff9e3459196ebb928c3568ef4b15f5812ae411f1e4cf9acf02be0f66d380abdcbd1cede4c35483e680a0c330d4fa04551e7b39a63000bd03df44627e6cc431261553953511106c1d451b12cf50c977e0280117a75067340a671de2b755cc23dd6097e5f7f922bc2cbc2b78c499256e04ec75e8f6bcc3e000c4d0e32decb9285203ec763ed6cab15a1fd91fa8bfaf3bfaf449a08e52b79bdb76a10fe2a67974ca57549811cea6b51f39d8abc47b7cd9969e7d6f3b86c3949a6000df8b8844a14ed09439311cf4588760e80ad2a6c460759a85145ded663c503882a367a8ea4727e147822bb6396102d0ce6b90d1e6b87b6ce727d5fdc202b83579f000eea060f748330d8c31e520b8c3b68873e47a6dabe9bd0889dcd7525700b90134b4892bb973ed3aca95343644e5e87b3615409f2a872be97b9a8aaa35661354650000fd64d914031f191e0d748817eb8f682daf8157c46c101d65edb6cda8a23bcc13d10118200042b3335834a02e0c265422d2cffe6ad430d16b12016aa82266f92e001105f7c654722a67c678528e8d6a64a26f5999c70cf33adacd1cfb64d0f8b0c26f81810ba862ac88aafaa90ab5a0669aad2610dd7ad16b1133f4c0dcd4d491a462f0111b698f2fe7cd834d2bdff5d4e2f0289d9631bb910db3e64b91689b7aee09b273679c4cc40da83f0a579a06c756abb9ad9d2ba150a4d18be34c5e88010c46dce6700120ff19d84f49d84cadf0c27f91955b36980271a571c17ac85daf121bb6d0490857cd79a89eb5e1532b74439887ea0f66a5f9ae804ff063b896b24d5014b8e95ff0000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb3200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001800000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
Base (30) Standard Relayer,01000000040f0247e8f4a5a1e5a4f858444a50f419a477866f7ad10af94d62251ff5a7f4a42a9215002d6b5a7939224d6221d743a0107792b4a1efd42619732a34c7c2cdc4401100036fb6ef9f9c50657d7791bb344b948d6c812f1b4070381003a942419b174c4fc94cb8d63cec79e13982a2642d789054d0746498807da03d3c59a39efa29232dbf0104bbf027b263137578ea240576f12e3dc1470ceda63391dfeaaf0f71af0adfa764772a206847aa10646aef2ebdba8ca21b6c08088cb58942f2145c5120e0f94b86000674719843c99e12cd2b9b37f98431f8dd8bd2d74b0794291fd8d7b8b575bcc8964ee2c7982fb4932621996d587eb4ff4861e1d0e6d873ee1ee8b9f684f084262501071243774552bd7af6f1325b86965546b960955e2c594b225ab2df51bd58b7ec5331f17d71b00298536281977290ed6d5d1534cc6693137988aba25c19be3295020008f33ed961639ec82c1be05528b8a75f6657bcebec68827e8f295899e41423e22205312e5e7bb6453004df0eadbe11eb79588ee16f5b35fc8db2f7dc7d457bfaa20009e439e5b37dacdec25d12cba1531efceb2f130a812d2d99fcb728282bce06dbe91fab11228716ea1d430ae8a08ecc2482e30b439b912b7b0dcc95cc80e98fe6da010a5224519f03cf83b67ed6d31a5495edcf66ac10da2d94bac542109be2d075f7230b63c1576641ad6d9a54b1fbd5fa7fbe3c08cd08f673318476aaf9fcef48c6e5010ba277e69a71938f8b1197cb6975968f7e4780fda8e6136d23d2c9f5cbbb15d2ae682321eb8b5f683c5825b74492e7a2a4d18ac20cd8c30fe3fa712bd71c8b6033010d06fba68375dfdf6d76c97d3a2e0ea1c9b243d8f7a37114406fc67cb7545c717402faf5175907d1ccd943f20d539b815eb936d430fc3dfb35c3316a2342dba38d010e4ca329b5c61f7faa4223595fe3dd4d14d77506c36013c6ce8e34834d48380f75536d12e3a9cef5446a33766a500a676c3d59b09e984e0f31be780bd736a8150b000f151a6b2de331631ccdda12cf215868b93b12d6bca992832ce5531d2c57b290b72c323c3bff1150f1606e738a0c5165aefff6489d8d1c6194566ca91fdc882bf30010788d6362177378258f98c0a1a5a85b229b2316e43b28a08c68e0303fe2bae4a27cf109f07ed6efa6be02379b07b4ba02c9d81c478263eda7a3c279af2d4987fa01119031dcaf73436185f8853ae273ba23e44f8fbb6ed31b750684ffe45dac34f11813c37916f0bd6c7282b1caf49206e6df9004e0450010f9f93c9e0e20107c235f0012d5b4f5a87674f8c4a686ac67806a45440d30861a43191ec72e5f75a733a8b51c189659e8ed8ff7be73d3a14780a46cb34a58a5308f7381d668e8db58198f185501000000006b45a1a900010000000000000000000000000000000000000000000000000000000000000004555704dcd5046cc4200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001e000000000000000000000000706f82e9bb5b0813501714ab5974216704980e31

1 Ethereum (2) Standard Relayer 01000000030d003f39e29280cb340fdea6e91de35155ce11fac49da591cf7efd61f12f4d3f46663d7c4575ec830c35c1cc19017a79e28eedc1d10fcfff4595b1dbbfc9047d55990103bb91bf8f33762ee6b07abb3119c4ba748d092bfafe87d360db962d99c96462920abb4e6d076e9d54aeafe8dec563b1930a4305e2b3961cd363bc203be0649f270005245ef83e663fbc6e9cb3f2c9eebbe44eac2f6e5844c13610333d64340c7e4407611f4e11d676e9773502f6ca6c070975297cf6f372dce0875de3f8ba80b48f58010696ea72db18de430b5c071bb09d51d53d03197a33b1df0711b5f859149ddcfc7358c84573a7518b3719b67ec01fa07140dda7241b087807c1d4548c1876559d2801086fb2063f49bc33d1f25ee13ac31cbb2a0ba540f419df1cd03c91d0aeb8e97d5e6feae3da4362897531428190a8b458c327e256016ab6ac62cc1b1e931225baee01098bfe9db66d5d50eb6177143e8db1b23200c677266f02ac2d1c04b90ee9a1d1b476a9f4f93752555e86a54e2f5bb666866310f8f587356c594218aaf41d20fbce010ab66121eb5bf8f432e1ae32bb988dd7c33d482fe4d63abe1386d38cdddae0c03964d792f2704309bceaae0c1b322e46aa651c6e2a3c2611903cddbc87363bdc75000cb22b8172a90abf14aaee5a80bb97380275798e1f89479be50b54b4549e2fcbbf285af8ed730998caa93612dac4e80eff36ea82e945672e46128d7abe12c1936a000d4ef0a4d42e2be648eb6bd37d6184c123ab0a31dd804970416972e5be3fbd6a0044d9d2dd64a430cca95110ff36f2f363fa90a0ceb524f229b46caa85f9b18bc4000e0ddb23380953eaba05b8d493f2193860f10079a2ff6ffc00bd11db94e22b5f0e1ab3bf4517972a0aa2d7ed18551231e083e48ccc07e8d64ed20fbb6d57151b8200108a585d5960d95a50f9cd6c8ca4b8ae7a70b4549a052771edff1a0c3a409ea5cd286eae6c53eb280038605384d051e04e8c2c531c0f8713e36a5c4d71a044a40b0011fa3cd95765d64bbdc070008c3111ffaf46ada75e4dc39607c643b547c3f70d423f0f4ee2ae5d7ed4361869896dcb012368a0a9586881c579a877728fd761f53a0112447e5b97e5341c5ff2e91c0aba8b48ca985f369992f00fb17fdc9c0f6576b93c6beaf3a44dfe8972df1f28c4eda7336a7955e6d33a4cc1e1c324ad45de72d56e0000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdccca8200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000200000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911 010000000411011cc9ccac1e8e7926f87bba430c7d44bd74f2d894aff5f254ccc38117ea60dcdd5d5fe8764291740cc0b3bf9a933af8b7d5831a4036fd724cb4c4394ce681149a0102798dd4c1f6ed41f190eaeb8243f08678808cccb7e467d69abb83a88414211c032fba01893f5c408e307ceebd74ceae8d6605f5911e682d566cb66dd501e04f570103bb91bf8f33762ee6b07abb3119c4ba748d092bfafe87d360db962d99c96462920abb4e6d076e9d54aeafe8dec563b1930a4305e2b3961cd363bc203be0649f270004a87c289caf311c65374cbb573fb30b489aff09a66d7a09f9a95ec50f05981bca5266c862bc9bbeafd793debd4cf3eac2ee50f010df931bb6877f1090bad5b9b50105245ef83e663fbc6e9cb3f2c9eebbe44eac2f6e5844c13610333d64340c7e4407611f4e11d676e9773502f6ca6c070975297cf6f372dce0875de3f8ba80b48f58010696ea72db18de430b5c071bb09d51d53d03197a33b1df0711b5f859149ddcfc7358c84573a7518b3719b67ec01fa07140dda7241b087807c1d4548c1876559d280107451380b740bb8688e23e7e0875bfe5a44e511c4a581f81db9a8f097290bb42cc16ca0c609356f692ccedf5d8fc40bb12cdf0ed7af252992da2eac282e3de9fd000086fb2063f49bc33d1f25ee13ac31cbb2a0ba540f419df1cd03c91d0aeb8e97d5e6feae3da4362897531428190a8b458c327e256016ab6ac62cc1b1e931225baee01098bfe9db66d5d50eb6177143e8db1b23200c677266f02ac2d1c04b90ee9a1d1b476a9f4f93752555e86a54e2f5bb666866310f8f587356c594218aaf41d20fbce010ab66121eb5bf8f432e1ae32bb988dd7c33d482fe4d63abe1386d38cdddae0c03964d792f2704309bceaae0c1b322e46aa651c6e2a3c2611903cddbc87363bdc75000b443a31980905ef953c262a9521a815c6c676b84b00d3ae2e8783b212785863da7ca89406b27f9343529ca245552b5ddbcff32b84ff42c62bbad28e5cbd2f874d000d4ef0a4d42e2be648eb6bd37d6184c123ab0a31dd804970416972e5be3fbd6a0044d9d2dd64a430cca95110ff36f2f363fa90a0ceb524f229b46caa85f9b18bc4000e0ddb23380953eaba05b8d493f2193860f10079a2ff6ffc00bd11db94e22b5f0e1ab3bf4517972a0aa2d7ed18551231e083e48ccc07e8d64ed20fbb6d57151b82000f39eebea1eec93d3afc71cb9ce966daafc586d47863cdff25a413470d3cd5ee2d55fb1edbddfa5c7fcc9d5834db2f6f82a380e1e5d6da9112d4497ab28d3c385501108a585d5960d95a50f9cd6c8ca4b8ae7a70b4549a052771edff1a0c3a409ea5cd286eae6c53eb280038605384d051e04e8c2c531c0f8713e36a5c4d71a044a40b0011fa3cd95765d64bbdc070008c3111ffaf46ada75e4dc39607c643b547c3f70d423f0f4ee2ae5d7ed4361869896dcb012368a0a9586881c579a877728fd761f53a0112447e5b97e5341c5ff2e91c0aba8b48ca985f369992f00fb17fdc9c0f6576b93c6beaf3a44dfe8972df1f28c4eda7336a7955e6d33a4cc1e1c324ad45de72d56e0000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdccca8200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000200000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
2 BSC (4) Standard Relayer 01000000030d002e0a85cefc9dc34ead9571b45e9a296c58d8c43c4272ef5e50c8d1d0367e828a37bc44055960b5542ec79b5081c2de229ae7a5555d409235792e3cdfac3d495201030941c73fc173d2f1bfa810a141db2343f3d4ff420c56ff09354b2718b5baa4887922208e9097f19f6607d8b79bfc7ad469d4bacd3f60ae9589fdad238aa1d95301051da5b430178acfde6091d4cfd836926097be2862e30b96d89d03f9d6b9bc1a8319c814c9186d30a564db790136e24229be6c21a115518fb2e0a7f3f5053771c4010616dbe51c1f120717f6522d72cf85e42315d65dd049fce9e691658d1a0e3d98c865c71d6fc5cf7682991c476bb5ade4048d71e3ce81ba5fa2632dbd17a352260f0108fbd37725bc32e5e9a872f0477be346ed302afd45d9b0e5724347adc0cd142c020f134770727c9d57fffa249980c3687cc98d62196064c30df7a7147f07ce3af60009f6a21b63b3c8c18f96b5ff71256d5ed0f630de90ee65eebdaf6b5916b4d6fdb276d7dfdae5e05ff52a2f77b8801cbcb1fb988c6b4adcddd9aaef2e78847500f1010abc2784590de571f08bf3003ecd50a564303376c0da7a145118153022be444d940238147ca54bf65f2c312389f568ba80b0c547413a8fb527452f09320f23347f000ce6b17e707f79583df2837cec6cf05f5d3f70b99f04ef6c3a54d55e770f2aca4a78da87446c11bb39ffbaebd324d7b369944049457bbc97256dd7b06a61127263010d42c86ce3294e2cae5304d94aeb30de4c686612d090f41998af8a1473fab4fa605579308201183510ba56602f2dbba3694959e052e0d2ec973f127308517898ba010e113a38c219ebb990c5bf15c9b155bb45bcc773b53dbc2c3fcac866ab00e0f2be61e3962b99e25bbe5fefe2b0af5fde001e35a71e1856b369b5a179d3c0a826b20110ea9e738d883dc8a194c9f180a1123c2496be82678047d6220600657df77b28fd1ec53df79bc47487af116070ed44a58ab86e05030892c2107342dba5f742eb390011759c6d8c25ed3f4a60b7c30473cef12f1652231ee5e2d98efc29ffe3290a6ef37fbee021b0dcddbfbf11104ca1d9451d3ed455816821e2c089538e7d605e0a380012a07c722f449b863d996f15185efa1fb5b056be6d404c8e793492edb5736372f27a9ee67e7b4998e81cee5f45626984d801b81ef7ebc980cde1959a48b1ad57c70000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdccca9200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000400000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911 010000000412017e9b9065c4e951aa2be60cf6245381abbccb02a3ac6b0f4ef3ad4cf5d20653d3523e21898e03fe391eb12b187da849ffe1126d85f4d11f94c428086e67e3680901026da8015f1f571f50d3a53846ac0f1c75edef71e7207f818605a0096083fa3095144fd514006caca2456c0924e44480115702b733bb10b51f7ae742a4980bd72d01030941c73fc173d2f1bfa810a141db2343f3d4ff420c56ff09354b2718b5baa4887922208e9097f19f6607d8b79bfc7ad469d4bacd3f60ae9589fdad238aa1d95301047e8ab11f6a80c2d09eb9717766af25cd68bcf8dd90385395110094ea4bde30393b1ce9caa4ad41cb254462a9ec56f9838b26ebf72f9034e9bd89a6be3c5d318100051da5b430178acfde6091d4cfd836926097be2862e30b96d89d03f9d6b9bc1a8319c814c9186d30a564db790136e24229be6c21a115518fb2e0a7f3f5053771c4010616dbe51c1f120717f6522d72cf85e42315d65dd049fce9e691658d1a0e3d98c865c71d6fc5cf7682991c476bb5ade4048d71e3ce81ba5fa2632dbd17a352260f0107e1725d04e8ae2dd9a418d04c4cda324c1e0ab23d4dc710e7a962231b5daf083c39e2ece6968a26bbf62f88af603b8191d39d0fcd7d66375e49010de37f5c52030108fbd37725bc32e5e9a872f0477be346ed302afd45d9b0e5724347adc0cd142c020f134770727c9d57fffa249980c3687cc98d62196064c30df7a7147f07ce3af60009f6a21b63b3c8c18f96b5ff71256d5ed0f630de90ee65eebdaf6b5916b4d6fdb276d7dfdae5e05ff52a2f77b8801cbcb1fb988c6b4adcddd9aaef2e78847500f1010abc2784590de571f08bf3003ecd50a564303376c0da7a145118153022be444d940238147ca54bf65f2c312389f568ba80b0c547413a8fb527452f09320f23347f000b09cfc420c968ea26f5ca6f4cffaeca802ad7419b7fd62b616d9d677ece38665712367d18c22deeec861ccc97dbb42b862493426639ae7d77f6594a6ec3a4dabb010ce6b17e707f79583df2837cec6cf05f5d3f70b99f04ef6c3a54d55e770f2aca4a78da87446c11bb39ffbaebd324d7b369944049457bbc97256dd7b06a61127263010d42c86ce3294e2cae5304d94aeb30de4c686612d090f41998af8a1473fab4fa605579308201183510ba56602f2dbba3694959e052e0d2ec973f127308517898ba010e113a38c219ebb990c5bf15c9b155bb45bcc773b53dbc2c3fcac866ab00e0f2be61e3962b99e25bbe5fefe2b0af5fde001e35a71e1856b369b5a179d3c0a826b2010ffddb788ef1f70a205d08d44a8d5762c5f5ae5b236eb2534b55e80193c558a6f460bf89a618cf57530ef32102b2e880fb088c062e0bae28f3386dc65cdd58c19c0110ea9e738d883dc8a194c9f180a1123c2496be82678047d6220600657df77b28fd1ec53df79bc47487af116070ed44a58ab86e05030892c2107342dba5f742eb390011759c6d8c25ed3f4a60b7c30473cef12f1652231ee5e2d98efc29ffe3290a6ef37fbee021b0dcddbfbf11104ca1d9451d3ed455816821e2c089538e7d605e0a380012a07c722f449b863d996f15185efa1fb5b056be6d404c8e793492edb5736372f27a9ee67e7b4998e81cee5f45626984d801b81ef7ebc980cde1959a48b1ad57c70000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdccca9200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000400000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
3 Polygon (5) Standard Relayer 01000000030d004e90dfa99044e47b564eecadb2c658583064ac566daf77286761684cc687e9d65173cca86b6188c277847846681ae11bdbf1b966ae65180c7d878ff48135cfa00003f100618c84ff56ea49f563b432bad076350fae7cfcfb3dec92540803d84ea93b5da4c7fa7bd7ec363b9b612dcda7cfec9fbebdbce517dc30903f13c2ec5cb14e0105ce71d2e594f36caf27e8b769261e59b91e9e57fa16205c6d375074615088917e05130f24f1bf948431bcb025aecbf24dcf286297a3002c37ebe72acb5c2430c601068445c65befad456f1cc427c80b2243b23700c152afc60b298ccf5d24261bd9ee1627bc40aa527bc67de91de14cc0dfb2d99b9ec08d31a7ae3e1acef1ff22acbf0008991ec96f347b242770e978a6473da8c82b14dcb9a5ccc05dde4bcf1125e3d9481c25f188d07e1e4e68a916cd79ab21f41a5433d779660d15808e6c172c55accd0009425e5f3f71af0a6ebed1bb037590319bad260e2ebd8b889bc64f782e594792a52874c1973cf69b76f20a33317fa8f16e982afc85fe147ba742be1222d942dcf8000acb1b63f1a4f30702e2b883eecc8048ba91b38a09fffed33299b0e5aeabe09f7809fca5f75fc6a4022b902be7caf793a18d1371aecb3d9bf0d7d27640777b2cd7000cb6f2500ce351272a1d874e2c9516c566cd85702872e2b8b0fa09c54a0f03dbcd27c1ecb367da1dce046b4eeaea922f9ff172886ae4e50799248f58821e543f6d000d2c307443c8329b1c9e456334253c604b5d6c1d7f5dcd4406d9d8c4ed138b72f479ff2f412a41474f3d619a41c8bf216898b8e8a17d3cd7275e6929bcc221b848010e79b575b4795c6d3cccaef379c2f533de626df9a87a52389f38fac3f5d77b57aa317aaefa4386aac86638a9e19cd0dcbd92f9f087fed54c9e28cbb7eb7cc75b8401108d63f8802b17d2ae03a138c123b06a3be5fbed3d478672dc5009a6b6cdb13dea467ac4dcb16784cccd9ca9459ee98ceeafa0c9f444cdbd3654f034f288a24fe90111bd3e4eb9455c06c3aff08836f55add7b1bc5d389a1a02d02abcd5d54e5c1df1c31796b93b0b0e85320f8036a38513bc48008b4acc0890936bd46165f2589d69400127f69a920ebe11ad7b73eb13a8b2729d7a2972ef6b86ec2d9b2ca5f4e3b8b9cb70195f59e62b715724ed2221e32c4f537858d12506ec4d4cbf566982bf63bfb5a0100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccaa200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000500000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911 01000000041001f100c23d38d57e97e66009b25adc7ebcaf920f5a1f621d5755d331de61c5f21631a6f0c9fbea8ad75534af4947a4df72cc293944b1aafbbcf0727f31e4071b810003f100618c84ff56ea49f563b432bad076350fae7cfcfb3dec92540803d84ea93b5da4c7fa7bd7ec363b9b612dcda7cfec9fbebdbce517dc30903f13c2ec5cb14e01044a5a94e02266383a11d1c63fdf50b2cf4a4c75fbebf158843865377f01a0cc4710e908e5190abbcabcfef294d7a054eee84a9bb0ead041c09d10f7a9cb2077000105ce71d2e594f36caf27e8b769261e59b91e9e57fa16205c6d375074615088917e05130f24f1bf948431bcb025aecbf24dcf286297a3002c37ebe72acb5c2430c601068445c65befad456f1cc427c80b2243b23700c152afc60b298ccf5d24261bd9ee1627bc40aa527bc67de91de14cc0dfb2d99b9ec08d31a7ae3e1acef1ff22acbf00074569b66d9ee98c4f2ac6f5498c721f3bc66fa9bbb0ec5e783ee381f9f06046ad54042a921a3f7367ddb192ce880ed5794272dedf0a34f791ef4370bc07743ef60008991ec96f347b242770e978a6473da8c82b14dcb9a5ccc05dde4bcf1125e3d9481c25f188d07e1e4e68a916cd79ab21f41a5433d779660d15808e6c172c55accd0009425e5f3f71af0a6ebed1bb037590319bad260e2ebd8b889bc64f782e594792a52874c1973cf69b76f20a33317fa8f16e982afc85fe147ba742be1222d942dcf8000acb1b63f1a4f30702e2b883eecc8048ba91b38a09fffed33299b0e5aeabe09f7809fca5f75fc6a4022b902be7caf793a18d1371aecb3d9bf0d7d27640777b2cd7000bad7121a6512bfe27856dcbd5c1aa96ef1fdb6110b322a0750870b96aed6f06a30678ed78b4e7dc8c57a6171aefc1b9ca7e991ac4a47d2655caf38d22858d0cb6000d2c307443c8329b1c9e456334253c604b5d6c1d7f5dcd4406d9d8c4ed138b72f479ff2f412a41474f3d619a41c8bf216898b8e8a17d3cd7275e6929bcc221b848010e79b575b4795c6d3cccaef379c2f533de626df9a87a52389f38fac3f5d77b57aa317aaefa4386aac86638a9e19cd0dcbd92f9f087fed54c9e28cbb7eb7cc75b84010fa8c983e5931d1276f84540c4005a16d53071e7a65013c5a9812c4e213556739b687a483eb19abb3f1cb73db7d6cd924d212d3c261d4f3018e8dd96c99dc8104500108d63f8802b17d2ae03a138c123b06a3be5fbed3d478672dc5009a6b6cdb13dea467ac4dcb16784cccd9ca9459ee98ceeafa0c9f444cdbd3654f034f288a24fe90111bd3e4eb9455c06c3aff08836f55add7b1bc5d389a1a02d02abcd5d54e5c1df1c31796b93b0b0e85320f8036a38513bc48008b4acc0890936bd46165f2589d69400127f69a920ebe11ad7b73eb13a8b2729d7a2972ef6b86ec2d9b2ca5f4e3b8b9cb70195f59e62b715724ed2221e32c4f537858d12506ec4d4cbf566982bf63bfb5a0100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccaa200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000500000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
4 Avalanche (6) Standard Relayer 01000000030d00bbfe94366547d476cc80ea55d4e62ee810c59951089c89f07d5e6dc088761384178868b90f76f3858fb749573a2eb03a4d05f8f680972d38ce5055385018a7bf010301035d39f88f4d0751269ae4e098bbe47f3591357c1b616b3e34a5c21c4c1f2c6bfd2b19a8078419699405f38d4c30b3d4970c8a7a37729dfc5c319f299883ac010566ec129bfd891f510f4b350743f2ba9c061b0b94d9cc20d0a75c20dd863722d830ad196d3cd9fb5158337e875a7848e8653d50ff7e7e63c41c2995e57e1c0397010604b345098da327b1ce27ee48a6d2bfd26a744090540042dc1d698a458f726b730f39815ab1254cc9b45bf1fb12ca62ea9b5f9f3285974c350fa7e23fe4a9c8bf010881a52213d65d8fcca6c99cea3b2d134518a451a277a0b92fcf0dba0684fc52c37254b8a2ffb450a1e0777bad5097d907cf5a48c7d70c037b3a362f1973b143d2010928b25ec1394bf9caaf9c95ef074babef722c15b0a4edccedac3fdbd6a6bd87d36ac2fb490e4605eb0d53db3eda85527fe5f00171a5a5a81b283c401ef0369794010ab5470061217ac4b94fcc45fc23292d51c04719493a2785a0caf76eb3497a402e13890bde914f07b680b84079f87bd1448ed8e4f2b1d6a60661986a6f51593d66000c28468c40328aca78777e19c2722b37057250178d92a2d66aab52d8b60bdfcb407696bdb1e2df2b002fa8e99647540a00b58c1d1f11e86a274ced8f8d8b268083010d5fa87309ca8cb8ac33c516a3c3ce860c2c69411c4f5abfec0d8ee7f08a917718371fc2e5445d27f9915cfd72396ab0b0f76fdc820f87dedfa6a129a376d39671000e028b814eb1f74fbf10a5fb2c465a254b0002830aad9201555d7f9b5061bf99f41cbeca0fbb2b6dda51fda40dfcf88be08b3c9a9ee1410347a0dff0f70a76fd560010fa217241fb64df96812ba7adea8ff477b4c03a76c25ebb3f8bc817afca2a735c7c8d0c57e02ced4c522dc5c5c02758eee91fd3bbf8f69057e93cce6ed177c9d500115cd9c43d6c791a3ad05cea7cfd97f76a1eefa267e134f0d8144b9fc527f93d2e017c44c427670248954d1d119b712412e032ace9f4879b8c36439c100318d0f000127cb2e52609a2ef2838b24744233ba084f76748d2b553abefc70cef8f05eb16731e013081b28eae042ef40f73104ba2b91760e9369168ed91bb98d985edc025f10100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccab200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000600000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911 010000000411018a3011f6bab8f816897c708383adf3f5d49be545bb889f4f63133f373c54f02d62237e540224cfc4378bc2e09ff6127a5e2cb8e49bc5d8d96c9d4209ec772bbc0102c09524e6fa41789b556325a4a893546508e5c730ef7f52e4ea7640c381dd476e125708b397751ee2f344b6e123c044ade712f7f83be418c0ced63a2aecae3968010301035d39f88f4d0751269ae4e098bbe47f3591357c1b616b3e34a5c21c4c1f2c6bfd2b19a8078419699405f38d4c30b3d4970c8a7a37729dfc5c319f299883ac01041f645ef4100c53a244d4963a122657e93e8999baa3f6d1ba4f85377fecb9175a31b6e00635e4d06229892e922e79ce817847476e4f3a0be7d83ff59b472610d6000566ec129bfd891f510f4b350743f2ba9c061b0b94d9cc20d0a75c20dd863722d830ad196d3cd9fb5158337e875a7848e8653d50ff7e7e63c41c2995e57e1c0397010604b345098da327b1ce27ee48a6d2bfd26a744090540042dc1d698a458f726b730f39815ab1254cc9b45bf1fb12ca62ea9b5f9f3285974c350fa7e23fe4a9c8bf0107c9f099ea1e931af596d0def924eccb4b2e64fb77b0afca8b112c1b30ab3aa26e765d0ad8ed0128a31c0fc4048f1cdcefcd4c7678c259d06ea7dabbd720fbc8a8000881a52213d65d8fcca6c99cea3b2d134518a451a277a0b92fcf0dba0684fc52c37254b8a2ffb450a1e0777bad5097d907cf5a48c7d70c037b3a362f1973b143d2010928b25ec1394bf9caaf9c95ef074babef722c15b0a4edccedac3fdbd6a6bd87d36ac2fb490e4605eb0d53db3eda85527fe5f00171a5a5a81b283c401ef0369794010ab5470061217ac4b94fcc45fc23292d51c04719493a2785a0caf76eb3497a402e13890bde914f07b680b84079f87bd1448ed8e4f2b1d6a60661986a6f51593d66000ba84a3b14fd2843dfdc408190f1330539d7db5204cada959b82c9a118ff9c633a1c3ff7abf7b2a0bfd7003fec72303a0f39dacd6bb905b2c721bef7f9250b3f1e000d5fa87309ca8cb8ac33c516a3c3ce860c2c69411c4f5abfec0d8ee7f08a917718371fc2e5445d27f9915cfd72396ab0b0f76fdc820f87dedfa6a129a376d39671000e028b814eb1f74fbf10a5fb2c465a254b0002830aad9201555d7f9b5061bf99f41cbeca0fbb2b6dda51fda40dfcf88be08b3c9a9ee1410347a0dff0f70a76fd56000f1cc4a10a0875fad35c42b795c9357be35a67acace09706af13b4009bc72cfc8d3957a2baeb28bbbf0d22256f0896ed0f6fcd098f688b64b53dd111c4cc3c2ac10010fa217241fb64df96812ba7adea8ff477b4c03a76c25ebb3f8bc817afca2a735c7c8d0c57e02ced4c522dc5c5c02758eee91fd3bbf8f69057e93cce6ed177c9d500115cd9c43d6c791a3ad05cea7cfd97f76a1eefa267e134f0d8144b9fc527f93d2e017c44c427670248954d1d119b712412e032ace9f4879b8c36439c100318d0f000127cb2e52609a2ef2838b24744233ba084f76748d2b553abefc70cef8f05eb16731e013081b28eae042ef40f73104ba2b91760e9369168ed91bb98d985edc025f10100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccab200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000600000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
5 Fantom (10) Standard Relayer 01000000030d000afc75cbef72bcf6cc35dafdf4547edb0051789ac0afbd34c7cefa561a1cc2f0199f316ce3bb93d339f86dc44986d41e33677f33d9f9742c624befefbda05a370103d3cf95aa84035358f41d4b0f5dd0c59c2de8b69af4db84e29b5df51781d4a4437cb885054e625a4ad03324573e033bee6e4169fa7fa169c2fb4a5c4c7e69bee001051f843a340ffd3a605fd84480ef14d8595b1fffdd45a7e1c919c686ac1bd234bb4255d6ff88990e33dbeb751c06ff6ba5c63469fef50fb9924c135a2e81db0f91000678e5e902519def669dc1b03d3c9be4b84589a6322bcdf3c8cb056192a13774487a49709566d0cc68fdd9c6d1f368152f1c0728bba71031a867dbf8a170cf694e0008b25df04e7b4147bd3ae3960fe7f181968c084b63a89ca11c28e557d516e6ac3b623b56e9472041a8ce9fab0be14e9f6593caf203242f5a1a8c00c8a23f947183000919c402479e75615c767de34eb463099fc752c82aa9def7bb5dca812dc5d1a14c268f8c8a4c659be8fae0e51d2f0ed120cccac58344ca9b3df9a9cd21fe1919f9000a7c96e0c21eb74310637c8bccfac24bf91190dfca3a7499bae885a4dec541c58f241933b0d567854b6d8c2fcc284e9077ffab16d6c9c0f9b24cdc2f7875e0a8fc010ccdad41a3722e94317d99ec9542e3aa59ea9cf0297f450edc57c037408bdc5d5770df000375a79ae231aff1eb128c657d0965fe8e4fb5efef26720848b6e68a14010d419a91a2299ba3d983171250bfcda19b462c6cecd6c689ab44cd06d77b3c9bc71f532521b1334308bfed01640ab3c8d212f2e69f349c7697fabcf95f43afdce7010e2238dd50fac23d82778680768dc5cf4ffd02bbb351483dd625e034c9dd0be00a1a2c49f95238a7cfd7ec45038b4478a457e9b9c217fff574b7dd9d5663c6534600100fafc125ed044c06597a7563f22a5ed5071cda2e928bf401a71592af7abd6cf45b114d1d69ab5c784cd4adddbbf51b461e85c41f5792c5e309f86787196f9f560011141a93514e4236da671151dfce33f1fd24dd6e9cc88d16ba2fb8e04c664576b122cf795666f5b5df601b2243382b99852cd23840d91c6fd7dfbb33e27753794a0012880041feece8698f81bb66e9817ffeaa30eb58b5ee4f667a24fb05030fa2ffbc347cfc3f30bd9a18ae8e5e9c01ed40d46459d25e96c486cf849d5f4dbea188480000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccac200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000a00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911 010000000412015298eba9662833bebf84896d4950977e2b3a798843724b0f94e6cc593104ad0f3da6a81c3cc2a5de08913eb26290c66fa618e6fac82b6ca253c423994d7d17190002477859073938199baa195303f6c2ba8cae0c858f61bf459a833114e84ab2c6762e798b91db2623a67704c58656caea49c7459afc820f910742125fdef6b6cc270103d3cf95aa84035358f41d4b0f5dd0c59c2de8b69af4db84e29b5df51781d4a4437cb885054e625a4ad03324573e033bee6e4169fa7fa169c2fb4a5c4c7e69bee001042e63b87f925d6d9b48f8b6df815593f8cc41d12af45ca58cef567a2dee37236c734a714cf2ef110dced59b0b019b89fc06b16328d4331e905db3934f21874dbf00051f843a340ffd3a605fd84480ef14d8595b1fffdd45a7e1c919c686ac1bd234bb4255d6ff88990e33dbeb751c06ff6ba5c63469fef50fb9924c135a2e81db0f91000678e5e902519def669dc1b03d3c9be4b84589a6322bcdf3c8cb056192a13774487a49709566d0cc68fdd9c6d1f368152f1c0728bba71031a867dbf8a170cf694e0007738f6d2e42d49ab86137f8e0f1c1bc2b2b95b9f0f28f3698afb11ac5024261ae1b41b5d705a29ee77abbd7ac27d237fa4e37ae1b40df56b9a067024c90ca6d860008b25df04e7b4147bd3ae3960fe7f181968c084b63a89ca11c28e557d516e6ac3b623b56e9472041a8ce9fab0be14e9f6593caf203242f5a1a8c00c8a23f947183000919c402479e75615c767de34eb463099fc752c82aa9def7bb5dca812dc5d1a14c268f8c8a4c659be8fae0e51d2f0ed120cccac58344ca9b3df9a9cd21fe1919f9000a7c96e0c21eb74310637c8bccfac24bf91190dfca3a7499bae885a4dec541c58f241933b0d567854b6d8c2fcc284e9077ffab16d6c9c0f9b24cdc2f7875e0a8fc010b0aa4e824c96cab81bcb799c62076cbcc8c88d81dd8760d2999188704fc18251e35936882eb00ed58656432be6f60fbf144bc337d1aeb146e19d80359764f72dd000ccdad41a3722e94317d99ec9542e3aa59ea9cf0297f450edc57c037408bdc5d5770df000375a79ae231aff1eb128c657d0965fe8e4fb5efef26720848b6e68a14010d419a91a2299ba3d983171250bfcda19b462c6cecd6c689ab44cd06d77b3c9bc71f532521b1334308bfed01640ab3c8d212f2e69f349c7697fabcf95f43afdce7010e2238dd50fac23d82778680768dc5cf4ffd02bbb351483dd625e034c9dd0be00a1a2c49f95238a7cfd7ec45038b4478a457e9b9c217fff574b7dd9d5663c65346000feb07dee3c5ec9c0a74f181f76f2356d34adccd09cc889758fb1afbc180ff52ee6a6d6c04afcfb4b92afdbb79eed5f8c7e67c7c90bc9c7cf289887eacad42c9a601100fafc125ed044c06597a7563f22a5ed5071cda2e928bf401a71592af7abd6cf45b114d1d69ab5c784cd4adddbbf51b461e85c41f5792c5e309f86787196f9f560011141a93514e4236da671151dfce33f1fd24dd6e9cc88d16ba2fb8e04c664576b122cf795666f5b5df601b2243382b99852cd23840d91c6fd7dfbb33e27753794a0012880041feece8698f81bb66e9817ffeaa30eb58b5ee4f667a24fb05030fa2ffbc347cfc3f30bd9a18ae8e5e9c01ed40d46459d25e96c486cf849d5f4dbea188480000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccac200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000a00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
6 Klaytn (13) Standard Relayer 01000000030d00c9b9d25eaf56c5936f66f147fe45061729bfad0514c1dbc21a6b3e8c41fd669c43f8fc2dd2792ad106d9b23d7d2161374fdb24084e4dc44b246986243177e4e30003a73bdd6b228644bdc483bc8910c39f120b83c315c33764c308d9f73bc2b30c4f26ce6b93e3de1cceab441db14445318075bde8e15e9aa77fa6c311e40bdc068000053e88ee079e28c6ebd2cdd47cee327b7ba9cd985c5b01352efc25689ebeca85844f7bc66da3266dbe5d5bba69ce0f3c217e87a051fb2de74c253c1193e52b171c01064a46327c3abc0f34caa2cef14341903e14a3b84e67d594f45d0105e2e3b4ebac3793967c20da12aa3f38101fae3f071fe870fbe574657c021949d3df3003a6a701082d5c3b48bd744256c9eeab8845402e5a937481c8ae1fc525da22c9987953e3467e19a6a31c66ba8bff7dcd24d7d23b02d44c79a09da9efacb5d9be8f0dce269d0109bc3c217eb4557cbd5b486ce13e577322808eddad286ff56f8c6403de7217a32a102e634be26acadd332b24a05a04068f823a74a6a41c4e2f91ab23f6217d8ac8010a823b3773e8a5c222bf5a28b95d2ebaa992ba4f8522337e8d2aba19bbe1ad72b4222e6a86a97e346ca937464098bf5f649f5f7e6e18e71d5b4aabdc0c19bb5130000cc6d232cfefef4ec108fbef959aa294074eacb83b6c7a8fe5f6b3e76b6d4b3c4679e1e6acb3186651d7fe984c1fa895c4afbb421b18074f917e3224b684d9006e000dd4936f7cbe9cbc64a98a654d4673e66dde3a5ccd52f8f3e16fa69c01f1e63b80362aa8f70c771b04a080bf847b5015914e189c9053e659c996dfb4e1275bd4ea000e8ab19b52ecc453b221bd23b3b437243da76ac0ad88e49e71baeaae300654d8344687f7cb1d69df24426e3d18e90ba39c1267c63725712ab125749642f8742c530110ab99b0e5b37c20f786b296923131c5df829498559e46f1e5c2971fed93ceab1700a61354b60fb640e369755a9978bc57df01a55391cb5fc7400c6caed0121a890111c844b51223b2fe13448366c8cd00edc91e688ec419aeec97bd41ae9776f317f1770c1742825c3cc1bde2c0f8928edc24874abf23d94d3d12f121b661d313913b0012f46057fb23e8b994dfd0168f8dce2f661ee24fb9ffa0be22a8b0ab4424f3ffc6567d9e5c124d2dcee0d3dae8eb786f0c1d4b38fa857e17310bd25e4092c371c20000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccaf200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000d00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911 01000000041201202b6807f3b8bf18ad8d3097829f84c89430a2c342e71f839bb426b8285aa0bd2cc96c07baf96a4e72c90d4c00e402847482d2bd1829e8fe6ce70a9cd2a2583301028e48df820ca4eab9737aa1d5efe784d061e11062944b5035f9c24500e644b1b747752dcdb2d58dd9ffb4b08db098121c884897df42b704fc9914f79e11072fde0103a73bdd6b228644bdc483bc8910c39f120b83c315c33764c308d9f73bc2b30c4f26ce6b93e3de1cceab441db14445318075bde8e15e9aa77fa6c311e40bdc0680000426c3fe6bd835c32b64c567d246b7efe5b4b76319beb8bdc8e02583d921dca6105ed671393ab77a71aa0bae34cc3873a747eac3baf004b2e77a571220d3329b0301053e88ee079e28c6ebd2cdd47cee327b7ba9cd985c5b01352efc25689ebeca85844f7bc66da3266dbe5d5bba69ce0f3c217e87a051fb2de74c253c1193e52b171c01064a46327c3abc0f34caa2cef14341903e14a3b84e67d594f45d0105e2e3b4ebac3793967c20da12aa3f38101fae3f071fe870fbe574657c021949d3df3003a6a70107e61150b95b83e7d8a86f817751fd75e9c8b1c3819cedce83ffe95b656f2a46605aad1a5d78ebb394ede8fd56df0caea9ca865de55205caa35e85b63f60a5fa4801082d5c3b48bd744256c9eeab8845402e5a937481c8ae1fc525da22c9987953e3467e19a6a31c66ba8bff7dcd24d7d23b02d44c79a09da9efacb5d9be8f0dce269d0109bc3c217eb4557cbd5b486ce13e577322808eddad286ff56f8c6403de7217a32a102e634be26acadd332b24a05a04068f823a74a6a41c4e2f91ab23f6217d8ac8010a823b3773e8a5c222bf5a28b95d2ebaa992ba4f8522337e8d2aba19bbe1ad72b4222e6a86a97e346ca937464098bf5f649f5f7e6e18e71d5b4aabdc0c19bb5130000bf67da3d9002c91e9aa913687980a22692ce1ade3995eaad46525928990bef07f0e87ef7709fc2fa77437978b105cc7be084f134ff992f69002f4165e0a60cbfa010cc6d232cfefef4ec108fbef959aa294074eacb83b6c7a8fe5f6b3e76b6d4b3c4679e1e6acb3186651d7fe984c1fa895c4afbb421b18074f917e3224b684d9006e000dd4936f7cbe9cbc64a98a654d4673e66dde3a5ccd52f8f3e16fa69c01f1e63b80362aa8f70c771b04a080bf847b5015914e189c9053e659c996dfb4e1275bd4ea000e8ab19b52ecc453b221bd23b3b437243da76ac0ad88e49e71baeaae300654d8344687f7cb1d69df24426e3d18e90ba39c1267c63725712ab125749642f8742c53010f0e201b577e11fa0c0f85642a40352951615226295e7c9ad18218e00d3994d31d67632a6bd6445a6ba2eb02172c09ff293e4f06ba8498a9e360281de535cbd0760110ab99b0e5b37c20f786b296923131c5df829498559e46f1e5c2971fed93ceab1700a61354b60fb640e369755a9978bc57df01a55391cb5fc7400c6caed0121a890111c844b51223b2fe13448366c8cd00edc91e688ec419aeec97bd41ae9776f317f1770c1742825c3cc1bde2c0f8928edc24874abf23d94d3d12f121b661d313913b0012f46057fb23e8b994dfd0168f8dce2f661ee24fb9ffa0be22a8b0ab4424f3ffc6567d9e5c124d2dcee0d3dae8eb786f0c1d4b38fa857e17310bd25e4092c371c20000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccaf200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000d00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
7 Celo (14) Standard Relayer 01000000030d0059eacacdd28f4646e520abfc7ef33cf313a1b8f020a27e1808f0a58df34a5ebd1d8bf0e8aca4fb0db614558b1100c80be7ddb4d8ae50232d93240fc9364887ad01032085d87ad27eaa019d14cdeeea575f926ec1db44180cb1932b6ff54b56f0a9d73bab0e952fabcba8135fad9f187db120ea6fdf260cfb3869d973d3eb725c457a01050c37eebf1a94032b3fb7f53ffabeee25610a804c7f58c7ab7e82b8d103adbe1f3af1ae9967f1045c040aa5f3a4c8e4d8d5a3802ca826483e9a1a15f8e42399050106f88d72d019b83cb9b10309c8146e19769da72bb59a26369249fe39b51d475d570e57f5e19cd864af9835c4809b2668afb6690b24f271d37d9caf7089402a67140108e7ec94efd6c6c06e792c3a7e8885bf305cd652a76876d49697c99ddfc9a98b786bc215521a03151718cd81fc4619c72ffeeb29e6cd968dab9d512f7d2d0eba8800095b6f138e529675fe335e5a72f6bc1a35d20cf518786519c24ab014ceef61eb7133adcb701a7f75ccbacc12ab5e74dbc7c083ea8318d0eede51f486292c901e74010a538c2fbf35b4630f13e694da19fd3e2fa57438622af490fd3bb19a620f88be3678b5d6408c7177575d04a6559bc0bd19538f93e6dd5288d9931511ab8c512d31000c6563e95259a53f854c5441759804111e52ce42e5332df7ca601cb14091d3c6d81a37ffb91829cafc053e14af24a59ffcabc3fd774e1399901154d52d634057fa000dd639c68822ed4f29afbdfe349fb31cc367b065f5a3bfb73587e0aaf8dd0ad5161be5fd99d78628a7bdfa8c07ffaa47d6c4b58e6b470dabecfbe95db39a96496a010eb85a203b18444f5d26beac38279081d618a50a77f0fcb7d7ff3f51fb2705d9a167bf7c7a2506dc4ac90b946ee63d8a9ea6bfad8aa8494f99f2af5d15d190801b011018d5a390d01b98d9762222d97d3cb988573f256a7a3d512bb26db78f2e1284be020a6d5a9660a869dceba199308db403e0708c785e1c2715821f69a091f39d8b01110767d6f4f27f9db7ae9e4256b9a857e78571e92197cbc8218551da332fb4110e07dfcc73438b8473b91f3a93a4bd96be9dbaff86b524eb8dc1639da33f1f79a00012b00387cd213e2e6ec3973bd90d98eb4c500c9c6aa893cb1d607d9842a326b6e75a5644785dd5ff7c2eef012e938b6df215ed4e97b8223c078fc8a8dba92787770100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb0200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000e00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911 0100000004120121285f733587727520973bf05a22418d34f6b5aa27504c4053d5ee5ce23a02c31153495f3c533ca16f71107af7a54b88bb8fc7d64d20206ed0eb26ffc6cfe5a70002d17c60f1fa5a84d2ae69fba2cf46edd03e3283ae74991abaaaa017ddb3d9fb4e239a82eebe14e89f794ca32a421f2516d9fe57c97133f20bd4a34da78a50102e00032085d87ad27eaa019d14cdeeea575f926ec1db44180cb1932b6ff54b56f0a9d73bab0e952fabcba8135fad9f187db120ea6fdf260cfb3869d973d3eb725c457a0104c7af4c135eee9cfb346bb97350f4c0ca5832cc36485d3fa11603f05d42cf9c9f65e4518bc5483dbde664518abc30d2e4741d18649689fb5c9f47dc288a22b1c101050c37eebf1a94032b3fb7f53ffabeee25610a804c7f58c7ab7e82b8d103adbe1f3af1ae9967f1045c040aa5f3a4c8e4d8d5a3802ca826483e9a1a15f8e42399050106f88d72d019b83cb9b10309c8146e19769da72bb59a26369249fe39b51d475d570e57f5e19cd864af9835c4809b2668afb6690b24f271d37d9caf7089402a67140107ad463df69a2591bbb892fdd1b28009802ce29b3d8c98c58248178c927ef514245e2c4d99968a30bf642e750d5345aeb85bcc2f23fca01e0cbeff8e2b3be32a930108e7ec94efd6c6c06e792c3a7e8885bf305cd652a76876d49697c99ddfc9a98b786bc215521a03151718cd81fc4619c72ffeeb29e6cd968dab9d512f7d2d0eba8800095b6f138e529675fe335e5a72f6bc1a35d20cf518786519c24ab014ceef61eb7133adcb701a7f75ccbacc12ab5e74dbc7c083ea8318d0eede51f486292c901e74010a538c2fbf35b4630f13e694da19fd3e2fa57438622af490fd3bb19a620f88be3678b5d6408c7177575d04a6559bc0bd19538f93e6dd5288d9931511ab8c512d31000b4b193a05edc48b51eeaa302473168dba70821a22541a0ef2cfad161b2aa3bc82066a56f9f0f222116f2904701b05201d619fb3f486fefd08876c7a5bebd67c09000c6563e95259a53f854c5441759804111e52ce42e5332df7ca601cb14091d3c6d81a37ffb91829cafc053e14af24a59ffcabc3fd774e1399901154d52d634057fa000dd639c68822ed4f29afbdfe349fb31cc367b065f5a3bfb73587e0aaf8dd0ad5161be5fd99d78628a7bdfa8c07ffaa47d6c4b58e6b470dabecfbe95db39a96496a010eb85a203b18444f5d26beac38279081d618a50a77f0fcb7d7ff3f51fb2705d9a167bf7c7a2506dc4ac90b946ee63d8a9ea6bfad8aa8494f99f2af5d15d190801b010fc87ba5e8a9caff6cfd7e83376dfd97a6840906ebec31e299d2fd0940f936061d605b244bf2427cb36114d39cff7fba122d6baa6d6207257d42e4fa43473f0887001018d5a390d01b98d9762222d97d3cb988573f256a7a3d512bb26db78f2e1284be020a6d5a9660a869dceba199308db403e0708c785e1c2715821f69a091f39d8b01110767d6f4f27f9db7ae9e4256b9a857e78571e92197cbc8218551da332fb4110e07dfcc73438b8473b91f3a93a4bd96be9dbaff86b524eb8dc1639da33f1f79a00012b00387cd213e2e6ec3973bd90d98eb4c500c9c6aa893cb1d607d9842a326b6e75a5644785dd5ff7c2eef012e938b6df215ed4e97b8223c078fc8a8dba92787770100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb0200000000000000000000000000000000000576f726d686f6c6552656c61796572010000000e00000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
8 Moonbeam (16) Standard Relayer 01000000030d00147ce69eaecfb38adcf8f953bf97f1718fa3db81c1609e42ecedefee95f6fb216f20a5e3562e53a8016b4c5ac45c93f749ed3ba9381685037490286a55e5dbc50003aea201f953a34c7b5cbbccbec6c42d474107efa3c1f5f25137f0f7f1f8f3446f53fbf9b1d475f396cd04878e0bf9ef58014beec38c3fb698d38602fbdfb5f18b0105fb93126334289857302eaf327690a0d8457098fac094a6817b49f38841c385295998dfc8d50071f296053d8fc472685fee36dd8990c8230f3e276e1b873a75be0006241945f86c1abef3ee1286b1422c92bafed7b38c3daec22ba602526675b4d35e1938ab844b416b6a803bde5b12648d66e9bae68e34dc87450a69a64bbd2034ba00084ee90ad3baa0ee4ccb987f686246958634fd8834790f8b664f8ff60bf1d83e25636b9e9ccf6323234cdbd8e52c138c98f85d4ad2c40a15b136520adcf36180010109a76104932e8c3a7336ca6cdd33b1b69cbf750eb724e368fae15334ec880921963c9f5e317de2b6d7bfc634c1cf6d26567662dbe90a0f78989c2e09d8671ee004000a4b57433c1f5608e4c0e78fbb597271bdb79060a01126d555db0a00e4160e2a0e6194e6a2c815109b3ca69b14b8995fb8b5123c11e769b65865c0c48d547c15b0000c7be055a164a254ef1a8d423fb8a740f365e384dbfb1df6279ec1aa2f8e8ec33f5359e3dbc50ed0b6a6f81cc28a8df550e0b22f4039197c939fb08bf9af6207a2000dffa23f41b9167fbbcbff97425f015f62d68d4f469f0973bdecb8fab41a44c1f131ac820ee22318ea239a7455e1611c77aa7d26783aa1a11203b72f447519520c010e3ef1157fe2d4df059a0d4d3796783bcd9acbd30b9ba81273841a6f82c56b710417dbe60447e5c1bc362bdae2eb15cdcf2af4d0b76577b1b13925e0ab105b43340010443e60d8ca17b58f77996ddac9525cfaeaf5092ebea04f13fdf0aab8204bbaa23c04b1987b95836d36d706597b2439acddd2539d9f6c0bbeea970de801f9eaa500114a111aeaf1f695515f01fb174e606835292a99a2d953db84753369b7f6aec89a4e9e12db15b76a880b92983f28937e8e2569bd3a7eeddfe710c8fc4fce011ed80112433a42154cbdb6f1b1bdbccff6fdcb90e8b174540e63825af039b8fc43c1bd6211c1cb4849d6ca8cb2aaefedc684717faebe50b111a44f8224debf9aa0bbe5b00100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb1200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001000000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911 0100000004120179716c0fb88b8859d07f660f1732af0f8e239dc21a69958235d1dbef7572588c6ad3669b231555bfae49e6a81dc27160026b1a86f2ec813a650967741475b9a2010211fa62ed1fb2e4ac5762da890ae39f0542522987555ce69ce8336a189f138f7100ff0999d9cc68dbcb74078e8b2e64e32513414dadf6873018a5e0245795acc70003aea201f953a34c7b5cbbccbec6c42d474107efa3c1f5f25137f0f7f1f8f3446f53fbf9b1d475f396cd04878e0bf9ef58014beec38c3fb698d38602fbdfb5f18b0104e355004e39c7042982a07a50d0e7995180f3336f6c72fe0edb17f1d0acefb13302799ad1b84d4bd4d5f11b2633a02b3ad7f955cd30387ba46d20546dc109ac010105fb93126334289857302eaf327690a0d8457098fac094a6817b49f38841c385295998dfc8d50071f296053d8fc472685fee36dd8990c8230f3e276e1b873a75be0006241945f86c1abef3ee1286b1422c92bafed7b38c3daec22ba602526675b4d35e1938ab844b416b6a803bde5b12648d66e9bae68e34dc87450a69a64bbd2034ba000728253f463ea16bf1c509575955a47d2a88020fec9db1f5e779a66875be054176795bdad1c04ba3b7ca6aee98d2fd05cacb06aeef0d6bf693c59f14da5d60c0df01084ee90ad3baa0ee4ccb987f686246958634fd8834790f8b664f8ff60bf1d83e25636b9e9ccf6323234cdbd8e52c138c98f85d4ad2c40a15b136520adcf36180010109a76104932e8c3a7336ca6cdd33b1b69cbf750eb724e368fae15334ec880921963c9f5e317de2b6d7bfc634c1cf6d26567662dbe90a0f78989c2e09d8671ee004000a4b57433c1f5608e4c0e78fbb597271bdb79060a01126d555db0a00e4160e2a0e6194e6a2c815109b3ca69b14b8995fb8b5123c11e769b65865c0c48d547c15b0000b76add1069fd8d6ac522acec5153b0aefcad592d9e7a5fcaa8b0b1c42306fb18e746cf5eedb4e9279f4021aa0c6e189447d4e1d6529fdabe5659ed348a98dc64c010c7be055a164a254ef1a8d423fb8a740f365e384dbfb1df6279ec1aa2f8e8ec33f5359e3dbc50ed0b6a6f81cc28a8df550e0b22f4039197c939fb08bf9af6207a2000dffa23f41b9167fbbcbff97425f015f62d68d4f469f0973bdecb8fab41a44c1f131ac820ee22318ea239a7455e1611c77aa7d26783aa1a11203b72f447519520c010e3ef1157fe2d4df059a0d4d3796783bcd9acbd30b9ba81273841a6f82c56b710417dbe60447e5c1bc362bdae2eb15cdcf2af4d0b76577b1b13925e0ab105b4334000f9a5bab2b554ce1cbb63d47a3be885fde9b7d5afc82ef3abc6341b79f182de5b65170b70ef3b015ea5f18aea87546f1abbb35f8fb6a2748d1e6f5bf55907d03fa0010443e60d8ca17b58f77996ddac9525cfaeaf5092ebea04f13fdf0aab8204bbaa23c04b1987b95836d36d706597b2439acddd2539d9f6c0bbeea970de801f9eaa500114a111aeaf1f695515f01fb174e606835292a99a2d953db84753369b7f6aec89a4e9e12db15b76a880b92983f28937e8e2569bd3a7eeddfe710c8fc4fce011ed80112433a42154cbdb6f1b1bdbccff6fdcb90e8b174540e63825af039b8fc43c1bd6211c1cb4849d6ca8cb2aaefedc684717faebe50b111a44f8224debf9aa0bbe5b00100000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb1200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001000000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
9 Arbitrum (23) Standard Relayer 01000000030d002a7523753fc4db66ca547f99a7d2f3369ec80ba3694dc80270b7efced21f900454e5968e3d6b3166f98c53dee11aa62d537bca8016eab1371d155de2146fb0790003d60b1a8ec2b4ce27e2b7298bb3cb503008b945480d537546dba2a0b1afdc80e26bc0b07d9ee4f3ef40048e25d72d23de26d22dbbc7c23df6eef0367111ea466d00053542fa8dba6b62072372bf92ef566f1ade2a95f7abe97692d20bec89c9ad220e49718ebccd0697ca592458d79a73c3f489ba7b5bfc51d9cafc9fd3b54e5d82fa0006b1f4dfb7ee4bb3059c0f9fb81c6afd5b7703d7e0b54720067d7ff7c62755aa3f0e806c426c5a7238917f89cfda30b80e7633cff6005a5965cf61356f551964a50008ebe7c99a2e83a7515927246ac0accad976a388245acce1f41ab198d37b32dcd72717e17dd7339e04d0b97a89356fa994e5b1a036ec80eb681a9c3472c26dfa1400090e98acccf12cba83b7bb65b88f532afa0f86bc068e1313e186b49e9850650c7c6ebaccc02e627b5d7470ef9035c08cae8d874dc4b371945b289706deac7d9008010aa0f27bcfc63715902446fdf352554ea699e361b8e3dcbc57b840f8b5f7dc745e02847d83317d2029b73d47daca88852f1beb2a49004c1c1e9ef4b501f417dcc6010c724aa60c084bcc159af35a9d58078d667534cb67bcfca5f959e05eb1b0956d4a02ef98abc9ac677b779b1fbd7505b1621b0935d1a58d7373c36b96b99f8cc0fb000d3139b25069520a4bd9c61905e7fd83ce21eb5786b26b1e5b96772e4933a6eb163dd4031a1bed0cc65e39e00d0a000c917b69015696cb1eed816be864b65abfb2000e794260e5d734ae20e53ff34799b2a9a39f0f792371f8f27e70cd5c14a3d781816b7dc8a3da6ba886f2c21b304648c51c16892da6bacd10776182cb65c9c46b0101100efc7a08cb812ab047bd67e624197e8244adc6a1ce0d9ef30c469bb5918606e55e3aca65054e0f46e6e7eca8f20b9c4128791ba04496ae9713c5242883777a67011137416a6f4a919b2b4dfafb55c38669b93d66810ab0c77cd9285c71fe3a3e38a36b18c4fb1f6e0700b89afb8f74f056dd58846fb8d0444c3b405afb7755faa3990012747f08fba62aa374373a5c36b6fb29a36d4e382efb2b0a54b039aeb8f76fc764683b02c529802297429d0fb5320b1e6e5c63acf309e03e0f15f7a1fe74eff30f0000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb2200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001700000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911 010000000412010ec78f0da9032eda3bf39f793f612a1f91a40ba7b2791726b5d78b8669d63c2d53ced3e8daf9ad7c7a9eed68b9e4fc7c418403c0e76bade1cefa5d08e9ded7a60102254161d961c9f8e4f84cb48c12e45cb40dddd43a3c7215c480e3d295d7018e5163cf27ad2d53f692eaf5461fe60ff0b0edd33e6989f313df802ed5ffa0a664780003d60b1a8ec2b4ce27e2b7298bb3cb503008b945480d537546dba2a0b1afdc80e26bc0b07d9ee4f3ef40048e25d72d23de26d22dbbc7c23df6eef0367111ea466d0004990843481a1f07312418d822eb817d24ca80d7a53464af9b1f4bf81772dca47e33eb46dd579703c4ae31fb9164e5508f474b4055aa703b0a7c8eebe6f60be04b00053542fa8dba6b62072372bf92ef566f1ade2a95f7abe97692d20bec89c9ad220e49718ebccd0697ca592458d79a73c3f489ba7b5bfc51d9cafc9fd3b54e5d82fa0006b1f4dfb7ee4bb3059c0f9fb81c6afd5b7703d7e0b54720067d7ff7c62755aa3f0e806c426c5a7238917f89cfda30b80e7633cff6005a5965cf61356f551964a500075883d0f908800f54a9feb4211810e14a0a0d65827c051f3793d1511048deef8b7b687003455f2ff07a3395f1297936de1785fea7568fdb62d347ef1b6a1502d30108ebe7c99a2e83a7515927246ac0accad976a388245acce1f41ab198d37b32dcd72717e17dd7339e04d0b97a89356fa994e5b1a036ec80eb681a9c3472c26dfa1400090e98acccf12cba83b7bb65b88f532afa0f86bc068e1313e186b49e9850650c7c6ebaccc02e627b5d7470ef9035c08cae8d874dc4b371945b289706deac7d9008010aa0f27bcfc63715902446fdf352554ea699e361b8e3dcbc57b840f8b5f7dc745e02847d83317d2029b73d47daca88852f1beb2a49004c1c1e9ef4b501f417dcc6010b08ca6babf828e69e3b5fdd0db9c34dca35ff6fd2a2bb261a01216abfd31cb95239af719cf2ba294a2c1b45dfd3d901f68bca3a44d1cc71a180ec6ddc6172282f010c724aa60c084bcc159af35a9d58078d667534cb67bcfca5f959e05eb1b0956d4a02ef98abc9ac677b779b1fbd7505b1621b0935d1a58d7373c36b96b99f8cc0fb000d3139b25069520a4bd9c61905e7fd83ce21eb5786b26b1e5b96772e4933a6eb163dd4031a1bed0cc65e39e00d0a000c917b69015696cb1eed816be864b65abfb2000e794260e5d734ae20e53ff34799b2a9a39f0f792371f8f27e70cd5c14a3d781816b7dc8a3da6ba886f2c21b304648c51c16892da6bacd10776182cb65c9c46b01010ff9bd86279193140979c846052ba99d6f9e8411da7f7004a8e02728579f2283a9510c090466ef71922a58184b5be558a790866125bd76211f308aaa70f080becb00100efc7a08cb812ab047bd67e624197e8244adc6a1ce0d9ef30c469bb5918606e55e3aca65054e0f46e6e7eca8f20b9c4128791ba04496ae9713c5242883777a67011137416a6f4a919b2b4dfafb55c38669b93d66810ab0c77cd9285c71fe3a3e38a36b18c4fb1f6e0700b89afb8f74f056dd58846fb8d0444c3b405afb7755faa3990012747f08fba62aa374373a5c36b6fb29a36d4e382efb2b0a54b039aeb8f76fc764683b02c529802297429d0fb5320b1e6e5c63acf309e03e0f15f7a1fe74eff30f0000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb2200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001700000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
10 Optimism (24) Standard Relayer 01000000030d006706123794be8c86c236a0416cc1d7730e1a892ae2f5f83cdce8cadf42d61ff10ced17f17d6e2af4cd2689b8e0ebd903cce7f5643e8d8b76f55411129c575365010311e848aaea7323cddfe9d1f45189acf490d3130b9961855aa00c20e7149395a17f133ce44cd4a16078f2f884806d901eb3c56c7fa11a6c628ae659ba602913ea01059d830b8110639295a06447b4f54ed72585a30256bf600b7f0fca48f71b30b74f02a4e64c1f2c4152a2f3b7e8ac28e8029c0f60fe4c92f00f5cff8e5daf2395210006dd08a89b93920292bafca3ab963d171e884cd3bbb9b857bf6f87ab27ad2792150ed5bf038693e6ccb855d2376fc0a4087747fd1154dcc4c20b75df05a758196f010809d6a0821706b2fda0e73c4ddb551981dad9dc1c2c8e85a902195cebd1d8565e528fd078005dfed95fdb92dcad5971ce68f7b5f897f72544a346a073129ac6a700098f24b7e0e5a26410c66b1b1945494d36b9fff6dacf16c5a6a22f01a9ecc021951fd6f992c0ba7ab688b5a90fcd9f96a7fd28bf044a576d58b1a9b85f6964d430000a0323d4671721c0262265a37ff9e3459196ebb928c3568ef4b15f5812ae411f1e4cf9acf02be0f66d380abdcbd1cede4c35483e680a0c330d4fa04551e7b39a63000c4d0e32decb9285203ec763ed6cab15a1fd91fa8bfaf3bfaf449a08e52b79bdb76a10fe2a67974ca57549811cea6b51f39d8abc47b7cd9969e7d6f3b86c3949a6000df8b8844a14ed09439311cf4588760e80ad2a6c460759a85145ded663c503882a367a8ea4727e147822bb6396102d0ce6b90d1e6b87b6ce727d5fdc202b83579f000eea060f748330d8c31e520b8c3b68873e47a6dabe9bd0889dcd7525700b90134b4892bb973ed3aca95343644e5e87b3615409f2a872be97b9a8aaa3566135465000105f7c654722a67c678528e8d6a64a26f5999c70cf33adacd1cfb64d0f8b0c26f81810ba862ac88aafaa90ab5a0669aad2610dd7ad16b1133f4c0dcd4d491a462f0111b698f2fe7cd834d2bdff5d4e2f0289d9631bb910db3e64b91689b7aee09b273679c4cc40da83f0a579a06c756abb9ad9d2ba150a4d18be34c5e88010c46dce6700120ff19d84f49d84cadf0c27f91955b36980271a571c17ac85daf121bb6d0490857cd79a89eb5e1532b74439887ea0f66a5f9ae804ff063b896b24d5014b8e95ff0000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb3200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001800000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911 0100000004110188474b81330c0fa2db74ea40139146de4c3f62fa3eb23df25125a26142845d011de1aa9d844605a8d113bd1142e45434f1690812686d7161aade3588e94ac698010311e848aaea7323cddfe9d1f45189acf490d3130b9961855aa00c20e7149395a17f133ce44cd4a16078f2f884806d901eb3c56c7fa11a6c628ae659ba602913ea01046a87b3416c3569a2c41fcab24fff66b07701a5fd6df72a3e6d044398054e048742febab5b5f8903703c6c73ea32902dc94c7ee1c4f31dcfb04c52e0f27d93b2100059d830b8110639295a06447b4f54ed72585a30256bf600b7f0fca48f71b30b74f02a4e64c1f2c4152a2f3b7e8ac28e8029c0f60fe4c92f00f5cff8e5daf2395210006dd08a89b93920292bafca3ab963d171e884cd3bbb9b857bf6f87ab27ad2792150ed5bf038693e6ccb855d2376fc0a4087747fd1154dcc4c20b75df05a758196f010771a162500b2783c74223ab5d28e04f1269e49254630a440bb9f0eacd8b59586f01adf5ecbc7c9abe0bd83235a813b41026b19f571e0af31bbf799fc54e54bd3f010809d6a0821706b2fda0e73c4ddb551981dad9dc1c2c8e85a902195cebd1d8565e528fd078005dfed95fdb92dcad5971ce68f7b5f897f72544a346a073129ac6a700098f24b7e0e5a26410c66b1b1945494d36b9fff6dacf16c5a6a22f01a9ecc021951fd6f992c0ba7ab688b5a90fcd9f96a7fd28bf044a576d58b1a9b85f6964d430000a0323d4671721c0262265a37ff9e3459196ebb928c3568ef4b15f5812ae411f1e4cf9acf02be0f66d380abdcbd1cede4c35483e680a0c330d4fa04551e7b39a63000bd03df44627e6cc431261553953511106c1d451b12cf50c977e0280117a75067340a671de2b755cc23dd6097e5f7f922bc2cbc2b78c499256e04ec75e8f6bcc3e000c4d0e32decb9285203ec763ed6cab15a1fd91fa8bfaf3bfaf449a08e52b79bdb76a10fe2a67974ca57549811cea6b51f39d8abc47b7cd9969e7d6f3b86c3949a6000df8b8844a14ed09439311cf4588760e80ad2a6c460759a85145ded663c503882a367a8ea4727e147822bb6396102d0ce6b90d1e6b87b6ce727d5fdc202b83579f000eea060f748330d8c31e520b8c3b68873e47a6dabe9bd0889dcd7525700b90134b4892bb973ed3aca95343644e5e87b3615409f2a872be97b9a8aaa35661354650000fd64d914031f191e0d748817eb8f682daf8157c46c101d65edb6cda8a23bcc13d10118200042b3335834a02e0c265422d2cffe6ad430d16b12016aa82266f92e001105f7c654722a67c678528e8d6a64a26f5999c70cf33adacd1cfb64d0f8b0c26f81810ba862ac88aafaa90ab5a0669aad2610dd7ad16b1133f4c0dcd4d491a462f0111b698f2fe7cd834d2bdff5d4e2f0289d9631bb910db3e64b91689b7aee09b273679c4cc40da83f0a579a06c756abb9ad9d2ba150a4d18be34c5e88010c46dce6700120ff19d84f49d84cadf0c27f91955b36980271a571c17ac85daf121bb6d0490857cd79a89eb5e1532b74439887ea0f66a5f9ae804ff063b896b24d5014b8e95ff0000000000fded29f600010000000000000000000000000000000000000000000000000000000000000004338004a37fdcccb3200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001800000000000000000000000027428dd2d3dd32a4d7f7c497eaaa23130d894911
11 Base (30) Standard Relayer 01000000030d00df8b4dd3d24304810ddbf4cf43fc4507b56728f76e6b1d102a6ba646d0c63b2b4148223e19ae06f40ca072fe16333a4c44748bc37457835966c69f35b4d27501010247e8f4a5a1e5a4f858444a50f419a477866f7ad10af94d62251ff5a7f4a42a9215002d6b5a7939224d6221d743a0107792b4a1efd42619732a34c7c2cdc4401100036fb6ef9f9c50657d7791bb344b948d6c812f1b4070381003a942419b174c4fc94cb8d63cec79e13982a2642d789054d0746498807da03d3c59a39efa29232dbf0104bbf027b263137578ea240576f12e3dc1470ceda63391dfeaaf0f71af0adfa764772a206847aa10646aef2ebdba8ca21b6c08088cb58942f2145c5120e0f94b86000674719843c99e12cd2b9b37f98431f8dd8bd2d74b0794291fd8d7b8b575bcc8964ee2c7982fb4932621996d587eb4ff4861e1d0e6d873ee1ee8b9f684f08426250108f33ed961639ec82c1be05528b8a75f6657bcebec68827e8f295899e41423e22205312e5e7bb6453004df0eadbe11eb79588ee16f5b35fc8db2f7dc7d457bfaa20009e439e5b37dacdec25d12cba1531efceb2f130a812d2d99fcb728282bce06dbe91fab11228716ea1d430ae8a08ecc2482e30b439b912b7b0dcc95cc80e98fe6da010a5224519f03cf83b67ed6d31a5495edcf66ac10da2d94bac542109be2d075f7230b63c1576641ad6d9a54b1fbd5fa7fbe3c08cd08f673318476aaf9fcef48c6e5010ba277e69a71938f8b1197cb6975968f7e4780fda8e6136d23d2c9f5cbbb15d2ae682321eb8b5f683c5825b74492e7a2a4d18ac20cd8c30fe3fa712bd71c8b6033010d06fba68375dfdf6d76c97d3a2e0ea1c9b243d8f7a37114406fc67cb7545c717402faf5175907d1ccd943f20d539b815eb936d430fc3dfb35c3316a2342dba38d010e4ca329b5c61f7faa4223595fe3dd4d14d77506c36013c6ce8e34834d48380f75536d12e3a9cef5446a33766a500a676c3d59b09e984e0f31be780bd736a8150b0010788d6362177378258f98c0a1a5a85b229b2316e43b28a08c68e0303fe2bae4a27cf109f07ed6efa6be02379b07b4ba02c9d81c478263eda7a3c279af2d4987fa0112d5b4f5a87674f8c4a686ac67806a45440d30861a43191ec72e5f75a733a8b51c189659e8ed8ff7be73d3a14780a46cb34a58a5308f7381d668e8db58198f185501000000006b45a1a900010000000000000000000000000000000000000000000000000000000000000004555704dcd5046cc4200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001e000000000000000000000000706f82e9bb5b0813501714ab5974216704980e31 01000000040f0247e8f4a5a1e5a4f858444a50f419a477866f7ad10af94d62251ff5a7f4a42a9215002d6b5a7939224d6221d743a0107792b4a1efd42619732a34c7c2cdc4401100036fb6ef9f9c50657d7791bb344b948d6c812f1b4070381003a942419b174c4fc94cb8d63cec79e13982a2642d789054d0746498807da03d3c59a39efa29232dbf0104bbf027b263137578ea240576f12e3dc1470ceda63391dfeaaf0f71af0adfa764772a206847aa10646aef2ebdba8ca21b6c08088cb58942f2145c5120e0f94b86000674719843c99e12cd2b9b37f98431f8dd8bd2d74b0794291fd8d7b8b575bcc8964ee2c7982fb4932621996d587eb4ff4861e1d0e6d873ee1ee8b9f684f084262501071243774552bd7af6f1325b86965546b960955e2c594b225ab2df51bd58b7ec5331f17d71b00298536281977290ed6d5d1534cc6693137988aba25c19be3295020008f33ed961639ec82c1be05528b8a75f6657bcebec68827e8f295899e41423e22205312e5e7bb6453004df0eadbe11eb79588ee16f5b35fc8db2f7dc7d457bfaa20009e439e5b37dacdec25d12cba1531efceb2f130a812d2d99fcb728282bce06dbe91fab11228716ea1d430ae8a08ecc2482e30b439b912b7b0dcc95cc80e98fe6da010a5224519f03cf83b67ed6d31a5495edcf66ac10da2d94bac542109be2d075f7230b63c1576641ad6d9a54b1fbd5fa7fbe3c08cd08f673318476aaf9fcef48c6e5010ba277e69a71938f8b1197cb6975968f7e4780fda8e6136d23d2c9f5cbbb15d2ae682321eb8b5f683c5825b74492e7a2a4d18ac20cd8c30fe3fa712bd71c8b6033010d06fba68375dfdf6d76c97d3a2e0ea1c9b243d8f7a37114406fc67cb7545c717402faf5175907d1ccd943f20d539b815eb936d430fc3dfb35c3316a2342dba38d010e4ca329b5c61f7faa4223595fe3dd4d14d77506c36013c6ce8e34834d48380f75536d12e3a9cef5446a33766a500a676c3d59b09e984e0f31be780bd736a8150b000f151a6b2de331631ccdda12cf215868b93b12d6bca992832ce5531d2c57b290b72c323c3bff1150f1606e738a0c5165aefff6489d8d1c6194566ca91fdc882bf30010788d6362177378258f98c0a1a5a85b229b2316e43b28a08c68e0303fe2bae4a27cf109f07ed6efa6be02379b07b4ba02c9d81c478263eda7a3c279af2d4987fa01119031dcaf73436185f8853ae273ba23e44f8fbb6ed31b750684ffe45dac34f11813c37916f0bd6c7282b1caf49206e6df9004e0450010f9f93c9e0e20107c235f0012d5b4f5a87674f8c4a686ac67806a45440d30861a43191ec72e5f75a733a8b51c189659e8ed8ff7be73d3a14780a46cb34a58a5308f7381d668e8db58198f185501000000006b45a1a900010000000000000000000000000000000000000000000000000000000000000004555704dcd5046cc4200000000000000000000000000000000000576f726d686f6c6552656c61796572010000001e000000000000000000000000706f82e9bb5b0813501714ab5974216704980e31

19
ethereum/env/.env.blast.mainnet vendored Normal file
View File

@ -0,0 +1,19 @@
# Blast mainnet env
# Rename to .env to use with truffle migrations
# Common config for forge deployment
RPC_URL=https://rpc.ankr.com/blast
FORGE_ARGS="--slow --priority-gas-price 1 --gas-estimate-multiplier 130"
# Wormhole Core Migrations
INIT_SIGNERS=["0x58CC3AE5C097b213cE3c81979e1B9f9570746AA5"]
INIT_CHAIN_ID=36
INIT_GOV_CHAIN_ID=0x1
INIT_GOV_CONTRACT=0x0000000000000000000000000000000000000000000000000000000000000004
INIT_EVM_CHAIN_ID=81457
# Bridge Migrations
BRIDGE_INIT_CHAIN_ID=36
BRIDGE_INIT_GOV_CHAIN_ID=0x1
BRIDGE_INIT_GOV_CONTRACT=0x0000000000000000000000000000000000000000000000000000000000000004
# Using "Non-rebasing WETH"
# See https://docs.blast.io/building/contracts#l2-contract-addresses
BRIDGE_INIT_WETH=0x9D020B1697035d9d54f115194c9e04a1e4Eb9aF7
BRIDGE_INIT_FINALITY=1

18
ethereum/env/.env.scroll.mainnet vendored Normal file
View File

@ -0,0 +1,18 @@
# Scroll mainnet env
# Rename to .env to use with truffle migrations
# Common config for forge deployment
RPC_URL=https://rpc.ankr.com/scroll
FORGE_ARGS="--slow --priority-gas-price 0 --gas-estimate-multiplier 130"
# Wormhole Core Migrations
INIT_SIGNERS=["0x58CC3AE5C097b213cE3c81979e1B9f9570746AA5"]
INIT_CHAIN_ID=34
INIT_GOV_CHAIN_ID=0x1
INIT_GOV_CONTRACT=0x0000000000000000000000000000000000000000000000000000000000000004
INIT_EVM_CHAIN_ID=534352
# Bridge Migrations
BRIDGE_INIT_CHAIN_ID=34
BRIDGE_INIT_GOV_CHAIN_ID=0x1
BRIDGE_INIT_GOV_CONTRACT=0x0000000000000000000000000000000000000000000000000000000000000004
# See https://docs.scroll.io/en/developers/scroll-contracts/#l2-predeploys
BRIDGE_INIT_WETH=0x5300000000000000000000000000000000000004
BRIDGE_INIT_FINALITY=1

View File

@ -717,7 +717,7 @@ func runWormchainMigrateContractTemplate(cmd *cobra.Command, args []string) {
log.Fatal("--contract-address must be specified.")
}
if *wormchainMigrateContractInstantiationMsg == "" {
log.Fatal("--instantiate-msg must be specified.")
log.Fatal("--instantiation-msg must be specified.")
}
m := &nodev1.InjectGovernanceVAARequest{

View File

@ -766,11 +766,6 @@ func runNode(cmd *cobra.Command, args []string) {
logger.Fatal("Both --baseContract and --baseRPC must be set together or both unset")
}
// Scroll should not be allowed in mainnet until its finality policy is understood and implemented in the watcher.
if *scrollRPC != "" && !*testnetMode && !*unsafeDevMode {
logger.Fatal("scroll is currently only supported in devnet and testnet")
}
if (*scrollRPC == "") != (*scrollContract == "") {
logger.Fatal("Both --scrollContract and --scrollRPC must be set together or both unset")
}
@ -783,10 +778,6 @@ func runNode(cmd *cobra.Command, args []string) {
logger.Fatal("Both --mantleContract and --mantleRPC must be set together or both unset")
}
if *blastRPC != "" && !*testnetMode && !*unsafeDevMode {
logger.Fatal("blast is currently only supported in devnet and testnet")
}
if (*blastRPC == "") != (*blastContract == "") {
logger.Fatal("Both --blastContract and --blastRPC must be set together or both unset")
}

View File

@ -46,6 +46,8 @@ var etherscanAPIMap = map[vaa.ChainID]string{
vaa.ChainIDArbitrum: "https://api.arbiscan.io",
vaa.ChainIDOptimism: "https://api-optimistic.etherscan.io",
vaa.ChainIDBase: "https://api.basescan.org",
vaa.ChainIDScroll: "https://api.scrollscan.com",
vaa.ChainIDBlast: "https://api.blastscan.io",
}
var coreContractMap = map[vaa.ChainID]string{
@ -64,6 +66,8 @@ var coreContractMap = map[vaa.ChainID]string{
vaa.ChainIDArbitrum: strings.ToLower("0xa5f208e072434bC67592E4C49C1B991BA79BCA46"),
vaa.ChainIDOptimism: strings.ToLower("0xEe91C335eab126dF5fDB3797EA9d6aD93aeC9722"),
vaa.ChainIDBase: strings.ToLower("0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6"),
vaa.ChainIDScroll: strings.ToLower("0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6"),
vaa.ChainIDBlast: strings.ToLower("0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6 "),
}
var (

View File

@ -118,12 +118,16 @@ func adminGuardianSetUpdateToVAA(req *nodev1.GuardianSetUpdate, timestamp time.T
addrs[i] = ethAddr
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyGuardianSetUpdate{
Keys: addrs,
NewIndex: guardianSetIndex + 1,
}.Serialize())
body, err := vaa.BodyGuardianSetUpdate{
Keys: addrs,
NewIndex: guardianSetIndex + 1,
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -146,12 +150,16 @@ func adminContractUpgradeToVAA(req *nodev1.ContractUpgrade, timestamp time.Time,
newContractAddress := vaa.Address{}
copy(newContractAddress[:], b)
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyContractUpgrade{
ChainID: vaa.ChainID(req.ChainId),
NewContract: newContractAddress,
}.Serialize())
body, err := vaa.BodyContractUpgrade{
ChainID: vaa.ChainID(req.ChainId),
NewContract: newContractAddress,
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -174,13 +182,17 @@ func tokenBridgeRegisterChain(req *nodev1.BridgeRegisterChain, timestamp time.Ti
emitterAddress := vaa.Address{}
copy(emitterAddress[:], b)
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyTokenBridgeRegisterChain{
Module: req.Module,
ChainID: vaa.ChainID(req.ChainId),
EmitterAddress: emitterAddress,
}.Serialize())
body, err := vaa.BodyTokenBridgeRegisterChain{
Module: req.Module,
ChainID: vaa.ChainID(req.ChainId),
EmitterAddress: emitterAddress,
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -203,13 +215,17 @@ func recoverChainId(req *nodev1.RecoverChainId, timestamp time.Time, guardianSet
return nil, errors.New("invalid new_chain_id")
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyRecoverChainId{
Module: req.Module,
EvmChainID: evm_chain_id,
NewChainID: vaa.ChainID(req.NewChainId),
}.Serialize())
body, err := vaa.BodyRecoverChainId{
Module: req.Module,
EvmChainID: evm_chain_id,
NewChainID: vaa.ChainID(req.NewChainId),
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -254,20 +270,24 @@ func accountantModifyBalance(req *nodev1.AccountantModifyBalance, timestamp time
tokenAdress := vaa.Address{}
copy(tokenAdress[:], b)
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyAccountantModifyBalance{
Module: req.Module,
TargetChainID: vaa.ChainID(req.TargetChainId),
body, err := vaa.BodyAccountantModifyBalance{
Module: req.Module,
TargetChainID: vaa.ChainID(req.TargetChainId),
Sequence: req.Sequence,
ChainId: vaa.ChainID(req.ChainId),
TokenChain: vaa.ChainID(req.TokenChain),
TokenAddress: tokenAdress,
Kind: uint8(req.Kind),
Amount: amount,
Reason: req.Reason,
}.Serialize())
Sequence: req.Sequence,
ChainId: vaa.ChainID(req.ChainId),
TokenChain: vaa.ChainID(req.TokenChain),
TokenAddress: tokenAdress,
Kind: uint8(req.Kind),
Amount: amount,
Reason: req.Reason,
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -290,13 +310,17 @@ func tokenBridgeUpgradeContract(req *nodev1.BridgeUpgradeContract, timestamp tim
newContract := vaa.Address{}
copy(newContract[:], b)
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyTokenBridgeUpgradeContract{
Module: req.Module,
TargetChainID: vaa.ChainID(req.TargetChainId),
NewContract: newContract,
}.Serialize())
body, err := vaa.BodyTokenBridgeUpgradeContract{
Module: req.Module,
TargetChainID: vaa.ChainID(req.TargetChainId),
NewContract: newContract,
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -316,11 +340,15 @@ func wormchainStoreCode(req *nodev1.WormchainStoreCode, timestamp time.Time, gua
wasmHash := [32]byte{}
copy(wasmHash[:], b)
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyWormchainStoreCode{
WasmHash: wasmHash,
}.Serialize())
body, err := vaa.BodyWormchainStoreCode{
WasmHash: wasmHash,
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -329,11 +357,15 @@ func wormchainStoreCode(req *nodev1.WormchainStoreCode, timestamp time.Time, gua
func wormchainInstantiateContract(req *nodev1.WormchainInstantiateContract, timestamp time.Time, guardianSetIndex uint32, nonce uint32, sequence uint64) (*vaa.VAA, error) { //nolint:unparam // error is always nil but kept to mirror function signature of other functions
instantiationParams_hash := vaa.CreateInstatiateCosmwasmContractHash(req.CodeId, req.Label, []byte(req.InstantiationMsg))
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyWormchainInstantiateContract{
InstantiationParamsHash: instantiationParams_hash,
}.Serialize())
body, err := vaa.BodyWormchainInstantiateContract{
InstantiationParamsHash: instantiationParams_hash,
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -341,11 +373,15 @@ func wormchainInstantiateContract(req *nodev1.WormchainInstantiateContract, time
func wormchainMigrateContract(req *nodev1.WormchainMigrateContract, timestamp time.Time, guardianSetIndex uint32, nonce uint32, sequence uint64) (*vaa.VAA, error) { //nolint:unparam // error is always nil but kept to mirror function signature of other functions
instantiationParams_hash := vaa.CreateMigrateCosmwasmContractHash(req.CodeId, req.Contract, []byte(req.InstantiationMsg))
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyWormchainMigrateContract{
MigrationParamsHash: instantiationParams_hash,
}.Serialize())
body, err := vaa.BodyWormchainMigrateContract{
MigrationParamsHash: instantiationParams_hash,
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -373,11 +409,16 @@ func wormchainWasmInstantiateAllowlist(
var decodedAddr32 [32]byte
copy(decodedAddr32[:], decodedAddr)
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, vaa.BodyWormchainWasmAllowlistInstantiate{
body, err := vaa.BodyWormchainWasmAllowlistInstantiate{
ContractAddr: decodedAddr32,
CodeId: req.CodeId,
}.Serialize(action))
}.Serialize(action)
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -388,11 +429,17 @@ func gatewayScheduleUpgrade(
nonce uint32,
sequence uint64,
) (*vaa.VAA, error) { //nolint:unparam // error is always nil but kept to mirror function signature of other functions
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, vaa.BodyGatewayScheduleUpgrade{
body, err := vaa.BodyGatewayScheduleUpgrade{
Name: req.Name,
Height: req.Height,
}.Serialize())
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -402,10 +449,14 @@ func gatewayCancelUpgrade(
nonce uint32,
sequence uint64,
) (*vaa.VAA, error) { //nolint:unparam // error is always nil but kept to mirror function signature of other functions
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.EmptyPayloadVaa(vaa.GatewayModuleStr, vaa.ActionCancelUpgrade, vaa.ChainIDWormchain),
)
body, err := vaa.EmptyPayloadVaa(vaa.GatewayModuleStr, vaa.ActionCancelUpgrade, vaa.ChainIDWormchain)
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -424,10 +475,15 @@ func gatewayIbcComposabilityMwSetContract(
var decodedAddr32 [32]byte
copy(decodedAddr32[:], decodedAddr)
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, vaa.BodyGatewayIbcComposabilityMwContract{
body, err := vaa.BodyGatewayIbcComposabilityMwContract{
ContractAddr: decodedAddr32,
}.Serialize())
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -440,12 +496,17 @@ func circleIntegrationUpdateWormholeFinality(req *nodev1.CircleIntegrationUpdate
if req.Finality > math.MaxUint8 {
return nil, fmt.Errorf("invalid finality, must be <= %d", math.MaxUint8)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyCircleIntegrationUpdateWormholeFinality{
TargetChainID: vaa.ChainID(req.TargetChainId),
Finality: uint8(req.Finality),
}.Serialize())
body, err := vaa.BodyCircleIntegrationUpdateWormholeFinality{
TargetChainID: vaa.ChainID(req.TargetChainId),
Finality: uint8(req.Finality),
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -470,14 +531,18 @@ func circleIntegrationRegisterEmitterAndDomain(req *nodev1.CircleIntegrationRegi
foreignEmitterAddress := vaa.Address{}
copy(foreignEmitterAddress[:], b)
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyCircleIntegrationRegisterEmitterAndDomain{
TargetChainID: vaa.ChainID(req.TargetChainId),
ForeignEmitterChainId: vaa.ChainID(req.ForeignEmitterChainId),
ForeignEmitterAddress: foreignEmitterAddress,
CircleDomain: req.CircleDomain,
}.Serialize())
body, err := vaa.BodyCircleIntegrationRegisterEmitterAndDomain{
TargetChainID: vaa.ChainID(req.TargetChainId),
ForeignEmitterChainId: vaa.ChainID(req.ForeignEmitterChainId),
ForeignEmitterAddress: foreignEmitterAddress,
CircleDomain: req.CircleDomain,
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -499,12 +564,16 @@ func circleIntegrationUpgradeContractImplementation(req *nodev1.CircleIntegratio
newImplementationAddress := vaa.Address{}
copy(newImplementationAddress[:], b)
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyCircleIntegrationUpgradeContractImplementation{
TargetChainID: vaa.ChainID(req.TargetChainId),
NewImplementationAddress: newImplementationAddress,
}.Serialize())
body, err := vaa.BodyCircleIntegrationUpgradeContractImplementation{
TargetChainID: vaa.ChainID(req.TargetChainId),
NewImplementationAddress: newImplementationAddress,
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -527,7 +596,10 @@ func ibcUpdateChannelChain(
if len(req.ChannelId) > 64 {
return nil, fmt.Errorf("invalid channel ID length, must be <= 64")
}
channelId := vaa.LeftPadIbcChannelId(req.ChannelId)
channelId, err := vaa.LeftPadIbcChannelId(req.ChannelId)
if err != nil {
return nil, fmt.Errorf("failed to left pad channel id: %w", err)
}
var module string
if req.Module == nodev1.IbcUpdateChannelChainModule_IBC_UPDATE_CHANNEL_CHAIN_MODULE_RECEIVER {
@ -538,14 +610,17 @@ func ibcUpdateChannelChain(
return nil, fmt.Errorf("unrecognized ibc update channel chain module")
}
// create governance VAA
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyIbcUpdateChannelChain{
TargetChainId: vaa.ChainID(req.TargetChainId),
ChannelId: channelId,
ChainId: vaa.ChainID(req.ChainId),
}.Serialize(module))
body, err := vaa.BodyIbcUpdateChannelChain{
TargetChainId: vaa.ChainID(req.TargetChainId),
ChannelId: channelId,
ChainId: vaa.ChainID(req.ChainId),
}.Serialize(module)
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -568,12 +643,16 @@ func wormholeRelayerSetDefaultDeliveryProvider(req *nodev1.WormholeRelayerSetDef
NewDefaultDeliveryProviderAddress := vaa.Address{}
copy(NewDefaultDeliveryProviderAddress[:], b)
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyWormholeRelayerSetDefaultDeliveryProvider{
ChainID: vaa.ChainID(req.ChainId),
NewDefaultDeliveryProviderAddress: NewDefaultDeliveryProviderAddress,
}.Serialize())
body, err := vaa.BodyWormholeRelayerSetDefaultDeliveryProvider{
ChainID: vaa.ChainID(req.ChainId),
NewDefaultDeliveryProviderAddress: NewDefaultDeliveryProviderAddress,
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -598,7 +677,6 @@ func evmCallToVaa(evmCall *nodev1.EvmCall, timestamp time.Time, guardianSetIndex
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -619,13 +697,17 @@ func solanaCallToVaa(solanaCall *nodev1.SolanaCall, timestamp time.Time, guardia
return nil, fmt.Errorf("failed to decode instruction: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
vaa.BodyGeneralPurposeGovernanceSolana{
ChainID: vaa.ChainID(solanaCall.ChainId),
GovernanceContract: governanceContract,
Instruction: instruction,
}.Serialize())
body, err := vaa.BodyGeneralPurposeGovernanceSolana{
ChainID: vaa.ChainID(solanaCall.ChainId),
GovernanceContract: governanceContract,
Instruction: instruction,
}.Serialize()
if err != nil {
return nil, fmt.Errorf("failed to serialize governance body: %w", err)
}
v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex, body)
return v, nil
}
@ -677,7 +759,7 @@ func GovMsgToVaa(message *nodev1.GovernanceMessage, currentSetIndex uint32, time
case *nodev1.GovernanceMessage_SolanaCall:
v, err = solanaCallToVaa(payload.SolanaCall, timestamp, currentSetIndex, message.Nonce, message.Sequence)
default:
panic(fmt.Sprintf("unsupported VAA type: %T", payload))
err = fmt.Errorf("unsupported VAA type: %T", payload)
}
return v, err

View File

@ -2,6 +2,7 @@
package adminrpc
import (
"bytes"
"context"
"crypto/ecdsa"
"testing"
@ -17,9 +18,11 @@ import (
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/event"
ethRpc "github.com/ethereum/go-ethereum/rpc"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/wormhole-foundation/wormhole/sdk/vaa"
"go.uber.org/zap"
"google.golang.org/protobuf/encoding/prototext"
)
type mockEVMConnector struct {
@ -270,3 +273,47 @@ func TestSignExistingVAA_Valid(t *testing.T) {
v2 := generateMockVAA(1, append(gsKeys, s.gk))
require.Equal(t, v2, res.Vaa)
}
const govGuardianSetIndex = uint32(4)
var govTimestamp = time.Now()
const govEmitterChain = vaa.ChainIDSolana
var govEmitterAddr vaa.Address = [32]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4}
// verifyGovernanceVAA verifies the VAA fields of a generated governance VAA. Note that it doesn't verify the payload because that is
// already verified in `sdk/vaa/payload_test` and we don't want to duplicate all those arrays.
func verifyGovernanceVAA(t *testing.T, v *vaa.VAA, expectedSeqNo uint64, expectedNonce uint32) {
t.Helper()
require.NotNil(t, v)
assert.Equal(t, uint8(vaa.SupportedVAAVersion), v.Version)
assert.Equal(t, govGuardianSetIndex, v.GuardianSetIndex)
assert.Nil(t, v.Signatures)
assert.Equal(t, govTimestamp, v.Timestamp)
assert.Equal(t, expectedNonce, v.Nonce)
assert.Equal(t, expectedSeqNo, v.Sequence)
assert.Equal(t, uint8(32), v.ConsistencyLevel)
assert.Equal(t, govEmitterChain, v.EmitterChain)
assert.True(t, bytes.Equal(govEmitterAddr[:], v.EmitterAddress[:]))
}
// Test_adminCommands executes all of the tests in prototext_test.go, unmarshaling the prototext and feeding it into `GovMsgToVaa`.
func Test_adminCommands(t *testing.T) {
for _, tst := range adminCommandTest {
t.Run(tst.label, func(t *testing.T) {
var msg nodev1.InjectGovernanceVAARequest
err := prototext.Unmarshal([]byte(tst.prototext), &msg)
require.NoError(t, err)
require.Equal(t, 1, len(msg.Messages))
govMsg := msg.Messages[0]
vaa, err := GovMsgToVaa(govMsg, govGuardianSetIndex, govTimestamp)
if tst.errText == "" {
require.NoError(t, err)
verifyGovernanceVAA(t, vaa, govMsg.Sequence, govMsg.Nonce)
} else {
require.ErrorContains(t, err, tst.errText)
}
})
}
}

File diff suppressed because it is too large Load Diff

View File

@ -35,6 +35,8 @@ func chainList() []chainConfigEntry {
{emitterChainID: vaa.ChainIDXpla, dailyLimit: 500_000, bigTransactionSize: 50_000},
{emitterChainID: vaa.ChainIDBase, dailyLimit: 2_000_000, bigTransactionSize: 200_000},
{emitterChainID: vaa.ChainIDSei, dailyLimit: 5_000_000, bigTransactionSize: 500_000},
{emitterChainID: vaa.ChainIDScroll, dailyLimit: 500_000, bigTransactionSize: 50_000},
{emitterChainID: vaa.ChainIDBlast, dailyLimit: 500_000, bigTransactionSize: 50_000},
{emitterChainID: vaa.ChainIDWormchain, dailyLimit: 500_000, bigTransactionSize: 50_000},
}
}

View File

@ -14,5 +14,37 @@ func manualTokenList() []tokenConfigEntry {
{chain: 13, addr: "0000000000000000000000005096db80b21ef45230c9e423c373f1fc9c0198dd", symbol: "WEMIX", coinGeckoId: "wemix-token", decimals: 8, price: 1.74},
{chain: 15, addr: "0000000000000000000000000000000000000000000000000000000000000000", symbol: "NEAR", coinGeckoId: "near", decimals: 8, price: 3.85},
{chain: 32, addr: "00881043998ff2b738519d444d2dd0da3da4545de08290c1076746538d5333df", symbol: "Sei", coinGeckoId: "sei-network", decimals: 6, price: 0.0},
// BLAST (tokens over $50,000 24h volume)
{chain: 36, addr: "0000000000000000000000004300000000000000000000000000000000000003", symbol: "USDB", coinGeckoId: "usdb", decimals: 18, price: 1.00},
{chain: 36, addr: "0000000000000000000000004300000000000000000000000000000000000004", symbol: "WETH", coinGeckoId: "weth", decimals: 18, price: 3157.42},
{chain: 36, addr: "0000000000000000000000002416092f143378750bb29b79ed961ab195cceea5", symbol: "EZETH", coinGeckoId: "renzo-restaked-eth", decimals: 18, price: 3092.32},
{chain: 36, addr: "0000000000000000000000004fee793d435c6d2c10c135983bb9d6d4fc7b9bbd", symbol: "USD+", coinGeckoId: "usd", decimals: 18, price: 1.00},
{chain: 36, addr: "000000000000000000000000818a92bc81aad0053d72ba753fb5bc3d0c5c0923", symbol: "JUICE", coinGeckoId: "juice-finance", decimals: 18, price: 0.1051},
{chain: 36, addr: "0000000000000000000000009e20461bc2c4c980f62f1b279d71734207a6a356", symbol: "OMNI", coinGeckoId: "omnicat", decimals: 18, price: 0.0004575},
{chain: 36, addr: "000000000000000000000000764933fbad8f5d04ccd088602096655c2ed9879f", symbol: "AI", coinGeckoId: "any-inu", decimals: 18, price: 0.00002742},
{chain: 36, addr: "0000000000000000000000005ffd9ebd27f2fcab044c0f0a26a45cb62fa29c06", symbol: "PAC", coinGeckoId: "pacmoon", decimals: 18, price: 0.05459},
{chain: 36, addr: "00000000000000000000000020fe91f17ec9080e3cac2d688b4ecb48c5ac3a9c", symbol: "YES", coinGeckoId: "yes-money", decimals: 18, price: 3.96},
{chain: 36, addr: "00000000000000000000000076da31d7c9cbeae102aff34d3398bc450c8374c1", symbol: "MIM", coinGeckoId: "magic-internet-money", decimals: 18, price: 0.9935},
{chain: 36, addr: "00000000000000000000000015d24de366f69b835be19f7cf9447e770315dd80", symbol: "KAP", coinGeckoId: "kapital-dao", decimals: 18, price: 0.1143},
{chain: 36, addr: "000000000000000000000000b9dfcd4cf589bb8090569cb52fac1b88dbe4981f", symbol: "BAG", coinGeckoId: "bag", decimals: 18, price: 0.002972},
{chain: 36, addr: "00000000000000000000000068449870eea84453044bd430822827e21fd8f101", symbol: "ZAI", coinGeckoId: "zaibot", decimals: 18, price: 0.2348},
{chain: 36, addr: "00000000000000000000000047c337bd5b9344a6f3d6f58c474d9d8cd419d8ca", symbol: "DACKIE", coinGeckoId: "dackieswap", decimals: 18, price: 0.006554},
{chain: 36, addr: "000000000000000000000000d43d8adac6a4c7d9aeece7c3151fca8f23752cf8", symbol: "ANDY", coinGeckoId: "andyerc", decimals: 9, price: 0.1165},
{chain: 36, addr: "00000000000000000000000087e154e86fb691ab8a27116e93ed8d54e2b8c18c", symbol: "TES", coinGeckoId: "titan-trading-token", decimals: 18, price: 0.867},
{chain: 36, addr: "000000000000000000000000870a8f46b62b8bdeda4c02530c1750cddf2ed32e", symbol: "USDC+", coinGeckoId: "usdc-plus-overnight", decimals: 18, price: 1.00},
{chain: 36, addr: "00000000000000000000000042e12d42b3d6c4a74a88a61063856756ea2db357", symbol: "ORBIT", coinGeckoId: "orbit-protocol", decimals: 18, price: 0.3074},
// SCROLL (tokens over $50,000 24h volume)
{chain: 34, addr: "0000000000000000000000000018d96c579121a94307249d47f053e2d687b5e7", symbol: "MVX", coinGeckoId: "metavault-trade", decimals: 18, price: 2.06},
{chain: 34, addr: "00000000000000000000000047c337bd5b9344a6f3d6f58c474d9d8cd419d8ca", symbol: "DACKIE", coinGeckoId: "dackieswap", decimals: 18, price: 0.00655},
{chain: 34, addr: "0000000000000000000000005300000000000000000000000000000000000004", symbol: "WETH", coinGeckoId: "bridged-wrapped-ether-scroll", decimals: 18, price: 3145.98},
{chain: 34, addr: "000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df", symbol: "USDT", coinGeckoId: "bridged-tether-scroll", decimals: 6, price: 1.00},
{chain: 34, addr: "00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4", symbol: "USDC", coinGeckoId: "bridged-usd-coin-scroll", decimals: 6, price: 1.00},
{chain: 34, addr: "000000000000000000000000eb466342c4d449bc9f53a865d5cb90586f405215", symbol: "AXLUSDC", coinGeckoId: "bridged-axelar-wrapped-usd-coin-scroll", decimals: 6, price: 1.01},
{chain: 34, addr: "0000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf1", symbol: "WBTC", coinGeckoId: "bridged-wrapped-bitcoin-scroll", decimals: 8, price: 64415.17},
{chain: 34, addr: "00000000000000000000000060d01ec2d5e98ac51c8b4cf84dfcce98d527c747", symbol: "IZI", coinGeckoId: "izumi-finance", decimals: 18, price: 0.0142},
{chain: 34, addr: "0000000000000000000000000a3bb08b3a15a19b4de82f8acfc862606fb69a2d", symbol: "IUSD", coinGeckoId: "izumi-bond-usd", decimals: 18, price: 0.9195},
{chain: 34, addr: "000000000000000000000000f610a9dfb7c89644979b4a0f27063e9e7d7cda32", symbol: "WSTETH", coinGeckoId: "bridged-wrapped-lido-staked-ether-scroll", decimals: 18, price: 3659.28},
{chain: 34, addr: "000000000000000000000000cA77eB3fEFe3725Dc33bccB54eDEFc3D9f764f97", symbol: "DAI", coinGeckoId: "dai", decimals: 18, price: 1.00},
{chain: 34, addr: "00000000000000000000000053878B874283351D26d206FA512aEcE1Bef6C0dD", symbol: "RETH", coinGeckoId: "rocket-pool-eth", decimals: 18, price: 3475.55},
}
}

View File

@ -3,6 +3,8 @@
## 0.10.15
Add Provenance to cosmwasm chains
Add Scroll mainnet support
Add Blast mainnet support
## 0.10.14

View File

@ -1,6 +1,6 @@
{
"name": "@certusone/wormhole-sdk",
"version": "0.10.14",
"version": "0.10.15",
"description": "SDK for interacting with Wormhole",
"homepage": "https://wormhole.com",
"main": "./lib/cjs/index.js",

View File

@ -309,8 +309,8 @@ const MAINNET = {
nft_bridge: undefined,
},
scroll: {
core: undefined,
token_bridge: undefined,
core: "0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6",
token_bridge: "0x24850c6f61C438823F01B7A3BF2B89B72174Fa9d",
nft_bridge: undefined,
},
mantle: {
@ -319,8 +319,8 @@ const MAINNET = {
nft_bridge: undefined,
},
blast: {
core: undefined,
token_bridge: undefined,
core: "0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6",
token_bridge: "0x24850c6f61C438823F01B7A3BF2B89B72174Fa9d",
nft_bridge: undefined,
},
xlayer: {

View File

@ -118,6 +118,8 @@ var knownTokenbridgeEmitters = map[vaa.ChainID]string{
vaa.ChainIDOptimism: "0000000000000000000000001D68124e65faFC907325e3EDbF8c4d84499DAa8b",
vaa.ChainIDBase: "0000000000000000000000008d2de8d2f73F1F4cAB472AC9A881C9b123C79627",
vaa.ChainIDXpla: "8f9cf727175353b17a5f574270e370776123d90fd74956ae4277962b4fdee24c",
vaa.ChainIDScroll: "00000000000000000000000024850c6f61C438823F01B7A3BF2B89B72174Fa9d",
vaa.ChainIDBlast: "00000000000000000000000024850c6f61C438823F01B7A3BF2B89B72174Fa9d",
vaa.ChainIDInjective: "00000000000000000000000045dbea4617971d93188eda21530bc6503d153313",
vaa.ChainIDSui: "ccceeb29348f71bdd22ffef43a2a19c1f5b5e17c5cca5411529120182672ade5",
vaa.ChainIDSei: "86c5fd957e2db8389553e1728f9c27964b22a8154091ccba54d75f4b10c61f5e",

View File

@ -3,6 +3,7 @@ package vaa
import (
"bytes"
"encoding/binary"
"errors"
"fmt"
"math"
@ -248,7 +249,7 @@ type (
}
)
func (b BodyContractUpgrade) Serialize() []byte {
func (b BodyContractUpgrade) Serialize() ([]byte, error) {
buf := new(bytes.Buffer)
// Module
@ -260,10 +261,10 @@ func (b BodyContractUpgrade) Serialize() []byte {
buf.Write(b.NewContract[:])
return buf.Bytes()
return buf.Bytes(), nil
}
func (b BodyGuardianSetUpdate) Serialize() []byte {
func (b BodyGuardianSetUpdate) Serialize() ([]byte, error) {
buf := new(bytes.Buffer)
// Module
@ -279,10 +280,10 @@ func (b BodyGuardianSetUpdate) Serialize() []byte {
buf.Write(k[:])
}
return buf.Bytes()
return buf.Bytes(), nil
}
func (r BodyTokenBridgeRegisterChain) Serialize() []byte {
func (r BodyTokenBridgeRegisterChain) Serialize() ([]byte, error) {
payload := &bytes.Buffer{}
MustWrite(payload, binary.BigEndian, r.ChainID)
payload.Write(r.EmitterAddress[:])
@ -290,13 +291,16 @@ func (r BodyTokenBridgeRegisterChain) Serialize() []byte {
return serializeBridgeGovernanceVaa(r.Module, ActionRegisterChain, 0, payload.Bytes())
}
func (r BodyTokenBridgeUpgradeContract) Serialize() []byte {
func (r BodyTokenBridgeUpgradeContract) Serialize() ([]byte, error) {
return serializeBridgeGovernanceVaa(r.Module, ActionUpgradeTokenBridge, r.TargetChainID, r.NewContract[:])
}
func (r BodyRecoverChainId) Serialize() []byte {
func (r BodyRecoverChainId) Serialize() ([]byte, error) {
// Module
buf := LeftPadBytes(r.Module, 32)
buf, err := LeftPadBytes(r.Module, 32)
if err != nil {
return nil, fmt.Errorf("failed to left pad module: %w", err)
}
// Action
var action GovernanceAction
if r.Module == "Core" {
@ -309,10 +313,10 @@ func (r BodyRecoverChainId) Serialize() []byte {
MustWrite(buf, binary.BigEndian, r.EvmChainID.Bytes32())
// NewChainID
MustWrite(buf, binary.BigEndian, r.NewChainID)
return buf.Bytes()
return buf.Bytes(), nil
}
func (r BodyAccountantModifyBalance) Serialize() []byte {
func (r BodyAccountantModifyBalance) Serialize() ([]byte, error) {
payload := &bytes.Buffer{}
MustWrite(payload, binary.BigEndian, r.Sequence)
MustWrite(payload, binary.BigEndian, r.ChainId)
@ -335,28 +339,28 @@ func (r BodyAccountantModifyBalance) Serialize() []byte {
return serializeBridgeGovernanceVaa(r.Module, ActionModifyBalance, r.TargetChainID, payload.Bytes())
}
func (r BodyWormchainStoreCode) Serialize() []byte {
func (r BodyWormchainStoreCode) Serialize() ([]byte, error) {
return serializeBridgeGovernanceVaa(WasmdModuleStr, ActionStoreCode, ChainIDWormchain, r.WasmHash[:])
}
func (r BodyWormchainInstantiateContract) Serialize() []byte {
func (r BodyWormchainInstantiateContract) Serialize() ([]byte, error) {
return serializeBridgeGovernanceVaa(WasmdModuleStr, ActionInstantiateContract, ChainIDWormchain, r.InstantiationParamsHash[:])
}
func (r BodyWormchainMigrateContract) Serialize() []byte {
func (r BodyWormchainMigrateContract) Serialize() ([]byte, error) {
return serializeBridgeGovernanceVaa(WasmdModuleStr, ActionMigrateContract, ChainIDWormchain, r.MigrationParamsHash[:])
}
func (r BodyWormchainWasmAllowlistInstantiate) Serialize(action GovernanceAction) []byte {
func (r BodyWormchainWasmAllowlistInstantiate) Serialize(action GovernanceAction) ([]byte, error) {
payload := &bytes.Buffer{}
payload.Write(r.ContractAddr[:])
MustWrite(payload, binary.BigEndian, r.CodeId)
return serializeBridgeGovernanceVaa(WasmdModuleStr, action, ChainIDWormchain, payload.Bytes())
}
func (r *BodyWormchainWasmAllowlistInstantiate) Deserialize(bz []byte) {
func (r *BodyWormchainWasmAllowlistInstantiate) Deserialize(bz []byte) error {
if len(bz) != 40 {
panic("incorrect payload length")
return fmt.Errorf("incorrect payload length, should be 40, is %d", len(bz))
}
var contractAddr [32]byte
@ -366,42 +370,45 @@ func (r *BodyWormchainWasmAllowlistInstantiate) Deserialize(bz []byte) {
r.ContractAddr = contractAddr
r.CodeId = codeId
return nil
}
func (r BodyGatewayIbcComposabilityMwContract) Serialize() []byte {
func (r BodyGatewayIbcComposabilityMwContract) Serialize() ([]byte, error) {
payload := &bytes.Buffer{}
payload.Write(r.ContractAddr[:])
return serializeBridgeGovernanceVaa(GatewayModuleStr, ActionSetIbcComposabilityMwContract, ChainIDWormchain, payload.Bytes())
}
func (r *BodyGatewayIbcComposabilityMwContract) Deserialize(bz []byte) {
func (r *BodyGatewayIbcComposabilityMwContract) Deserialize(bz []byte) error {
if len(bz) != 32 {
panic("incorrect payload length")
return fmt.Errorf("incorrect payload length, should be 32, is %d", len(bz))
}
var contractAddr [32]byte
copy(contractAddr[:], bz[0:32])
r.ContractAddr = contractAddr
return nil
}
func (r BodyGatewayScheduleUpgrade) Serialize() []byte {
func (r BodyGatewayScheduleUpgrade) Serialize() ([]byte, error) {
payload := &bytes.Buffer{}
payload.Write([]byte(r.Name))
MustWrite(payload, binary.BigEndian, r.Height)
return serializeBridgeGovernanceVaa(GatewayModuleStr, ActionScheduleUpgrade, ChainIDWormchain, payload.Bytes())
}
func (r *BodyGatewayScheduleUpgrade) Deserialize(bz []byte) {
func (r *BodyGatewayScheduleUpgrade) Deserialize(bz []byte) error {
r.Name = string(bz[0 : len(bz)-8])
r.Height = binary.BigEndian.Uint64(bz[len(bz)-8:])
return nil
}
func (r BodyCircleIntegrationUpdateWormholeFinality) Serialize() []byte {
func (r BodyCircleIntegrationUpdateWormholeFinality) Serialize() ([]byte, error) {
return serializeBridgeGovernanceVaa(CircleIntegrationModuleStr, CircleIntegrationActionUpdateWormholeFinality, r.TargetChainID, []byte{r.Finality})
}
func (r BodyCircleIntegrationRegisterEmitterAndDomain) Serialize() []byte {
func (r BodyCircleIntegrationRegisterEmitterAndDomain) Serialize() ([]byte, error) {
payload := &bytes.Buffer{}
MustWrite(payload, binary.BigEndian, r.ForeignEmitterChainId)
payload.Write(r.ForeignEmitterAddress[:])
@ -409,15 +416,15 @@ func (r BodyCircleIntegrationRegisterEmitterAndDomain) Serialize() []byte {
return serializeBridgeGovernanceVaa(CircleIntegrationModuleStr, CircleIntegrationActionRegisterEmitterAndDomain, r.TargetChainID, payload.Bytes())
}
func (r BodyCircleIntegrationUpgradeContractImplementation) Serialize() []byte {
func (r BodyCircleIntegrationUpgradeContractImplementation) Serialize() ([]byte, error) {
payload := &bytes.Buffer{}
payload.Write(r.NewImplementationAddress[:])
return serializeBridgeGovernanceVaa(CircleIntegrationModuleStr, CircleIntegrationActionUpgradeContractImplementation, r.TargetChainID, payload.Bytes())
}
func (r BodyIbcUpdateChannelChain) Serialize(module string) []byte {
func (r BodyIbcUpdateChannelChain) Serialize(module string) ([]byte, error) {
if module != IbcReceiverModuleStr && module != IbcTranslatorModuleStr {
panic("module for BodyIbcUpdateChannelChain must be either IbcReceiver or IbcTranslator")
return nil, errors.New("module for BodyIbcUpdateChannelChain must be either IbcReceiver or IbcTranslator")
}
payload := &bytes.Buffer{}
@ -426,7 +433,7 @@ func (r BodyIbcUpdateChannelChain) Serialize(module string) []byte {
return serializeBridgeGovernanceVaa(module, IbcReceiverActionUpdateChannelChain, r.TargetChainId, payload.Bytes())
}
func (r BodyWormholeRelayerSetDefaultDeliveryProvider) Serialize() []byte {
func (r BodyWormholeRelayerSetDefaultDeliveryProvider) Serialize() ([]byte, error) {
payload := &bytes.Buffer{}
payload.Write(r.NewDefaultDeliveryProviderAddress[:])
return serializeBridgeGovernanceVaa(WormholeRelayerModuleStr, WormholeRelayerSetDefaultDeliveryProvider, r.ChainID, payload.Bytes())
@ -443,10 +450,10 @@ func (r BodyGeneralPurposeGovernanceEvm) Serialize() ([]byte, error) {
}
MustWrite(payload, binary.BigEndian, uint16(len(r.Payload)))
payload.Write(r.Payload)
return serializeBridgeGovernanceVaa(GeneralPurposeGovernanceModuleStr, GeneralPurposeGovernanceEvmAction, r.ChainID, payload.Bytes()), nil
return serializeBridgeGovernanceVaa(GeneralPurposeGovernanceModuleStr, GeneralPurposeGovernanceEvmAction, r.ChainID, payload.Bytes())
}
func (r BodyGeneralPurposeGovernanceSolana) Serialize() []byte {
func (r BodyGeneralPurposeGovernanceSolana) Serialize() ([]byte, error) {
payload := &bytes.Buffer{}
payload.Write(r.GovernanceContract[:])
// NOTE: unlike in EVM, we don't write the payload length here, because we're using
@ -457,12 +464,15 @@ func (r BodyGeneralPurposeGovernanceSolana) Serialize() []byte {
return serializeBridgeGovernanceVaa(GeneralPurposeGovernanceModuleStr, GeneralPurposeGovernanceSolanaAction, r.ChainID, payload.Bytes())
}
func EmptyPayloadVaa(module string, actionId GovernanceAction, chainId ChainID) []byte {
func EmptyPayloadVaa(module string, actionId GovernanceAction, chainId ChainID) ([]byte, error) {
return serializeBridgeGovernanceVaa(module, actionId, chainId, []byte{})
}
func serializeBridgeGovernanceVaa(module string, actionId GovernanceAction, chainId ChainID, payload []byte) []byte {
buf := LeftPadBytes(module, 32)
func serializeBridgeGovernanceVaa(module string, actionId GovernanceAction, chainId ChainID, payload []byte) ([]byte, error) {
buf, err := LeftPadBytes(module, 32)
if err != nil {
return nil, fmt.Errorf("failed to left pad module: %w", err)
}
// Write action ID
MustWrite(buf, binary.BigEndian, actionId)
// Write target chain
@ -470,24 +480,27 @@ func serializeBridgeGovernanceVaa(module string, actionId GovernanceAction, chai
// Write emitter address of chain to be registered
buf.Write(payload[:])
return buf.Bytes()
return buf.Bytes(), nil
}
func LeftPadIbcChannelId(channelId string) [64]byte {
channelIdBuf := LeftPadBytes(channelId, 64)
func LeftPadIbcChannelId(channelId string) ([64]byte, error) {
channelIdBuf, err := LeftPadBytes(channelId, 64)
if err != nil {
return [64]byte{}, fmt.Errorf("failed to left pad module: %w", err)
}
var channelIdIdLeftPadded [64]byte
copy(channelIdIdLeftPadded[:], channelIdBuf.Bytes())
return channelIdIdLeftPadded
return channelIdIdLeftPadded, nil
}
// Prepends 0x00 bytes to the payload buffer, up to a size of `length`
func LeftPadBytes(payload string, length int) *bytes.Buffer {
func LeftPadBytes(payload string, length int) (*bytes.Buffer, error) {
if length < 0 {
panic("cannot prepend bytes to a negative length buffer")
return nil, errors.New("cannot prepend bytes to a negative length buffer")
}
if len(payload) > length {
panic(fmt.Sprintf("payload longer than %d bytes", length))
return nil, fmt.Errorf(fmt.Sprintf("payload longer than %d bytes", length))
}
buf := &bytes.Buffer{}
@ -500,5 +513,5 @@ func LeftPadBytes(payload string, length int) *bytes.Buffer {
// add the payload slice
buf.Write([]byte(payload))
return buf
return buf, nil
}

View File

@ -3,11 +3,14 @@ package vaa
import (
"bytes"
"encoding/hex"
"errors"
"reflect"
"testing"
"github.com/ethereum/go-ethereum/common"
"github.com/holiman/uint256"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
var addr = Address{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4}
@ -53,7 +56,8 @@ func TestBodyTokenBridgeUpgradeContract(t *testing.T) {
func TestBodyContractUpgradeSerialize(t *testing.T) {
bodyContractUpgrade := BodyContractUpgrade{ChainID: 1, NewContract: addr}
expected := "00000000000000000000000000000000000000000000000000000000436f72650100010000000000000000000000000000000000000000000000000000000000000004"
serializedBodyContractUpgrade := bodyContractUpgrade.Serialize()
serializedBodyContractUpgrade, err := bodyContractUpgrade.Serialize()
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(serializedBodyContractUpgrade))
}
@ -64,7 +68,8 @@ func TestBodyGuardianSetUpdateSerialize(t *testing.T) {
}
bodyGuardianSetUpdate := BodyGuardianSetUpdate{Keys: keys, NewIndex: uint32(1)}
expected := "00000000000000000000000000000000000000000000000000000000436f726502000000000001025aaeb6053f3e94c9b9a09f33669435e7ef1beaed5aaeb6053f3e94c9b9a09f33669435e7ef1beaee"
serializedBodyGuardianSetUpdate := bodyGuardianSetUpdate.Serialize()
serializedBodyGuardianSetUpdate, err := bodyGuardianSetUpdate.Serialize()
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(serializedBodyGuardianSetUpdate))
}
@ -74,27 +79,30 @@ func TestBodyTokenBridgeRegisterChainSerialize(t *testing.T) {
name string
expected string
object BodyTokenBridgeRegisterChain
panic bool
err error
}{
{
name: "working_as_expected",
panic: false,
err: nil,
object: BodyTokenBridgeRegisterChain{Module: module, ChainID: 1, EmitterAddress: addr},
expected: "000000000000000000000000000000000000000000000000000000007465737401000000010000000000000000000000000000000000000000000000000000000000000004",
},
{
name: "panic_at_the_disco!",
panic: true,
err: errors.New("payload longer than 32 bytes"),
object: BodyTokenBridgeRegisterChain{Module: "123456789012345678901234567890123", ChainID: 1, EmitterAddress: addr},
expected: "payload longer than 32 bytes",
},
}
for _, testCase := range tests {
t.Run(testCase.name, func(t *testing.T) {
if testCase.panic {
assert.PanicsWithValue(t, testCase.expected, func() { testCase.object.Serialize() })
buf, err := testCase.object.Serialize()
if testCase.err != nil {
require.ErrorContains(t, err, testCase.err.Error())
assert.Nil(t, buf)
} else {
assert.Equal(t, testCase.expected, hex.EncodeToString(testCase.object.Serialize()))
require.NoError(t, err)
assert.Equal(t, testCase.expected, hex.EncodeToString(buf))
}
})
}
@ -104,32 +112,80 @@ func TestBodyTokenBridgeUpgradeContractSerialize(t *testing.T) {
module := "test"
bodyTokenBridgeUpgradeContract := BodyTokenBridgeUpgradeContract{Module: module, TargetChainID: 1, NewContract: addr}
expected := "00000000000000000000000000000000000000000000000000000000746573740200010000000000000000000000000000000000000000000000000000000000000004"
serializedBodyTokenBridgeUpgradeContract := bodyTokenBridgeUpgradeContract.Serialize()
serializedBodyTokenBridgeUpgradeContract, err := bodyTokenBridgeUpgradeContract.Serialize()
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(serializedBodyTokenBridgeUpgradeContract))
}
func TestBodyWormchainStoreCodeSerialize(t *testing.T) {
expected := "0000000000000000000000000000000000000000005761736d644d6f64756c65010c200102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20"
bodyWormchainStoreCode := BodyWormchainStoreCode{WasmHash: dummyBytes}
assert.Equal(t, expected, hex.EncodeToString(bodyWormchainStoreCode.Serialize()))
buf, err := bodyWormchainStoreCode.Serialize()
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(buf))
}
func TestBodyWormchainInstantiateContractSerialize(t *testing.T) {
actual := BodyWormchainInstantiateContract{InstantiationParamsHash: dummyBytes}
expected := "0000000000000000000000000000000000000000005761736d644d6f64756c65020c200102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20"
assert.Equal(t, expected, hex.EncodeToString(actual.Serialize()))
buf, err := actual.Serialize()
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(buf))
}
func TestBodyWormchainMigrateContractSerialize(t *testing.T) {
actual := BodyWormchainMigrateContract{MigrationParamsHash: dummyBytes}
expected := "0000000000000000000000000000000000000000005761736d644d6f64756c65030c200102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20"
assert.Equal(t, expected, hex.EncodeToString(actual.Serialize()))
buf, err := actual.Serialize()
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(buf))
}
func TestBodyWormchainWasmAllowlistInstantiateSerialize(t *testing.T) {
actual := BodyWormchainWasmAllowlistInstantiate{ContractAddr: dummyBytes, CodeId: uint64(42)}
expected := "0000000000000000000000000000000000000000005761736d644d6f64756c65040c200102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20000000000000002a"
buf, err := actual.Serialize(ActionAddWasmInstantiateAllowlist)
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(buf))
}
const BodyWormchainWasmAllowlistInstantiateBuf = "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20000000000000002a"
func TestBodyWormchainWasmAllowlistInstantiateDeserialize(t *testing.T) {
expected := BodyWormchainWasmAllowlistInstantiate{ContractAddr: dummyBytes, CodeId: uint64(42)}
buf, err := hex.DecodeString(BodyWormchainWasmAllowlistInstantiateBuf)
require.NoError(t, err)
var actual BodyWormchainWasmAllowlistInstantiate
err = actual.Deserialize(buf)
require.NoError(t, err)
assert.True(t, reflect.DeepEqual(expected, actual))
}
func TestBodyWormchainWasmAllowlistInstantiateDeserializeFailureTooShort(t *testing.T) {
buf, err := hex.DecodeString(BodyWormchainWasmAllowlistInstantiateBuf[0 : len(BodyWormchainWasmAllowlistInstantiateBuf)-2])
require.NoError(t, err)
var actual BodyWormchainWasmAllowlistInstantiate
err = actual.Deserialize(buf)
require.ErrorContains(t, err, "incorrect payload length, should be 40, is 39")
}
func TestBodyWormchainWasmAllowlistInstantiateDeserializeFailureTooLong(t *testing.T) {
buf, err := hex.DecodeString(BodyWormchainWasmAllowlistInstantiateBuf + "00")
require.NoError(t, err)
var actual BodyWormchainWasmAllowlistInstantiate
err = actual.Deserialize(buf)
require.ErrorContains(t, err, "incorrect payload length, should be 40, is 41")
}
func TestBodyCircleIntegrationUpdateWormholeFinalitySerialize(t *testing.T) {
expected := "000000000000000000000000000000436972636c65496e746567726174696f6e0100022a"
bodyCircleIntegrationUpdateWormholeFinality := BodyCircleIntegrationUpdateWormholeFinality{TargetChainID: ChainIDEthereum, Finality: 42}
assert.Equal(t, expected, hex.EncodeToString(bodyCircleIntegrationUpdateWormholeFinality.Serialize()))
buf, err := bodyCircleIntegrationUpdateWormholeFinality.Serialize()
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(buf))
}
func TestBodyCircleIntegrationRegisterEmitterAndDomainSerialize(t *testing.T) {
@ -140,7 +196,9 @@ func TestBodyCircleIntegrationRegisterEmitterAndDomainSerialize(t *testing.T) {
ForeignEmitterAddress: addr,
CircleDomain: 42,
}
assert.Equal(t, expected, hex.EncodeToString(bodyCircleIntegrationRegisterEmitterAndDomain.Serialize()))
buf, err := bodyCircleIntegrationRegisterEmitterAndDomain.Serialize()
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(buf))
}
func TestBodyCircleIntegrationUpgradeContractImplementationSerialize(t *testing.T) {
@ -149,25 +207,58 @@ func TestBodyCircleIntegrationUpgradeContractImplementationSerialize(t *testing.
TargetChainID: ChainIDEthereum,
NewImplementationAddress: addr,
}
assert.Equal(t, expected, hex.EncodeToString(bodyCircleIntegrationUpgradeContractImplementation.Serialize()))
buf, err := bodyCircleIntegrationUpgradeContractImplementation.Serialize()
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(buf))
}
func TestBodyIbcReceiverUpdateChannelChain(t *testing.T) {
expected := "0000000000000000000000000000000000000000004962635265636569766572010c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006368616e6e656c2d300013"
channelId := LeftPadIbcChannelId("channel-0")
channelId, err := LeftPadIbcChannelId("channel-0")
require.NoError(t, err)
bodyIbcReceiverUpdateChannelChain := BodyIbcUpdateChannelChain{
TargetChainId: ChainIDWormchain,
ChannelId: channelId,
ChainId: ChainIDInjective,
}
assert.Equal(t, expected, hex.EncodeToString(bodyIbcReceiverUpdateChannelChain.Serialize(IbcReceiverModuleStr)))
buf, err := bodyIbcReceiverUpdateChannelChain.Serialize(IbcReceiverModuleStr)
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(buf))
}
func TestBodyIbcReceiverUpdateChannelChainBadModuleName(t *testing.T) {
channelId, err := LeftPadIbcChannelId("channel-0")
require.NoError(t, err)
bodyIbcReceiverUpdateChannelChain := BodyIbcUpdateChannelChain{
TargetChainId: ChainIDWormchain,
ChannelId: channelId,
ChainId: ChainIDInjective,
}
buf, err := bodyIbcReceiverUpdateChannelChain.Serialize(IbcReceiverModuleStr + "ExtraJunk")
require.ErrorContains(t, err, "module for BodyIbcUpdateChannelChain must be either IbcReceiver or IbcTranslator")
assert.Nil(t, buf)
}
func TestLeftPadIbcChannelId(t *testing.T) {
channelId, err := LeftPadIbcChannelId("channel-0")
require.NoError(t, err)
assert.Equal(t, "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006368616e6e656c2d30", hex.EncodeToString(channelId[:]))
}
func TestLeftPadIbcChannelIdFailureTooLong(t *testing.T) {
channelId, err := LeftPadIbcChannelId("channel-ThatIsTooLong!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
require.ErrorContains(t, err, "failed to left pad module: payload longer than 64 bytes")
expected := [64]byte{}
assert.True(t, bytes.Equal(expected[:], channelId[:]))
}
func TestLeftPadBytes(t *testing.T) {
payload := "AAAA"
paddedPayload := LeftPadBytes(payload, int(8))
paddedPayload, err := LeftPadBytes(payload, int(8))
require.NoError(t, err)
buf := &bytes.Buffer{}
buf.WriteByte(0x00)
@ -179,6 +270,24 @@ func TestLeftPadBytes(t *testing.T) {
assert.Equal(t, paddedPayload, buf)
}
func TestLeftPadBytesFailures(t *testing.T) {
payload := "AAAA"
paddedPayload, err := LeftPadBytes(payload, int(-2))
require.ErrorContains(t, err, "cannot prepend bytes to a negative length buffer")
assert.Nil(t, paddedPayload)
paddedPayload, err = LeftPadBytes(payload, int(2))
require.ErrorContains(t, err, "payload longer than 2 bytes")
assert.Nil(t, paddedPayload)
}
func TestSerializeBridgeGovernanceVaaModuleTooLong(t *testing.T) {
buf, err := serializeBridgeGovernanceVaa("ModuleNameIsMoreThanThirtyTwoCharacters", ActionRegisterChain, 1, []byte{0, 1, 2})
require.ErrorContains(t, err, "failed to left pad module: payload longer than 32 bytes")
assert.Nil(t, buf)
}
func FuzzLeftPadBytes(f *testing.F) {
// Add examples to our fuzz corpus
f.Add("FOO", 8)
@ -195,7 +304,8 @@ func FuzzLeftPadBytes(f *testing.F) {
t.Skip()
}
paddedPayload := LeftPadBytes(payload, length)
paddedPayload, err := LeftPadBytes(payload, length)
require.NoError(t, err)
// paddedPayload must always be equal to length
assert.Equal(t, paddedPayload.Len(), length)
@ -208,7 +318,9 @@ func TestBodyWormholeRelayerSetDefaultDeliveryProviderSerialize(t *testing.T) {
ChainID: 4,
NewDefaultDeliveryProviderAddress: addr,
}
assert.Equal(t, expected, hex.EncodeToString(bodyWormholeRelayerSetDefaultDeliveryProvider.Serialize()))
buf, err := bodyWormholeRelayerSetDefaultDeliveryProvider.Serialize()
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(buf))
}
func TestBodyGatewayIbcComposabilityMwContractSerialize(t *testing.T) {
@ -216,18 +328,41 @@ func TestBodyGatewayIbcComposabilityMwContractSerialize(t *testing.T) {
bodyGatewayIbcComposabilityMwContract := BodyGatewayIbcComposabilityMwContract{
ContractAddr: dummyBytes,
}
assert.Equal(t, expected, hex.EncodeToString(bodyGatewayIbcComposabilityMwContract.Serialize()))
buf, err := bodyGatewayIbcComposabilityMwContract.Serialize()
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(buf))
}
const BodyGatewayIbcComposabilityMwContractBuf = "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20"
func TestBodyGatewayIbcComposabilityMwContractDeserialize(t *testing.T) {
expected := BodyGatewayIbcComposabilityMwContract{
ContractAddr: dummyBytes,
}
var payloadBody BodyGatewayIbcComposabilityMwContract
payloadBody.Deserialize(dummyBytes[:])
err := payloadBody.Deserialize(dummyBytes[:])
require.NoError(t, err)
assert.Equal(t, expected, payloadBody)
}
func TestBodyGatewayIbcComposabilityMwContractDeserializeFailureTooShort(t *testing.T) {
buf, err := hex.DecodeString(BodyGatewayIbcComposabilityMwContractBuf[0 : len(BodyGatewayIbcComposabilityMwContractBuf)-2])
require.NoError(t, err)
var actual BodyGatewayIbcComposabilityMwContract
err = actual.Deserialize(buf)
require.ErrorContains(t, err, "incorrect payload length, should be 32, is 31")
}
func TestBodyGatewayIbcComposabilityMwContractDeserializeFailureTooLong(t *testing.T) {
buf, err := hex.DecodeString(BodyGatewayIbcComposabilityMwContractBuf + "00")
require.NoError(t, err)
var actual BodyGatewayIbcComposabilityMwContract
err = actual.Deserialize(buf)
require.ErrorContains(t, err, "incorrect payload length, should be 32, is 33")
}
func TestBodyCoreRecoverChainIdSerialize(t *testing.T) {
expected := "00000000000000000000000000000000000000000000000000000000436f72650500000000000000000000000000000000000000000000000000000000000000010fa0"
BodyRecoverChainId := BodyRecoverChainId{
@ -235,7 +370,9 @@ func TestBodyCoreRecoverChainIdSerialize(t *testing.T) {
EvmChainID: uint256.NewInt(1),
NewChainID: 4000,
}
assert.Equal(t, expected, hex.EncodeToString(BodyRecoverChainId.Serialize()))
buf, err := BodyRecoverChainId.Serialize()
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(buf))
}
func TestBodyTokenBridgeRecoverChainIdSerialize(t *testing.T) {
@ -245,5 +382,18 @@ func TestBodyTokenBridgeRecoverChainIdSerialize(t *testing.T) {
EvmChainID: uint256.NewInt(1),
NewChainID: 4000,
}
assert.Equal(t, expected, hex.EncodeToString(BodyRecoverChainId.Serialize()))
buf, err := BodyRecoverChainId.Serialize()
require.NoError(t, err)
assert.Equal(t, expected, hex.EncodeToString(buf))
}
func TestBodyRecoverChainIdModuleTooLong(t *testing.T) {
BodyRecoverChainId := BodyRecoverChainId{
Module: "ModuleNameIsMoreThanThirtyTwoCharacters",
EvmChainID: uint256.NewInt(1),
NewChainID: 4000,
}
buf, err := BodyRecoverChainId.Serialize()
require.ErrorContains(t, err, "failed to left pad module: payload longer than 32 bytes")
assert.Nil(t, buf)
}

View File

@ -91,7 +91,8 @@ func TestBodyRegisterChain_Serialize(t *testing.T) {
EmitterAddress: Address{1, 2, 3, 4},
}
data := msg.Serialize()
data, err := msg.Serialize()
require.NoError(t, err)
require.Equal(t, "000000000000000000000000000000000000000000000000000000000000000001000000080102030400000000000000000000000000000000000000000000000000000000", hex.EncodeToString(data))
}

View File

@ -501,7 +501,9 @@ func TestWasmdAccountantContractModify(t *testing.T) {
Reason: "test modify",
}
ts := time.Date(2012, 12, 12, 12, 12, 12, 12, time.UTC)
modify_vaa := vaa.CreateGovernanceVAA(ts, 1, 1, tb.set.Index, modify_msg.Serialize())
modify_buf, err := modify_msg.Serialize()
require.NoError(t, err)
modify_vaa := vaa.CreateGovernanceVAA(ts, 1, 1, tb.set.Index, modify_buf)
*modify_vaa = signVaa(*modify_vaa, tb.privateKeys)
vBz, err := modify_vaa.Marshal()
require.NoError(t, err)