[{"data":1,"prerenderedAt":5643},["ShallowReactive",2],{"navigation_docs":3,"-operators-bridge-runbook-validator-relayer-multisig":131,"-operators-bridge-runbook-validator-relayer-multisig-surround":5638},[4,84,111],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":73},"Operators","i-lucide-server","\u002Foperators","1.operators",[10,15,19,24,29,34,74],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Foperators\u002Fintroduction","1.operators\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":6},"Node Setup","\u002Foperators\u002Fnode-setup","1.operators\u002F2.node-setup",{"title":20,"path":21,"stem":22,"icon":23},"Create a Wallet","\u002Foperators\u002Fcreate-wallet","1.operators\u002F3.create-wallet","i-lucide-wallet",{"title":25,"path":26,"stem":27,"icon":28},"Join as Validator","\u002Foperators\u002Fjoin-as-validator","1.operators\u002F4.join-as-validator","i-lucide-shield-check",{"title":30,"path":31,"stem":32,"icon":33},"Monitoring","\u002Foperators\u002Fmonitoring","1.operators\u002F6.monitoring","i-lucide-activity",{"title":35,"icon":36,"path":37,"stem":38,"children":39,"page":73},"Hyperlane","i-lucide-link","\u002Foperators\u002Fhyperlane","1.operators\u002F7.hyperlane",[40,45,49,53,58,63,68],{"title":41,"path":42,"stem":43,"icon":44},"Hyperlane Agent Keys","\u002Foperators\u002Fhyperlane\u002Fagent-keys","1.operators\u002F7.hyperlane\u002F1.agent-keys","i-lucide-key-round",{"title":46,"path":47,"stem":48,"icon":36},"Hyperlane Setup","\u002Foperators\u002Fhyperlane\u002Fsetup","1.operators\u002F7.hyperlane\u002F2.setup",{"title":50,"path":51,"stem":52,"icon":28},"Run Validators","\u002Foperators\u002Fhyperlane\u002Fvalidators","1.operators\u002F7.hyperlane\u002F3.validators",{"title":54,"path":55,"stem":56,"icon":57},"Warp Token Deployment","\u002Foperators\u002Fhyperlane\u002Fwarp-token","1.operators\u002F7.hyperlane\u002F4.warp-token","i-lucide-arrow-left-right",{"title":59,"path":60,"stem":61,"icon":62},"Testing Warp Route","\u002Foperators\u002Fhyperlane\u002Ftesting-warp-route","1.operators\u002F7.hyperlane\u002F5.testing-warp-route","i-lucide-flask-conical",{"title":64,"path":65,"stem":66,"icon":67},"Join the Multisig","\u002Foperators\u002Fhyperlane\u002Fjoin-multisig","1.operators\u002F7.hyperlane\u002F6.join-multisig","i-lucide-user-plus",{"title":69,"path":70,"stem":71,"icon":72},"Rotate the Multisig","\u002Foperators\u002Fhyperlane\u002Fmultisig-rotation","1.operators\u002F7.hyperlane\u002F7.multisig-rotation","i-lucide-users",false,{"title":75,"icon":76,"path":77,"stem":78,"children":79,"page":73},"Bridge Runbook","i-lucide-list-checks","\u002Foperators\u002Fbridge-runbook","1.operators\u002F8.bridge-runbook",[80],{"title":81,"path":82,"stem":83,"icon":76},"Runbook Validator, Relayer e Multisig","\u002Foperators\u002Fbridge-runbook\u002Fvalidator-relayer-multisig","1.operators\u002F8.bridge-runbook\u002F1.validator-relayer-multisig",{"title":85,"icon":86,"path":87,"stem":88,"children":89,"page":73},"Developers","i-lucide-code","\u002Fdevelopers","2.developers",[90,93,96,101,106],{"title":11,"path":91,"stem":92,"icon":14},"\u002Fdevelopers\u002Fintroduction","2.developers\u002F1.introduction",{"title":20,"path":94,"stem":95,"icon":23},"\u002Fdevelopers\u002Fcreate-wallet","2.developers\u002F2.create-wallet",{"title":97,"path":98,"stem":99,"icon":100},"Faucet","\u002Fdevelopers\u002Ffaucet","2.developers\u002F3.faucet","i-lucide-coins",{"title":102,"path":103,"stem":104,"icon":105},"Chain Parameters","\u002Fdevelopers\u002Fchain-parameters","2.developers\u002F4.chain-parameters","i-lucide-settings",{"title":107,"path":108,"stem":109,"icon":110},"Send Transactions","\u002Fdevelopers\u002Fsend-transactions","2.developers\u002F5.send-transactions","i-lucide-send",{"title":112,"icon":113,"path":114,"stem":115,"children":116,"page":73},"Users","i-lucide-user","\u002Fusers","3.users",[117,120,123,126],{"title":11,"path":118,"stem":119,"icon":14},"\u002Fusers\u002Fintroduction","3.users\u002F1.introduction",{"title":20,"path":121,"stem":122,"icon":23},"\u002Fusers\u002Fcreate-wallet","3.users\u002F2.create-wallet",{"title":97,"path":124,"stem":125,"icon":100},"\u002Fusers\u002Ffaucet","3.users\u002F3.faucet",{"title":127,"path":128,"stem":129,"icon":130},"Staking","\u002Fusers\u002Fstaking","3.users\u002F4.staking","i-lucide-landmark",{"id":132,"title":81,"body":133,"description":5629,"extension":5630,"links":5631,"meta":5632,"navigation":5633,"path":82,"seo":5634,"stem":83,"__hash__":5637},"docs\u002F1.operators\u002F8.bridge-runbook\u002F1.validator-relayer-multisig.md",{"type":134,"value":135,"toc":5604},"minimark",[136,153,200,224,229,299,316,320,330,383,399,558,563,648,652,917,920,924,939,966,3190,3192,3196,3210,3216,3384,3408,3433,3564,3566,3570,3581,3591,3605,3630,3931,3952,3954,3958,3968,4030,4098,4133,4135,4139,4145,4212,4322,4326,4353,4583,4590,4592,4596,4599,4831,4844,4912,4914,4918,4929,4946,5173,5182,5224,5244,5246,5250,5405,5584,5600],[137,138,139,140,148,149,152],"p",{},"Runbook operativo, in ordine di esecuzione, per gestire il bridge Hyperlane tra ",[141,142,143,144],"strong",{},"BitSong ",[145,146,147],"code",{},"crescendo-1"," e ",[141,150,151],{},"Base Sepolia",". Copre sette operazioni:",[154,155,156,164,170,176,182,188,194],"ol",{},[157,158,159],"li",{},[160,161,163],"a",{"href":162},"#1-validator-hyperlane","Validator Hyperlane",[157,165,166],{},[160,167,169],{"href":168},"#2-relayer","Relayer",[157,171,172],{},[160,173,175],{"href":174},"#3-creare-un-nuovo-multisig-23","Creare un nuovo multisig 2\u002F3",[157,177,178],{},[160,179,181],{"href":180},"#4-rimuovere-lattuale-multisig","Rimuovere l'attuale multisig",[157,183,184],{},[160,185,187],{"href":186},"#5-impostare-il-nuovo-multisig","Impostare il nuovo multisig",[157,189,190],{},[160,191,193],{"href":192},"#6-test-transfer-bitsong-base-sepolia","Test transfer BitSong → Base Sepolia",[157,195,196],{},[160,197,199],{"href":198},"#7-test-transfer-base-sepolia-bitsong","Test transfer Base Sepolia → BitSong",[201,202,204,205,208,209,212,213,216,217,148,220,223],"tip",{"title":203},"Validato end-to-end","Questa procedura è stata ",[141,206,207],{},"eseguita e verificata sul campo"," con ",[141,210,211],{},"3 validator (2\u002F3) + relayer in AWS KMS + S3",", ",[141,214,215],{},"sincronizzati solo con i nodi pubblici"," (nessun nodo locale): announce on-chain su entrambe le chain, rotazione del multisig su entrambi i lati, e round-trip warp ",[141,218,219],{},"BitSong → Base",[141,221,222],{},"Base → BitSong"," completati. I valori e i caveat qui riportati riflettono quel test reale.",[225,226,228],"h2",{"id":227},"prerequisiti","Prerequisiti",[230,231,232,257,270,281,292],"ul",{},[157,233,234,235,238,239,212,242,245,246,249,250,212,253,256],{},"Un ",[141,236,237],{},"VPS"," (Ubuntu 24.04\u002F26.04, 2-4 vCPU, 4-8 GB RAM) con ",[141,240,241],{},"Docker",[141,243,244],{},"Foundry"," (",[145,247,248],{},"cast","), ",[141,251,252],{},"AWS CLI v2",[145,254,255],{},"jq",".",[157,258,234,259,262,263,266,267,256],{},[141,260,261],{},"account AWS"," (per validator\u002Frelayer in produzione): utente IAM con access key, chiavi ",[141,264,265],{},"KMS"," e un ",[141,268,269],{},"bucket S3",[157,271,272,273,276,277,280],{},"Accesso ai ",[141,274,275],{},"nodi pubblici"," BitSong + un ",[141,278,279],{},"RPC Base Sepolia"," con buoni limiti (vedi sotto). Non serve un nodo BitSong locale.",[157,282,283,284,287,288,291],{},"Account Cosmos finanziato con ",[141,285,286],{},"TBTSG"," (gas dell'announce) e indirizzi EVM dei validator\u002Frelayer finanziati con ",[141,289,290],{},"ETH su Base Sepolia"," (announce + gas relay).",[157,293,294,295,298],{},"Le operazioni 3-5 (rotazione multisig) richiedono la ",[141,296,297],{},"chiave owner"," del bridge.",[300,301,303,304,307,308,311,312,315],"callout",{"color":302,"icon":100,"to":124},"primary","TBTSG: usa il ",[160,305,306],{"href":124},"faucet"," (API: ",[145,309,310],{},"POST https:\u002F\u002Ffaucet.testnet.bitsong.io\u002Fapi\u002Fv1\u002Ffaucet {address}"," → poll ",[145,313,314],{},"\u002Fapi\u002Fv1\u002Ffaucet\u002Fstatus\u002F{runId}","). ETH Base Sepolia: faucet Coinbase \u002F Alchemy sugli indirizzi EVM derivati da KMS.",[225,317,319],{"id":318},"parametri-reali-del-bridge","Parametri reali del bridge",[137,321,322,323,326,327,329],{},"ID ",[141,324,325],{},"on-chain"," del bridge su ",[145,328,147],{}," (verificati). Se cambiano, recuperali coi comandi in coda.",[331,332,333,341,347,353,359,371],"field-group",{},[334,335,338],"field",{"name":336,"type":337},"Mailbox \u002F validatorAnnounce (BitSong)","hex",[145,339,340],{},"0x68797065726c616e650000000000000000000000000000000000000000000000",[334,342,344],{"name":343,"type":337},"MerkleTreeHook (BitSong)",[145,345,346],{},"0x726f757465725f706f73745f6469737061746368000000030000000000000000",[334,348,350],{"name":349,"type":337},"IGP (BitSong)",[145,351,352],{},"0x726f757465725f706f73745f6469737061746368000000040000000000000001",[334,354,356],{"name":355,"type":337},"RoutingISM (BitSong)",[145,357,358],{},"0x726f757465725f69736d00000000000000000000000000010000000000000001",[334,360,363,364,367,368],{"name":361,"type":362},"Domain ID","number","BitSong: ",[145,365,366],{},"71717171"," — Base Sepolia: ",[145,369,370],{},"84532",[334,372,375,376,379,380],{"name":373,"type":374},"Base Sepolia: Mailbox \u002F ISM factory","address","Mailbox ",[145,377,378],{},"0x6966b0E55883d49BFB24539356a2f8A673E02039"," — ISM factory ",[145,381,382],{},"0xfc6e546510dC9d76057F1f76633FCFfC188CB213",[384,385,386,387,391,392,395,396,256],"warning",{},"Il dominio di BitSong è ",[141,388,389],{},[145,390,366],{},", non ",[145,393,394],{},"7171",". Usare il valore sbagliato produce ",[145,397,398],{},"No router enrolled for domain",[400,401,407],"pre",{"className":402,"code":403,"filename":404,"language":405,"meta":406,"style":406},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bitsongd query hyperlane mailboxes --output json --node $NODE | jq '.mailboxes'\nbitsongd query hyperlane hooks merkle-tree-hooks --output json --node $NODE | jq '.merkle_tree_hooks'\nbitsongd query hyperlane hooks igps --output json --node $NODE | jq '.igps'\nbitsongd query hyperlane ism isms --output json --node $NODE | jq '.isms'\n","Recupera gli ID dal nodo","bash","",[145,408,409,457,491,524],{"__ignoreMap":406},[410,411,414,418,422,425,428,431,434,437,441,445,448,451,454],"span",{"class":412,"line":413},"line",1,[410,415,417],{"class":416},"sBMFI","bitsongd",[410,419,421],{"class":420},"sfazB"," query",[410,423,424],{"class":420}," hyperlane",[410,426,427],{"class":420}," mailboxes",[410,429,430],{"class":420}," --output",[410,432,433],{"class":420}," json",[410,435,436],{"class":420}," --node",[410,438,440],{"class":439},"sTEyZ"," $NODE ",[410,442,444],{"class":443},"sMK4o","|",[410,446,447],{"class":416}," jq",[410,449,450],{"class":443}," '",[410,452,453],{"class":420},".mailboxes",[410,455,456],{"class":443},"'\n",[410,458,460,462,464,466,469,472,474,476,478,480,482,484,486,489],{"class":412,"line":459},2,[410,461,417],{"class":416},[410,463,421],{"class":420},[410,465,424],{"class":420},[410,467,468],{"class":420}," hooks",[410,470,471],{"class":420}," merkle-tree-hooks",[410,473,430],{"class":420},[410,475,433],{"class":420},[410,477,436],{"class":420},[410,479,440],{"class":439},[410,481,444],{"class":443},[410,483,447],{"class":416},[410,485,450],{"class":443},[410,487,488],{"class":420},".merkle_tree_hooks",[410,490,456],{"class":443},[410,492,494,496,498,500,502,505,507,509,511,513,515,517,519,522],{"class":412,"line":493},3,[410,495,417],{"class":416},[410,497,421],{"class":420},[410,499,424],{"class":420},[410,501,468],{"class":420},[410,503,504],{"class":420}," igps",[410,506,430],{"class":420},[410,508,433],{"class":420},[410,510,436],{"class":420},[410,512,440],{"class":439},[410,514,444],{"class":443},[410,516,447],{"class":416},[410,518,450],{"class":443},[410,520,521],{"class":420},".igps",[410,523,456],{"class":443},[410,525,527,529,531,533,536,539,541,543,545,547,549,551,553,556],{"class":412,"line":526},4,[410,528,417],{"class":416},[410,530,421],{"class":420},[410,532,424],{"class":420},[410,534,535],{"class":420}," ism",[410,537,538],{"class":420}," isms",[410,540,430],{"class":420},[410,542,433],{"class":420},[410,544,436],{"class":420},[410,546,440],{"class":439},[410,548,444],{"class":443},[410,550,447],{"class":416},[410,552,450],{"class":443},[410,554,555],{"class":420},".isms",[410,557,456],{"class":443},[559,560,562],"h3",{"id":561},"endpoint-dei-nodi-pubblici-verificati","Endpoint dei nodi pubblici (verificati)",[384,564,566],{"title":565},"Usa questi endpoint, non quelli di default",[230,567,568,598],{},[157,569,570,573,574,577,578,581,582,585,586,589,590,593,594,597],{},[141,571,572],{},"BitSong",": usa l'",[141,575,576],{},"IP diretto del nodo"," — RPC ",[145,579,580],{},"http:\u002F\u002F178.104.0.132:26657",", gRPC ",[145,583,584],{},"http:\u002F\u002F178.104.0.132:9090",". Il proxy ",[145,587,588],{},"https:\u002F\u002Frpc.testnet.bitsong.io"," può dare ",[141,591,592],{},"502"," sotto carico di indicizzazione e ",[141,595,596],{},"non"," espone un gRPC pubblico TLS.",[157,599,600,602,603,606,607,610,611,614,615,245,618,621,622,245,625,627,628,631,632,635,636,639,640,643,644,647],{},[141,601,151],{},": usa un RPC con limiti alti, es. ",[141,604,605],{},"Coinbase CDP"," ",[145,608,609],{},"https:\u002F\u002Fapi.developer.coinbase.com\u002Frpc\u002Fv1\u002Fbase-sepolia\u002F\u003CAPI_KEY>",". Attenzione: il path ",[145,612,613],{},"\u002Fbase\u002F"," è la ",[141,616,617],{},"mainnet",[145,619,620],{},"8453","), serve ",[145,623,624],{},"\u002Fbase-sepolia\u002F",[145,626,370],{},"). CDP limita ",[145,629,630],{},"getLogs"," a ",[141,633,634],{},"1000 blocchi"," → ",[145,637,638],{},"index.chunk"," ≤ ",[141,641,642],{},"999",". L'RPC pubblico ",[145,645,646],{},"https:\u002F\u002Fsepolia.base.org"," limita a 2000 e va in rate-limit.",[559,649,651],{"id":650},"variabili-dambiente","Variabili d'ambiente",[400,653,656],{"className":402,"code":654,"filename":655,"language":405,"meta":406,"style":406},"export CHAIN_ID=\"crescendo-1\"\nexport DOMAIN_ID=\"71717171\"\nexport REMOTE_DOMAIN=\"84532\"\nexport DENOM=\"utbtsg\"\nexport NODE=\"tcp:\u002F\u002F178.104.0.132:26657\"            # nodo pubblico BitSong (IP diretto)\nexport EVM_RPC=\"https:\u002F\u002Fapi.developer.coinbase.com\u002Frpc\u002Fv1\u002Fbase-sepolia\u002F\u003CAPI_KEY>\"\nexport KEY_NAME=\"\u003Ctua-chiave>\"\n\n# Bridge (valori reali sopra)\nexport MAILBOX_ID=\"0x68797065726c616e650000000000000000000000000000000000000000000000\"\nexport MERKLE_HOOK_ID=\"0x726f757465725f706f73745f6469737061746368000000030000000000000000\"\nexport IGP_ID=\"0x726f757465725f706f73745f6469737061746368000000040000000000000001\"\nexport ROUTING_ISM_ID=\"0x726f757465725f69736d00000000000000000000000000010000000000000001\"\n\n# AWS (validator\u002Frelayer in produzione)\nexport AWS_REGION=\"eu-central-1\"\nexport S3_BUCKET=\"\u003Ctuo-bucket-checkpoint>\"\nexport HYPERLANE_IMAGE=\"ghcr.io\u002Fhyperlane-xyz\u002Fhyperlane-agent:agents-v2.2.0\"\n","Terminal",[145,657,658,678,693,708,724,745,761,778,785,791,807,823,839,855,860,866,883,900],{"__ignoreMap":406},[410,659,660,664,667,670,673,675],{"class":412,"line":413},[410,661,663],{"class":662},"spNyl","export",[410,665,666],{"class":439}," CHAIN_ID",[410,668,669],{"class":443},"=",[410,671,672],{"class":443},"\"",[410,674,147],{"class":420},[410,676,677],{"class":443},"\"\n",[410,679,680,682,685,687,689,691],{"class":412,"line":459},[410,681,663],{"class":662},[410,683,684],{"class":439}," DOMAIN_ID",[410,686,669],{"class":443},[410,688,672],{"class":443},[410,690,366],{"class":420},[410,692,677],{"class":443},[410,694,695,697,700,702,704,706],{"class":412,"line":493},[410,696,663],{"class":662},[410,698,699],{"class":439}," REMOTE_DOMAIN",[410,701,669],{"class":443},[410,703,672],{"class":443},[410,705,370],{"class":420},[410,707,677],{"class":443},[410,709,710,712,715,717,719,722],{"class":412,"line":526},[410,711,663],{"class":662},[410,713,714],{"class":439}," DENOM",[410,716,669],{"class":443},[410,718,672],{"class":443},[410,720,721],{"class":420},"utbtsg",[410,723,677],{"class":443},[410,725,727,729,732,734,736,739,741],{"class":412,"line":726},5,[410,728,663],{"class":662},[410,730,731],{"class":439}," NODE",[410,733,669],{"class":443},[410,735,672],{"class":443},[410,737,738],{"class":420},"tcp:\u002F\u002F178.104.0.132:26657",[410,740,672],{"class":443},[410,742,744],{"class":743},"sHwdD","            # nodo pubblico BitSong (IP diretto)\n",[410,746,748,750,753,755,757,759],{"class":412,"line":747},6,[410,749,663],{"class":662},[410,751,752],{"class":439}," EVM_RPC",[410,754,669],{"class":443},[410,756,672],{"class":443},[410,758,609],{"class":420},[410,760,677],{"class":443},[410,762,764,766,769,771,773,776],{"class":412,"line":763},7,[410,765,663],{"class":662},[410,767,768],{"class":439}," KEY_NAME",[410,770,669],{"class":443},[410,772,672],{"class":443},[410,774,775],{"class":420},"\u003Ctua-chiave>",[410,777,677],{"class":443},[410,779,781],{"class":412,"line":780},8,[410,782,784],{"emptyLinePlaceholder":783},true,"\n",[410,786,788],{"class":412,"line":787},9,[410,789,790],{"class":743},"# Bridge (valori reali sopra)\n",[410,792,794,796,799,801,803,805],{"class":412,"line":793},10,[410,795,663],{"class":662},[410,797,798],{"class":439}," MAILBOX_ID",[410,800,669],{"class":443},[410,802,672],{"class":443},[410,804,340],{"class":420},[410,806,677],{"class":443},[410,808,810,812,815,817,819,821],{"class":412,"line":809},11,[410,811,663],{"class":662},[410,813,814],{"class":439}," MERKLE_HOOK_ID",[410,816,669],{"class":443},[410,818,672],{"class":443},[410,820,346],{"class":420},[410,822,677],{"class":443},[410,824,826,828,831,833,835,837],{"class":412,"line":825},12,[410,827,663],{"class":662},[410,829,830],{"class":439}," IGP_ID",[410,832,669],{"class":443},[410,834,672],{"class":443},[410,836,352],{"class":420},[410,838,677],{"class":443},[410,840,842,844,847,849,851,853],{"class":412,"line":841},13,[410,843,663],{"class":662},[410,845,846],{"class":439}," ROUTING_ISM_ID",[410,848,669],{"class":443},[410,850,672],{"class":443},[410,852,358],{"class":420},[410,854,677],{"class":443},[410,856,858],{"class":412,"line":857},14,[410,859,784],{"emptyLinePlaceholder":783},[410,861,863],{"class":412,"line":862},15,[410,864,865],{"class":743},"# AWS (validator\u002Frelayer in produzione)\n",[410,867,869,871,874,876,878,881],{"class":412,"line":868},16,[410,870,663],{"class":662},[410,872,873],{"class":439}," AWS_REGION",[410,875,669],{"class":443},[410,877,672],{"class":443},[410,879,880],{"class":420},"eu-central-1",[410,882,677],{"class":443},[410,884,886,888,891,893,895,898],{"class":412,"line":885},17,[410,887,663],{"class":662},[410,889,890],{"class":439}," S3_BUCKET",[410,892,669],{"class":443},[410,894,672],{"class":443},[410,896,897],{"class":420},"\u003Ctuo-bucket-checkpoint>",[410,899,677],{"class":443},[410,901,903,905,908,910,912,915],{"class":412,"line":902},18,[410,904,663],{"class":662},[410,906,907],{"class":439}," HYPERLANE_IMAGE",[410,909,669],{"class":443},[410,911,672],{"class":443},[410,913,914],{"class":420},"ghcr.io\u002Fhyperlane-xyz\u002Fhyperlane-agent:agents-v2.2.0",[410,916,677],{"class":443},[918,919],"hr",{},[225,921,923],{"id":922},"_1-validator-hyperlane","1. Validator Hyperlane",[137,925,926,927,930,931,934,935,938],{},"Il validator firma i checkpoint dei messaggi. Serve ",[141,928,929],{},"una istanza per ciascuna chain di origine",": una osserva BitSong, una osserva Base Sepolia. Per ",[141,932,933],{},"3 validator"," in un multisig 2\u002F3 ripeti questa sezione per ognuno (3 chiavi KMS distinte → 3 indirizzi EVM distinti). Questo runbook usa la configurazione ",[141,936,937],{},"AWS KMS (firma) + S3 (checkpoint)",", validata sul campo.",[201,940,942,943,946,947,950,951,954,955,958,959,962,963,256],{"title":941},"Variante local (single host \u002F dev)","In alternativa: ",[145,944,945],{},"--validator.type hexKey --validator.key 0x… --checkpointSyncer.type localStorage --checkpointSyncer.path \u002Fcheckpoints"," (e il relayer con ",[145,948,949],{},"--allowLocalCheckpointSyncers true","). Con ",[145,952,953],{},"localStorage"," l'announce è un percorso ",[145,956,957],{},"file:\u002F\u002F\u002F…"," leggibile ",[141,960,961],{},"solo"," da relayer sullo stesso host. Per un multisig multi-operatore usa ",[141,964,965],{},"S3",[967,968,970,974,992,1106,1135,1139,1179,1436,1440,1447,1530,1537,1556,2490,2530,2534,2561,2974,3019,3023],"steps",{"level":969},"3",[559,971,973],{"id":972},"crea-le-risorse-aws-iam-kms-s3","Crea le risorse AWS (IAM, KMS, S3)",[137,975,976,977,980,981,984,985,212,988,991],{},"Crea un utente IAM con access key e configura ",[145,978,979],{},"aws"," sul server. Poi una ",[141,982,983],{},"chiave KMS per ogni validator"," + una per il relayer (asimmetriche, ",[145,986,987],{},"ECC_SECG_P256K1",[141,989,990],{},"Sign and verify","), e ricava l'indirizzo EVM (è quello che entra nel multisig).",[400,993,995],{"className":402,"code":994,"filename":655,"language":405,"meta":406,"style":406},"# Chiave KMS del validator-N (ripeti per ogni validator + relayer)\nKID=$(aws kms create-key --key-spec ECC_SECG_P256K1 --key-usage SIGN_VERIFY \\\n  --query KeyMetadata.KeyId --output text)\naws kms create-alias --alias-name alias\u002Fhl-validator-1 --target-key-id \"$KID\"\n\n# Indirizzo EVM derivato dalla chiave KMS (da registrare nel multisig)\nAWS_KMS_KEY_ID=alias\u002Fhl-validator-1 cast wallet address --aws\n",[145,996,997,1002,1033,1049,1075,1079,1084],{"__ignoreMap":406},[410,998,999],{"class":412,"line":413},[410,1000,1001],{"class":743},"# Chiave KMS del validator-N (ripeti per ogni validator + relayer)\n",[410,1003,1004,1007,1010,1012,1015,1018,1021,1024,1027,1030],{"class":412,"line":459},[410,1005,1006],{"class":439},"KID",[410,1008,1009],{"class":443},"=$(",[410,1011,979],{"class":416},[410,1013,1014],{"class":420}," kms",[410,1016,1017],{"class":420}," create-key",[410,1019,1020],{"class":420}," --key-spec",[410,1022,1023],{"class":420}," ECC_SECG_P256K1",[410,1025,1026],{"class":420}," --key-usage",[410,1028,1029],{"class":420}," SIGN_VERIFY",[410,1031,1032],{"class":439}," \\\n",[410,1034,1035,1038,1041,1043,1046],{"class":412,"line":493},[410,1036,1037],{"class":420},"  --query",[410,1039,1040],{"class":420}," KeyMetadata.KeyId",[410,1042,430],{"class":420},[410,1044,1045],{"class":420}," text",[410,1047,1048],{"class":443},")\n",[410,1050,1051,1053,1055,1058,1061,1064,1067,1070,1073],{"class":412,"line":526},[410,1052,979],{"class":416},[410,1054,1014],{"class":420},[410,1056,1057],{"class":420}," create-alias",[410,1059,1060],{"class":420}," --alias-name",[410,1062,1063],{"class":420}," alias\u002Fhl-validator-1",[410,1065,1066],{"class":420}," --target-key-id",[410,1068,1069],{"class":443}," \"",[410,1071,1072],{"class":439},"$KID",[410,1074,677],{"class":443},[410,1076,1077],{"class":412,"line":726},[410,1078,784],{"emptyLinePlaceholder":783},[410,1080,1081],{"class":412,"line":747},[410,1082,1083],{"class":743},"# Indirizzo EVM derivato dalla chiave KMS (da registrare nel multisig)\n",[410,1085,1086,1089,1091,1094,1097,1100,1103],{"class":412,"line":763},[410,1087,1088],{"class":439},"AWS_KMS_KEY_ID",[410,1090,669],{"class":443},[410,1092,1093],{"class":420},"alias\u002Fhl-validator-1",[410,1095,1096],{"class":416}," cast",[410,1098,1099],{"class":420}," wallet",[410,1101,1102],{"class":420}," address",[410,1104,1105],{"class":420}," --aws\n",[1107,1108,1109,1110,1113,1114,212,1117,212,1120,1123,1124,1127,1128,1130,1131,256],"note",{},"L'utente IAM deve poter ",[141,1111,1112],{},"firmare"," con le chiavi (",[145,1115,1116],{},"kms:Sign",[145,1118,1119],{},"kms:GetPublicKey",[145,1121,1122],{},"kms:DescribeKey",") e leggere\u002Fscrivere S3. Puoi concederlo via IAM policy oppure, alla creazione della chiave, via ",[141,1125,1126],{},"key policy"," (statement che dà al tuo utente ",[145,1129,1116],{},"). Vedi ",[160,1132,1134],{"href":1133},"\u002Foperators\u002Fhyperlane\u002Fagent-keys#aws-environment-production","Agent Keys → AWS",[559,1136,1138],{"id":1137},"crea-il-bucket-s3-dei-checkpoint-deve-essere-public-read","Crea il bucket S3 dei checkpoint (DEVE essere public-read)",[1140,1141,1143,1144,245,1147,1150,1151,1154,1155,1158,1159,1162,1163,1166,1167,1170,1171,1174,1175,1178],"caution",{"title":1142},"Il bucket DEVE essere leggibile pubblicamente","I validator ",[141,1145,1146],{},"leggono i propri checkpoint in modo anonimo",[145,1148,1149],{},"anonymously_read_from_bucket","). Con un bucket ",[141,1152,1153],{},"privato"," la GET anonima torna ",[141,1156,1157],{},"403"," e il validator ",[141,1160,1161],{},"non scrive mai"," i ",[145,1164,1165],{},"checkpoint_*.json"," (loop infinito su ",[145,1168,1169],{},"s3_storage.rs:101",") → il relayer va in ",[145,1172,1173],{},"Unable to reach quorum",". I checkpoint sono ",[141,1176,1177],{},"firme pubbliche non sensibili",": il bucket va reso public-read (setup standard Hyperlane).",[400,1180,1182],{"className":402,"code":1181,"filename":655,"language":405,"meta":406,"style":406},"aws s3api create-bucket --bucket \"$S3_BUCKET\" --region \"$AWS_REGION\" \\\n  --create-bucket-configuration LocationConstraint=\"$AWS_REGION\"\n\n# Abilita le ACL (l'agente scrive gli oggetti con ACL public-read)\naws s3api put-bucket-ownership-controls --bucket \"$S3_BUCKET\" \\\n  --ownership-controls 'Rules=[{ObjectOwnership=ObjectWriter}]'\n\n# Consenti l'accesso pubblico in lettura\naws s3api put-public-access-block --bucket \"$S3_BUCKET\" \\\n  --public-access-block-configuration BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false\n\n# Policy: lettura pubblica (GetObject + ListBucket)\naws s3api put-bucket-policy --bucket \"$S3_BUCKET\" --policy '{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"PublicRead\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":[\"s3:GetObject\",\"s3:ListBucket\"],\"Resource\":[\"arn:aws:s3:::'\"$S3_BUCKET\"'\",\"arn:aws:s3:::'\"$S3_BUCKET\"'\u002F*\"]}]}'\n\n# Verifica: chiave mancante deve dare 404 (non 403)\ncurl -s -o \u002Fdev\u002Fnull -w \"anon GET -> %{http_code} (atteso 404)\\n\" \\\n  \"https:\u002F\u002F$S3_BUCKET.s3.$AWS_REGION.amazonaws.com\u002Fbitsong-val1\u002Fcheckpoint_latest_index.json\"\n",[145,1183,1184,1216,1230,1234,1239,1258,1270,1274,1279,1298,1325,1329,1334,1381,1385,1390,1416],{"__ignoreMap":406},[410,1185,1186,1188,1191,1194,1197,1199,1202,1204,1207,1209,1212,1214],{"class":412,"line":413},[410,1187,979],{"class":416},[410,1189,1190],{"class":420}," s3api",[410,1192,1193],{"class":420}," create-bucket",[410,1195,1196],{"class":420}," --bucket",[410,1198,1069],{"class":443},[410,1200,1201],{"class":439},"$S3_BUCKET",[410,1203,672],{"class":443},[410,1205,1206],{"class":420}," --region",[410,1208,1069],{"class":443},[410,1210,1211],{"class":439},"$AWS_REGION",[410,1213,672],{"class":443},[410,1215,1032],{"class":439},[410,1217,1218,1221,1224,1226,1228],{"class":412,"line":459},[410,1219,1220],{"class":420},"  --create-bucket-configuration",[410,1222,1223],{"class":420}," LocationConstraint=",[410,1225,672],{"class":443},[410,1227,1211],{"class":439},[410,1229,677],{"class":443},[410,1231,1232],{"class":412,"line":493},[410,1233,784],{"emptyLinePlaceholder":783},[410,1235,1236],{"class":412,"line":526},[410,1237,1238],{"class":743},"# Abilita le ACL (l'agente scrive gli oggetti con ACL public-read)\n",[410,1240,1241,1243,1245,1248,1250,1252,1254,1256],{"class":412,"line":726},[410,1242,979],{"class":416},[410,1244,1190],{"class":420},[410,1246,1247],{"class":420}," put-bucket-ownership-controls",[410,1249,1196],{"class":420},[410,1251,1069],{"class":443},[410,1253,1201],{"class":439},[410,1255,672],{"class":443},[410,1257,1032],{"class":439},[410,1259,1260,1263,1265,1268],{"class":412,"line":747},[410,1261,1262],{"class":420},"  --ownership-controls",[410,1264,450],{"class":443},[410,1266,1267],{"class":420},"Rules=[{ObjectOwnership=ObjectWriter}]",[410,1269,456],{"class":443},[410,1271,1272],{"class":412,"line":763},[410,1273,784],{"emptyLinePlaceholder":783},[410,1275,1276],{"class":412,"line":780},[410,1277,1278],{"class":743},"# Consenti l'accesso pubblico in lettura\n",[410,1280,1281,1283,1285,1288,1290,1292,1294,1296],{"class":412,"line":787},[410,1282,979],{"class":416},[410,1284,1190],{"class":420},[410,1286,1287],{"class":420}," put-public-access-block",[410,1289,1196],{"class":420},[410,1291,1069],{"class":443},[410,1293,1201],{"class":439},[410,1295,672],{"class":443},[410,1297,1032],{"class":439},[410,1299,1300,1303,1306,1309,1312,1314,1317,1319,1322],{"class":412,"line":793},[410,1301,1302],{"class":420},"  --public-access-block-configuration",[410,1304,1305],{"class":420}," BlockPublicAcls=",[410,1307,1308],{"class":443},"false",[410,1310,1311],{"class":420},",IgnorePublicAcls=",[410,1313,1308],{"class":443},[410,1315,1316],{"class":420},",BlockPublicPolicy=",[410,1318,1308],{"class":443},[410,1320,1321],{"class":420},",RestrictPublicBuckets=",[410,1323,1324],{"class":443},"false\n",[410,1326,1327],{"class":412,"line":809},[410,1328,784],{"emptyLinePlaceholder":783},[410,1330,1331],{"class":412,"line":825},[410,1332,1333],{"class":743},"# Policy: lettura pubblica (GetObject + ListBucket)\n",[410,1335,1336,1338,1340,1343,1345,1347,1349,1351,1354,1356,1359,1362,1364,1367,1370,1372,1374,1376,1379],{"class":412,"line":841},[410,1337,979],{"class":416},[410,1339,1190],{"class":420},[410,1341,1342],{"class":420}," put-bucket-policy",[410,1344,1196],{"class":420},[410,1346,1069],{"class":443},[410,1348,1201],{"class":439},[410,1350,672],{"class":443},[410,1352,1353],{"class":420}," --policy",[410,1355,450],{"class":443},[410,1357,1358],{"class":420},"{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"PublicRead\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":[\"s3:GetObject\",\"s3:ListBucket\"],\"Resource\":[\"arn:aws:s3:::",[410,1360,1361],{"class":443},"'\"",[410,1363,1201],{"class":439},[410,1365,1366],{"class":443},"\"'",[410,1368,1369],{"class":420},"\",\"arn:aws:s3:::",[410,1371,1361],{"class":443},[410,1373,1201],{"class":439},[410,1375,1366],{"class":443},[410,1377,1378],{"class":420},"\u002F*\"]}]}",[410,1380,456],{"class":443},[410,1382,1383],{"class":412,"line":857},[410,1384,784],{"emptyLinePlaceholder":783},[410,1386,1387],{"class":412,"line":862},[410,1388,1389],{"class":743},"# Verifica: chiave mancante deve dare 404 (non 403)\n",[410,1391,1392,1395,1398,1401,1404,1407,1409,1412,1414],{"class":412,"line":868},[410,1393,1394],{"class":416},"curl",[410,1396,1397],{"class":420}," -s",[410,1399,1400],{"class":420}," -o",[410,1402,1403],{"class":420}," \u002Fdev\u002Fnull",[410,1405,1406],{"class":420}," -w",[410,1408,1069],{"class":443},[410,1410,1411],{"class":420},"anon GET -> %{http_code} (atteso 404)\\n",[410,1413,672],{"class":443},[410,1415,1032],{"class":439},[410,1417,1418,1421,1424,1426,1429,1431,1434],{"class":412,"line":885},[410,1419,1420],{"class":443},"  \"",[410,1422,1423],{"class":420},"https:\u002F\u002F",[410,1425,1201],{"class":439},[410,1427,1428],{"class":420},".s3.",[410,1430,1211],{"class":439},[410,1432,1433],{"class":420},".amazonaws.com\u002Fbitsong-val1\u002Fcheckpoint_latest_index.json",[410,1435,677],{"class":443},[559,1437,1439],{"id":1438},"crea-e-finanzia-la-chiave-cosmos-di-announce","Crea e finanzia la chiave Cosmos di announce",[137,1441,1442,1443,1446],{},"BitSong è una chain Cosmos: anche con la firma KMS, l'",[141,1444,1445],{},"announce on-chain"," è una tx Cosmos e richiede una chiave Cosmos (hex) con saldo TBTSG. Una chiave condivisa tra i validator (e il relayer) è sufficiente.",[400,1448,1450],{"className":402,"code":1449,"filename":655,"language":405,"meta":406,"style":406},"bitsongd keys add hyperlane-signer --keyring-backend test\nCOSMOS_SIGNER_KEY=0x$(bitsongd keys export hyperlane-signer --unarmored-hex --unsafe --keyring-backend test 2>&1 | tail -1)\nexport COSMOS_SIGNER_KEY\n# Finanzia l'indirizzo bitsong1… via faucet (vedi Prerequisiti)\n",[145,1451,1452,1471,1518,1525],{"__ignoreMap":406},[410,1453,1454,1456,1459,1462,1465,1468],{"class":412,"line":413},[410,1455,417],{"class":416},[410,1457,1458],{"class":420}," keys",[410,1460,1461],{"class":420}," add",[410,1463,1464],{"class":420}," hyperlane-signer",[410,1466,1467],{"class":420}," --keyring-backend",[410,1469,1470],{"class":420}," test\n",[410,1472,1473,1476,1478,1481,1484,1486,1488,1491,1493,1496,1499,1501,1504,1507,1510,1513,1516],{"class":412,"line":459},[410,1474,1475],{"class":439},"COSMOS_SIGNER_KEY",[410,1477,669],{"class":443},[410,1479,1480],{"class":420},"0x",[410,1482,1483],{"class":443},"$(",[410,1485,417],{"class":416},[410,1487,1458],{"class":420},[410,1489,1490],{"class":420}," export",[410,1492,1464],{"class":420},[410,1494,1495],{"class":420}," --unarmored-hex",[410,1497,1498],{"class":420}," --unsafe",[410,1500,1467],{"class":420},[410,1502,1503],{"class":420}," test",[410,1505,1506],{"class":443}," 2>&1",[410,1508,1509],{"class":443}," |",[410,1511,1512],{"class":416}," tail",[410,1514,1515],{"class":420}," -1",[410,1517,1048],{"class":443},[410,1519,1520,1522],{"class":412,"line":493},[410,1521,663],{"class":662},[410,1523,1524],{"class":439}," COSMOS_SIGNER_KEY\n",[410,1526,1527],{"class":412,"line":526},[410,1528,1529],{"class":743},"# Finanzia l'indirizzo bitsong1… via faucet (vedi Prerequisiti)\n",[559,1531,1533,1534],{"id":1532},"crea-lagent-configjson","Crea l'",[145,1535,1536],{},"agent-config.json",[400,1538,1540],{"className":402,"code":1539,"filename":655,"language":405,"meta":406,"style":406},"mkdir -p $HOME\u002Fhl\u002Fconfig\n",[145,1541,1542],{"__ignoreMap":406},[410,1543,1544,1547,1550,1553],{"class":412,"line":413},[410,1545,1546],{"class":416},"mkdir",[410,1548,1549],{"class":420}," -p",[410,1551,1552],{"class":439}," $HOME",[410,1554,1555],{"class":420},"\u002Fhl\u002Fconfig\n",[400,1557,1562],{"className":1558,"code":1559,"filename":1560,"language":1561,"meta":406,"style":406},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"chains\": {\n    \"bitsong\": {\n      \"name\": \"bitsong\",\n      \"chainId\": \"crescendo-1\",\n      \"domainId\": 71717171,\n      \"protocol\": \"cosmosNative\",\n      \"bech32Prefix\": \"bitsong\",\n      \"slip44\": 639,\n      \"contractAddressBytes\": 32,\n      \"canonicalAsset\": \"utbtsg\",\n      \"rpcUrls\": [{ \"http\": \"http:\u002F\u002F178.104.0.132:26657\" }],\n      \"grpcUrls\": [{ \"http\": \"http:\u002F\u002F178.104.0.132:9090\" }],\n      \"nativeToken\": { \"name\": \"BitSong\", \"symbol\": \"BTSG\", \"decimals\": 6, \"denom\": \"utbtsg\" },\n      \"gasPrice\": { \"amount\": \"0.025\", \"denom\": \"utbtsg\" },\n      \"gasMultiplier\": \"1.5\",\n      \"blocks\": { \"confirmations\": 1, \"estimateBlockTime\": 6, \"reorgPeriod\": 1 },\n      \"index\": { \"from\": 3895000, \"chunk\": 500 },\n      \"mailbox\": \"0x68797065726c616e650000000000000000000000000000000000000000000000\",\n      \"validatorAnnounce\": \"0x68797065726c616e650000000000000000000000000000000000000000000000\",\n      \"merkleTreeHook\": \"0x726f757465725f706f73745f6469737061746368000000030000000000000000\",\n      \"interchainGasPaymaster\": \"0x726f757465725f706f73745f6469737061746368000000040000000000000001\"\n    },\n    \"basesepolia\": {\n      \"name\": \"basesepolia\",\n      \"chainId\": 84532,\n      \"domainId\": 84532,\n      \"protocol\": \"ethereum\",\n      \"rpcUrls\": [{ \"http\": \"https:\u002F\u002Fapi.developer.coinbase.com\u002Frpc\u002Fv1\u002Fbase-sepolia\u002F\u003CAPI_KEY>\" }],\n      \"nativeToken\": { \"name\": \"Ether\", \"symbol\": \"ETH\", \"decimals\": 18 },\n      \"blocks\": { \"confirmations\": 1, \"estimateBlockTime\": 2, \"reorgPeriod\": 1 },\n      \"index\": { \"from\": 39040037, \"chunk\": 999 },\n      \"mailbox\": \"0x6966b0E55883d49BFB24539356a2f8A673E02039\",\n      \"validatorAnnounce\": \"0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9\",\n      \"merkleTreeHook\": \"0x86fb9F1c124fB20ff130C41a79a432F770f67AFD\",\n      \"interchainGasPaymaster\": \"0x28B02B97a850872C4D33C3E024fab6499ad96564\"\n    }\n  }\n}\n","$HOME\u002Fhl\u002Fconfig\u002Fagent-config.json","json",[145,1563,1564,1569,1584,1598,1620,1639,1655,1675,1694,1710,1726,1745,1778,1807,1888,1935,1955,2008,2049,2069,2089,2109,2127,2133,2147,2166,2182,2197,2217,2246,2306,2356,2395,2414,2434,2454,2472,2478,2484],{"__ignoreMap":406},[410,1565,1566],{"class":412,"line":413},[410,1567,1568],{"class":443},"{\n",[410,1570,1571,1573,1576,1578,1581],{"class":412,"line":459},[410,1572,1420],{"class":443},[410,1574,1575],{"class":662},"chains",[410,1577,672],{"class":443},[410,1579,1580],{"class":443},":",[410,1582,1583],{"class":443}," {\n",[410,1585,1586,1589,1592,1594,1596],{"class":412,"line":493},[410,1587,1588],{"class":443},"    \"",[410,1590,1591],{"class":416},"bitsong",[410,1593,672],{"class":443},[410,1595,1580],{"class":443},[410,1597,1583],{"class":443},[410,1599,1600,1603,1607,1609,1611,1613,1615,1617],{"class":412,"line":526},[410,1601,1602],{"class":443},"      \"",[410,1604,1606],{"class":1605},"sbssI","name",[410,1608,672],{"class":443},[410,1610,1580],{"class":443},[410,1612,1069],{"class":443},[410,1614,1591],{"class":420},[410,1616,672],{"class":443},[410,1618,1619],{"class":443},",\n",[410,1621,1622,1624,1627,1629,1631,1633,1635,1637],{"class":412,"line":726},[410,1623,1602],{"class":443},[410,1625,1626],{"class":1605},"chainId",[410,1628,672],{"class":443},[410,1630,1580],{"class":443},[410,1632,1069],{"class":443},[410,1634,147],{"class":420},[410,1636,672],{"class":443},[410,1638,1619],{"class":443},[410,1640,1641,1643,1646,1648,1650,1653],{"class":412,"line":747},[410,1642,1602],{"class":443},[410,1644,1645],{"class":1605},"domainId",[410,1647,672],{"class":443},[410,1649,1580],{"class":443},[410,1651,1652],{"class":1605}," 71717171",[410,1654,1619],{"class":443},[410,1656,1657,1659,1662,1664,1666,1668,1671,1673],{"class":412,"line":763},[410,1658,1602],{"class":443},[410,1660,1661],{"class":1605},"protocol",[410,1663,672],{"class":443},[410,1665,1580],{"class":443},[410,1667,1069],{"class":443},[410,1669,1670],{"class":420},"cosmosNative",[410,1672,672],{"class":443},[410,1674,1619],{"class":443},[410,1676,1677,1679,1682,1684,1686,1688,1690,1692],{"class":412,"line":780},[410,1678,1602],{"class":443},[410,1680,1681],{"class":1605},"bech32Prefix",[410,1683,672],{"class":443},[410,1685,1580],{"class":443},[410,1687,1069],{"class":443},[410,1689,1591],{"class":420},[410,1691,672],{"class":443},[410,1693,1619],{"class":443},[410,1695,1696,1698,1701,1703,1705,1708],{"class":412,"line":787},[410,1697,1602],{"class":443},[410,1699,1700],{"class":1605},"slip44",[410,1702,672],{"class":443},[410,1704,1580],{"class":443},[410,1706,1707],{"class":1605}," 639",[410,1709,1619],{"class":443},[410,1711,1712,1714,1717,1719,1721,1724],{"class":412,"line":793},[410,1713,1602],{"class":443},[410,1715,1716],{"class":1605},"contractAddressBytes",[410,1718,672],{"class":443},[410,1720,1580],{"class":443},[410,1722,1723],{"class":1605}," 32",[410,1725,1619],{"class":443},[410,1727,1728,1730,1733,1735,1737,1739,1741,1743],{"class":412,"line":809},[410,1729,1602],{"class":443},[410,1731,1732],{"class":1605},"canonicalAsset",[410,1734,672],{"class":443},[410,1736,1580],{"class":443},[410,1738,1069],{"class":443},[410,1740,721],{"class":420},[410,1742,672],{"class":443},[410,1744,1619],{"class":443},[410,1746,1747,1749,1752,1754,1756,1759,1761,1765,1767,1769,1771,1773,1775],{"class":412,"line":825},[410,1748,1602],{"class":443},[410,1750,1751],{"class":1605},"rpcUrls",[410,1753,672],{"class":443},[410,1755,1580],{"class":443},[410,1757,1758],{"class":443}," [{",[410,1760,1069],{"class":443},[410,1762,1764],{"class":1763},"swJcz","http",[410,1766,672],{"class":443},[410,1768,1580],{"class":443},[410,1770,1069],{"class":443},[410,1772,580],{"class":420},[410,1774,672],{"class":443},[410,1776,1777],{"class":443}," }],\n",[410,1779,1780,1782,1785,1787,1789,1791,1793,1795,1797,1799,1801,1803,1805],{"class":412,"line":841},[410,1781,1602],{"class":443},[410,1783,1784],{"class":1605},"grpcUrls",[410,1786,672],{"class":443},[410,1788,1580],{"class":443},[410,1790,1758],{"class":443},[410,1792,1069],{"class":443},[410,1794,1764],{"class":1763},[410,1796,672],{"class":443},[410,1798,1580],{"class":443},[410,1800,1069],{"class":443},[410,1802,584],{"class":420},[410,1804,672],{"class":443},[410,1806,1777],{"class":443},[410,1808,1809,1811,1814,1816,1818,1821,1823,1825,1827,1829,1831,1833,1835,1838,1840,1843,1845,1847,1849,1852,1854,1856,1858,1861,1863,1865,1868,1870,1872,1875,1877,1879,1881,1883,1885],{"class":412,"line":857},[410,1810,1602],{"class":443},[410,1812,1813],{"class":1605},"nativeToken",[410,1815,672],{"class":443},[410,1817,1580],{"class":443},[410,1819,1820],{"class":443}," {",[410,1822,1069],{"class":443},[410,1824,1606],{"class":1763},[410,1826,672],{"class":443},[410,1828,1580],{"class":443},[410,1830,1069],{"class":443},[410,1832,572],{"class":420},[410,1834,672],{"class":443},[410,1836,1837],{"class":443},",",[410,1839,1069],{"class":443},[410,1841,1842],{"class":1763},"symbol",[410,1844,672],{"class":443},[410,1846,1580],{"class":443},[410,1848,1069],{"class":443},[410,1850,1851],{"class":420},"BTSG",[410,1853,672],{"class":443},[410,1855,1837],{"class":443},[410,1857,1069],{"class":443},[410,1859,1860],{"class":1763},"decimals",[410,1862,672],{"class":443},[410,1864,1580],{"class":443},[410,1866,1867],{"class":1605}," 6",[410,1869,1837],{"class":443},[410,1871,1069],{"class":443},[410,1873,1874],{"class":1763},"denom",[410,1876,672],{"class":443},[410,1878,1580],{"class":443},[410,1880,1069],{"class":443},[410,1882,721],{"class":420},[410,1884,672],{"class":443},[410,1886,1887],{"class":443}," },\n",[410,1889,1890,1892,1895,1897,1899,1901,1903,1906,1908,1910,1912,1915,1917,1919,1921,1923,1925,1927,1929,1931,1933],{"class":412,"line":862},[410,1891,1602],{"class":443},[410,1893,1894],{"class":1605},"gasPrice",[410,1896,672],{"class":443},[410,1898,1580],{"class":443},[410,1900,1820],{"class":443},[410,1902,1069],{"class":443},[410,1904,1905],{"class":1763},"amount",[410,1907,672],{"class":443},[410,1909,1580],{"class":443},[410,1911,1069],{"class":443},[410,1913,1914],{"class":420},"0.025",[410,1916,672],{"class":443},[410,1918,1837],{"class":443},[410,1920,1069],{"class":443},[410,1922,1874],{"class":1763},[410,1924,672],{"class":443},[410,1926,1580],{"class":443},[410,1928,1069],{"class":443},[410,1930,721],{"class":420},[410,1932,672],{"class":443},[410,1934,1887],{"class":443},[410,1936,1937,1939,1942,1944,1946,1948,1951,1953],{"class":412,"line":868},[410,1938,1602],{"class":443},[410,1940,1941],{"class":1605},"gasMultiplier",[410,1943,672],{"class":443},[410,1945,1580],{"class":443},[410,1947,1069],{"class":443},[410,1949,1950],{"class":420},"1.5",[410,1952,672],{"class":443},[410,1954,1619],{"class":443},[410,1956,1957,1959,1962,1964,1966,1968,1970,1973,1975,1977,1980,1982,1984,1987,1989,1991,1993,1995,1997,2000,2002,2004,2006],{"class":412,"line":885},[410,1958,1602],{"class":443},[410,1960,1961],{"class":1605},"blocks",[410,1963,672],{"class":443},[410,1965,1580],{"class":443},[410,1967,1820],{"class":443},[410,1969,1069],{"class":443},[410,1971,1972],{"class":1763},"confirmations",[410,1974,672],{"class":443},[410,1976,1580],{"class":443},[410,1978,1979],{"class":1605}," 1",[410,1981,1837],{"class":443},[410,1983,1069],{"class":443},[410,1985,1986],{"class":1763},"estimateBlockTime",[410,1988,672],{"class":443},[410,1990,1580],{"class":443},[410,1992,1867],{"class":1605},[410,1994,1837],{"class":443},[410,1996,1069],{"class":443},[410,1998,1999],{"class":1763},"reorgPeriod",[410,2001,672],{"class":443},[410,2003,1580],{"class":443},[410,2005,1979],{"class":1605},[410,2007,1887],{"class":443},[410,2009,2010,2012,2015,2017,2019,2021,2023,2026,2028,2030,2033,2035,2037,2040,2042,2044,2047],{"class":412,"line":902},[410,2011,1602],{"class":443},[410,2013,2014],{"class":1605},"index",[410,2016,672],{"class":443},[410,2018,1580],{"class":443},[410,2020,1820],{"class":443},[410,2022,1069],{"class":443},[410,2024,2025],{"class":1763},"from",[410,2027,672],{"class":443},[410,2029,1580],{"class":443},[410,2031,2032],{"class":1605}," 3895000",[410,2034,1837],{"class":443},[410,2036,1069],{"class":443},[410,2038,2039],{"class":1763},"chunk",[410,2041,672],{"class":443},[410,2043,1580],{"class":443},[410,2045,2046],{"class":1605}," 500",[410,2048,1887],{"class":443},[410,2050,2052,2054,2057,2059,2061,2063,2065,2067],{"class":412,"line":2051},19,[410,2053,1602],{"class":443},[410,2055,2056],{"class":1605},"mailbox",[410,2058,672],{"class":443},[410,2060,1580],{"class":443},[410,2062,1069],{"class":443},[410,2064,340],{"class":420},[410,2066,672],{"class":443},[410,2068,1619],{"class":443},[410,2070,2072,2074,2077,2079,2081,2083,2085,2087],{"class":412,"line":2071},20,[410,2073,1602],{"class":443},[410,2075,2076],{"class":1605},"validatorAnnounce",[410,2078,672],{"class":443},[410,2080,1580],{"class":443},[410,2082,1069],{"class":443},[410,2084,340],{"class":420},[410,2086,672],{"class":443},[410,2088,1619],{"class":443},[410,2090,2092,2094,2097,2099,2101,2103,2105,2107],{"class":412,"line":2091},21,[410,2093,1602],{"class":443},[410,2095,2096],{"class":1605},"merkleTreeHook",[410,2098,672],{"class":443},[410,2100,1580],{"class":443},[410,2102,1069],{"class":443},[410,2104,346],{"class":420},[410,2106,672],{"class":443},[410,2108,1619],{"class":443},[410,2110,2112,2114,2117,2119,2121,2123,2125],{"class":412,"line":2111},22,[410,2113,1602],{"class":443},[410,2115,2116],{"class":1605},"interchainGasPaymaster",[410,2118,672],{"class":443},[410,2120,1580],{"class":443},[410,2122,1069],{"class":443},[410,2124,352],{"class":420},[410,2126,677],{"class":443},[410,2128,2130],{"class":412,"line":2129},23,[410,2131,2132],{"class":443},"    },\n",[410,2134,2136,2138,2141,2143,2145],{"class":412,"line":2135},24,[410,2137,1588],{"class":443},[410,2139,2140],{"class":416},"basesepolia",[410,2142,672],{"class":443},[410,2144,1580],{"class":443},[410,2146,1583],{"class":443},[410,2148,2150,2152,2154,2156,2158,2160,2162,2164],{"class":412,"line":2149},25,[410,2151,1602],{"class":443},[410,2153,1606],{"class":1605},[410,2155,672],{"class":443},[410,2157,1580],{"class":443},[410,2159,1069],{"class":443},[410,2161,2140],{"class":420},[410,2163,672],{"class":443},[410,2165,1619],{"class":443},[410,2167,2169,2171,2173,2175,2177,2180],{"class":412,"line":2168},26,[410,2170,1602],{"class":443},[410,2172,1626],{"class":1605},[410,2174,672],{"class":443},[410,2176,1580],{"class":443},[410,2178,2179],{"class":1605}," 84532",[410,2181,1619],{"class":443},[410,2183,2185,2187,2189,2191,2193,2195],{"class":412,"line":2184},27,[410,2186,1602],{"class":443},[410,2188,1645],{"class":1605},[410,2190,672],{"class":443},[410,2192,1580],{"class":443},[410,2194,2179],{"class":1605},[410,2196,1619],{"class":443},[410,2198,2200,2202,2204,2206,2208,2210,2213,2215],{"class":412,"line":2199},28,[410,2201,1602],{"class":443},[410,2203,1661],{"class":1605},[410,2205,672],{"class":443},[410,2207,1580],{"class":443},[410,2209,1069],{"class":443},[410,2211,2212],{"class":420},"ethereum",[410,2214,672],{"class":443},[410,2216,1619],{"class":443},[410,2218,2220,2222,2224,2226,2228,2230,2232,2234,2236,2238,2240,2242,2244],{"class":412,"line":2219},29,[410,2221,1602],{"class":443},[410,2223,1751],{"class":1605},[410,2225,672],{"class":443},[410,2227,1580],{"class":443},[410,2229,1758],{"class":443},[410,2231,1069],{"class":443},[410,2233,1764],{"class":1763},[410,2235,672],{"class":443},[410,2237,1580],{"class":443},[410,2239,1069],{"class":443},[410,2241,609],{"class":420},[410,2243,672],{"class":443},[410,2245,1777],{"class":443},[410,2247,2249,2251,2253,2255,2257,2259,2261,2263,2265,2267,2269,2272,2274,2276,2278,2280,2282,2284,2286,2289,2291,2293,2295,2297,2299,2301,2304],{"class":412,"line":2248},30,[410,2250,1602],{"class":443},[410,2252,1813],{"class":1605},[410,2254,672],{"class":443},[410,2256,1580],{"class":443},[410,2258,1820],{"class":443},[410,2260,1069],{"class":443},[410,2262,1606],{"class":1763},[410,2264,672],{"class":443},[410,2266,1580],{"class":443},[410,2268,1069],{"class":443},[410,2270,2271],{"class":420},"Ether",[410,2273,672],{"class":443},[410,2275,1837],{"class":443},[410,2277,1069],{"class":443},[410,2279,1842],{"class":1763},[410,2281,672],{"class":443},[410,2283,1580],{"class":443},[410,2285,1069],{"class":443},[410,2287,2288],{"class":420},"ETH",[410,2290,672],{"class":443},[410,2292,1837],{"class":443},[410,2294,1069],{"class":443},[410,2296,1860],{"class":1763},[410,2298,672],{"class":443},[410,2300,1580],{"class":443},[410,2302,2303],{"class":1605}," 18",[410,2305,1887],{"class":443},[410,2307,2309,2311,2313,2315,2317,2319,2321,2323,2325,2327,2329,2331,2333,2335,2337,2339,2342,2344,2346,2348,2350,2352,2354],{"class":412,"line":2308},31,[410,2310,1602],{"class":443},[410,2312,1961],{"class":1605},[410,2314,672],{"class":443},[410,2316,1580],{"class":443},[410,2318,1820],{"class":443},[410,2320,1069],{"class":443},[410,2322,1972],{"class":1763},[410,2324,672],{"class":443},[410,2326,1580],{"class":443},[410,2328,1979],{"class":1605},[410,2330,1837],{"class":443},[410,2332,1069],{"class":443},[410,2334,1986],{"class":1763},[410,2336,672],{"class":443},[410,2338,1580],{"class":443},[410,2340,2341],{"class":1605}," 2",[410,2343,1837],{"class":443},[410,2345,1069],{"class":443},[410,2347,1999],{"class":1763},[410,2349,672],{"class":443},[410,2351,1580],{"class":443},[410,2353,1979],{"class":1605},[410,2355,1887],{"class":443},[410,2357,2359,2361,2363,2365,2367,2369,2371,2373,2375,2377,2380,2382,2384,2386,2388,2390,2393],{"class":412,"line":2358},32,[410,2360,1602],{"class":443},[410,2362,2014],{"class":1605},[410,2364,672],{"class":443},[410,2366,1580],{"class":443},[410,2368,1820],{"class":443},[410,2370,1069],{"class":443},[410,2372,2025],{"class":1763},[410,2374,672],{"class":443},[410,2376,1580],{"class":443},[410,2378,2379],{"class":1605}," 39040037",[410,2381,1837],{"class":443},[410,2383,1069],{"class":443},[410,2385,2039],{"class":1763},[410,2387,672],{"class":443},[410,2389,1580],{"class":443},[410,2391,2392],{"class":1605}," 999",[410,2394,1887],{"class":443},[410,2396,2398,2400,2402,2404,2406,2408,2410,2412],{"class":412,"line":2397},33,[410,2399,1602],{"class":443},[410,2401,2056],{"class":1605},[410,2403,672],{"class":443},[410,2405,1580],{"class":443},[410,2407,1069],{"class":443},[410,2409,378],{"class":420},[410,2411,672],{"class":443},[410,2413,1619],{"class":443},[410,2415,2417,2419,2421,2423,2425,2427,2430,2432],{"class":412,"line":2416},34,[410,2418,1602],{"class":443},[410,2420,2076],{"class":1605},[410,2422,672],{"class":443},[410,2424,1580],{"class":443},[410,2426,1069],{"class":443},[410,2428,2429],{"class":420},"0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9",[410,2431,672],{"class":443},[410,2433,1619],{"class":443},[410,2435,2437,2439,2441,2443,2445,2447,2450,2452],{"class":412,"line":2436},35,[410,2438,1602],{"class":443},[410,2440,2096],{"class":1605},[410,2442,672],{"class":443},[410,2444,1580],{"class":443},[410,2446,1069],{"class":443},[410,2448,2449],{"class":420},"0x86fb9F1c124fB20ff130C41a79a432F770f67AFD",[410,2451,672],{"class":443},[410,2453,1619],{"class":443},[410,2455,2457,2459,2461,2463,2465,2467,2470],{"class":412,"line":2456},36,[410,2458,1602],{"class":443},[410,2460,2116],{"class":1605},[410,2462,672],{"class":443},[410,2464,1580],{"class":443},[410,2466,1069],{"class":443},[410,2468,2469],{"class":420},"0x28B02B97a850872C4D33C3E024fab6499ad96564",[410,2471,677],{"class":443},[410,2473,2475],{"class":412,"line":2474},37,[410,2476,2477],{"class":443},"    }\n",[410,2479,2481],{"class":412,"line":2480},38,[410,2482,2483],{"class":443},"  }\n",[410,2485,2487],{"class":412,"line":2486},39,[410,2488,2489],{"class":443},"}\n",[1107,2491,2493,2494,2497,2498,606,2501,2504,2505,2508,2509,2516,2517,2520,2521,148,2524,639,2527,2529],{"title":2492},"index.from: usa un valore recente, NON 1","Il validator Cosmos costruisce il merkle tree ",[141,2495,2496],{},"dallo stato della chain (gRPC)",", non rigiocando tutti i blocchi: con ",[145,2499,2500],{},"bitsong.index.from",[141,2502,2503],{},"recente"," (es. altezza attuale − qualche migliaio) l'albero è comunque corretto. Con ",[145,2506,2507],{},"index.from: 1"," su una chain a milioni di blocchi, più agenti scansionano l'intera storia ed ",[141,2510,2511,2512,2515],{},"esauriscono ",[145,2513,2514],{},"max_open_connections"," dell'RPC CometBFT"," (il nodo smette di rispondere in HTTP). Tieni ",[145,2518,2519],{},"bitsong.index.chunk"," ~",[145,2522,2523],{},"500",[145,2525,2526],{},"basesepolia.index.chunk",[145,2528,642],{}," (limite CDP).",[559,2531,2533],{"id":2532},"avvia-i-due-validator-per-ciascun-validator-del-multisig","Avvia i due validator (per ciascun validator del multisig)",[400,2535,2537],{"className":402,"code":2536,"filename":655,"language":405,"meta":406,"style":406},"docker pull --platform linux\u002Famd64 $HYPERLANE_IMAGE\n# file ambiente: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, COSMOS_SIGNER_KEY, S3_BUCKET\n",[145,2538,2539,2556],{"__ignoreMap":406},[410,2540,2541,2544,2547,2550,2553],{"class":412,"line":413},[410,2542,2543],{"class":416},"docker",[410,2545,2546],{"class":420}," pull",[410,2548,2549],{"class":420}," --platform",[410,2551,2552],{"class":420}," linux\u002Famd64",[410,2554,2555],{"class":439}," $HYPERLANE_IMAGE\n",[410,2557,2558],{"class":412,"line":459},[410,2559,2560],{"class":743},"# file ambiente: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, COSMOS_SIGNER_KEY, S3_BUCKET\n",[2562,2563,2564,2790],"code-group",{},[400,2565,2568],{"className":402,"code":2566,"filename":2567,"language":405,"meta":406,"style":406},"docker run -d \\\n  --name hl-val1-bitsong --restart unless-stopped --network host \\\n  --user 0:0 --ulimit nofile=65536:65536 \\\n  --env-file $HOME\u002Fhl\u002Fagent.env \\\n  -e CONFIG_FILES=\u002Fconfig\u002Fagent-config.json \\\n  -v $HOME\u002Fhl\u002Fconfig\u002Fagent-config.json:\u002Fconfig\u002Fagent-config.json:ro \\\n  -v $HOME\u002Fhl\u002Fdb\u002Fval1-bitsong:\u002Fhyperlane_db \\\n  $HYPERLANE_IMAGE .\u002Fvalidator \\\n  --db \u002Fhyperlane_db --originChainName bitsong --reorgPeriod 1 --interval 10 \\\n  --validator.type aws --validator.region $AWS_REGION --validator.id alias\u002Fhl-validator-1 \\\n  --chains.bitsong.signer.type cosmosKey --chains.bitsong.signer.key $COSMOS_SIGNER_KEY --chains.bitsong.signer.prefix bitsong \\\n  --checkpointSyncer.type s3 --checkpointSyncer.bucket $S3_BUCKET --checkpointSyncer.region $AWS_REGION --checkpointSyncer.folder bitsong-val1 \\\n  --metrics-port 9101 --log.format json --log.level info\n","Validator BitSong (origin BitSong)",[145,2569,2570,2582,2604,2620,2632,2642,2654,2665,2675,2702,2723,2744,2771],{"__ignoreMap":406},[410,2571,2572,2574,2577,2580],{"class":412,"line":413},[410,2573,2543],{"class":416},[410,2575,2576],{"class":420}," run",[410,2578,2579],{"class":420}," -d",[410,2581,1032],{"class":439},[410,2583,2584,2587,2590,2593,2596,2599,2602],{"class":412,"line":459},[410,2585,2586],{"class":420},"  --name",[410,2588,2589],{"class":420}," hl-val1-bitsong",[410,2591,2592],{"class":420}," --restart",[410,2594,2595],{"class":420}," unless-stopped",[410,2597,2598],{"class":420}," --network",[410,2600,2601],{"class":420}," host",[410,2603,1032],{"class":439},[410,2605,2606,2609,2612,2615,2618],{"class":412,"line":493},[410,2607,2608],{"class":420},"  --user",[410,2610,2611],{"class":420}," 0:0",[410,2613,2614],{"class":420}," --ulimit",[410,2616,2617],{"class":420}," nofile=65536:65536",[410,2619,1032],{"class":439},[410,2621,2622,2625,2627,2630],{"class":412,"line":526},[410,2623,2624],{"class":420},"  --env-file",[410,2626,1552],{"class":439},[410,2628,2629],{"class":420},"\u002Fhl\u002Fagent.env",[410,2631,1032],{"class":439},[410,2633,2634,2637,2640],{"class":412,"line":726},[410,2635,2636],{"class":420},"  -e",[410,2638,2639],{"class":420}," CONFIG_FILES=\u002Fconfig\u002Fagent-config.json",[410,2641,1032],{"class":439},[410,2643,2644,2647,2649,2652],{"class":412,"line":747},[410,2645,2646],{"class":420},"  -v",[410,2648,1552],{"class":439},[410,2650,2651],{"class":420},"\u002Fhl\u002Fconfig\u002Fagent-config.json:\u002Fconfig\u002Fagent-config.json:ro",[410,2653,1032],{"class":439},[410,2655,2656,2658,2660,2663],{"class":412,"line":763},[410,2657,2646],{"class":420},[410,2659,1552],{"class":439},[410,2661,2662],{"class":420},"\u002Fhl\u002Fdb\u002Fval1-bitsong:\u002Fhyperlane_db",[410,2664,1032],{"class":439},[410,2666,2667,2670,2673],{"class":412,"line":780},[410,2668,2669],{"class":439},"  $HYPERLANE_IMAGE ",[410,2671,2672],{"class":420},".\u002Fvalidator",[410,2674,1032],{"class":439},[410,2676,2677,2680,2683,2686,2689,2692,2694,2697,2700],{"class":412,"line":787},[410,2678,2679],{"class":420},"  --db",[410,2681,2682],{"class":420}," \u002Fhyperlane_db",[410,2684,2685],{"class":420}," --originChainName",[410,2687,2688],{"class":420}," bitsong",[410,2690,2691],{"class":420}," --reorgPeriod",[410,2693,1979],{"class":1605},[410,2695,2696],{"class":420}," --interval",[410,2698,2699],{"class":1605}," 10",[410,2701,1032],{"class":439},[410,2703,2704,2707,2710,2713,2716,2719,2721],{"class":412,"line":793},[410,2705,2706],{"class":420},"  --validator.type",[410,2708,2709],{"class":420}," aws",[410,2711,2712],{"class":420}," --validator.region",[410,2714,2715],{"class":439}," $AWS_REGION ",[410,2717,2718],{"class":420},"--validator.id",[410,2720,1063],{"class":420},[410,2722,1032],{"class":439},[410,2724,2725,2728,2731,2734,2737,2740,2742],{"class":412,"line":809},[410,2726,2727],{"class":420},"  --chains.bitsong.signer.type",[410,2729,2730],{"class":420}," cosmosKey",[410,2732,2733],{"class":420}," --chains.bitsong.signer.key",[410,2735,2736],{"class":439}," $COSMOS_SIGNER_KEY ",[410,2738,2739],{"class":420},"--chains.bitsong.signer.prefix",[410,2741,2688],{"class":420},[410,2743,1032],{"class":439},[410,2745,2746,2749,2752,2755,2758,2761,2763,2766,2769],{"class":412,"line":825},[410,2747,2748],{"class":420},"  --checkpointSyncer.type",[410,2750,2751],{"class":420}," s3",[410,2753,2754],{"class":420}," --checkpointSyncer.bucket",[410,2756,2757],{"class":439}," $S3_BUCKET ",[410,2759,2760],{"class":420},"--checkpointSyncer.region",[410,2762,2715],{"class":439},[410,2764,2765],{"class":420},"--checkpointSyncer.folder",[410,2767,2768],{"class":420}," bitsong-val1",[410,2770,1032],{"class":439},[410,2772,2773,2776,2779,2782,2784,2787],{"class":412,"line":841},[410,2774,2775],{"class":420},"  --metrics-port",[410,2777,2778],{"class":1605}," 9101",[410,2780,2781],{"class":420}," --log.format",[410,2783,433],{"class":420},[410,2785,2786],{"class":420}," --log.level",[410,2788,2789],{"class":420}," info\n",[400,2791,2794],{"className":402,"code":2792,"filename":2793,"language":405,"meta":406,"style":406},"docker run -d \\\n  --name hl-val1-basesepolia --restart unless-stopped --network host \\\n  --user 0:0 --ulimit nofile=65536:65536 \\\n  --env-file $HOME\u002Fhl\u002Fagent.env \\\n  -e CONFIG_FILES=\u002Fconfig\u002Fagent-config.json \\\n  -v $HOME\u002Fhl\u002Fconfig\u002Fagent-config.json:\u002Fconfig\u002Fagent-config.json:ro \\\n  -v $HOME\u002Fhl\u002Fdb\u002Fval1-basesepolia:\u002Fhyperlane_db \\\n  $HYPERLANE_IMAGE .\u002Fvalidator \\\n  --db \u002Fhyperlane_db --originChainName basesepolia --reorgPeriod 1 --interval 10 \\\n  --validator.type aws --validator.region $AWS_REGION --validator.id alias\u002Fhl-validator-1 \\\n  --chains.basesepolia.signer.type aws --chains.basesepolia.signer.region $AWS_REGION --chains.basesepolia.signer.id alias\u002Fhl-validator-1 \\\n  --checkpointSyncer.type s3 --checkpointSyncer.bucket $S3_BUCKET --checkpointSyncer.region $AWS_REGION --checkpointSyncer.folder basesepolia-val1 \\\n  --metrics-port 9201 --log.format json --log.level info\n","Validator Base Sepolia (origin Base Sepolia)",[145,2795,2796,2806,2823,2835,2845,2853,2863,2874,2882,2903,2919,2938,2959],{"__ignoreMap":406},[410,2797,2798,2800,2802,2804],{"class":412,"line":413},[410,2799,2543],{"class":416},[410,2801,2576],{"class":420},[410,2803,2579],{"class":420},[410,2805,1032],{"class":439},[410,2807,2808,2810,2813,2815,2817,2819,2821],{"class":412,"line":459},[410,2809,2586],{"class":420},[410,2811,2812],{"class":420}," hl-val1-basesepolia",[410,2814,2592],{"class":420},[410,2816,2595],{"class":420},[410,2818,2598],{"class":420},[410,2820,2601],{"class":420},[410,2822,1032],{"class":439},[410,2824,2825,2827,2829,2831,2833],{"class":412,"line":493},[410,2826,2608],{"class":420},[410,2828,2611],{"class":420},[410,2830,2614],{"class":420},[410,2832,2617],{"class":420},[410,2834,1032],{"class":439},[410,2836,2837,2839,2841,2843],{"class":412,"line":526},[410,2838,2624],{"class":420},[410,2840,1552],{"class":439},[410,2842,2629],{"class":420},[410,2844,1032],{"class":439},[410,2846,2847,2849,2851],{"class":412,"line":726},[410,2848,2636],{"class":420},[410,2850,2639],{"class":420},[410,2852,1032],{"class":439},[410,2854,2855,2857,2859,2861],{"class":412,"line":747},[410,2856,2646],{"class":420},[410,2858,1552],{"class":439},[410,2860,2651],{"class":420},[410,2862,1032],{"class":439},[410,2864,2865,2867,2869,2872],{"class":412,"line":763},[410,2866,2646],{"class":420},[410,2868,1552],{"class":439},[410,2870,2871],{"class":420},"\u002Fhl\u002Fdb\u002Fval1-basesepolia:\u002Fhyperlane_db",[410,2873,1032],{"class":439},[410,2875,2876,2878,2880],{"class":412,"line":780},[410,2877,2669],{"class":439},[410,2879,2672],{"class":420},[410,2881,1032],{"class":439},[410,2883,2884,2886,2888,2890,2893,2895,2897,2899,2901],{"class":412,"line":787},[410,2885,2679],{"class":420},[410,2887,2682],{"class":420},[410,2889,2685],{"class":420},[410,2891,2892],{"class":420}," basesepolia",[410,2894,2691],{"class":420},[410,2896,1979],{"class":1605},[410,2898,2696],{"class":420},[410,2900,2699],{"class":1605},[410,2902,1032],{"class":439},[410,2904,2905,2907,2909,2911,2913,2915,2917],{"class":412,"line":793},[410,2906,2706],{"class":420},[410,2908,2709],{"class":420},[410,2910,2712],{"class":420},[410,2912,2715],{"class":439},[410,2914,2718],{"class":420},[410,2916,1063],{"class":420},[410,2918,1032],{"class":439},[410,2920,2921,2924,2926,2929,2931,2934,2936],{"class":412,"line":809},[410,2922,2923],{"class":420},"  --chains.basesepolia.signer.type",[410,2925,2709],{"class":420},[410,2927,2928],{"class":420}," --chains.basesepolia.signer.region",[410,2930,2715],{"class":439},[410,2932,2933],{"class":420},"--chains.basesepolia.signer.id",[410,2935,1063],{"class":420},[410,2937,1032],{"class":439},[410,2939,2940,2942,2944,2946,2948,2950,2952,2954,2957],{"class":412,"line":825},[410,2941,2748],{"class":420},[410,2943,2751],{"class":420},[410,2945,2754],{"class":420},[410,2947,2757],{"class":439},[410,2949,2760],{"class":420},[410,2951,2715],{"class":439},[410,2953,2765],{"class":420},[410,2955,2956],{"class":420}," basesepolia-val1",[410,2958,1032],{"class":439},[410,2960,2961,2963,2966,2968,2970,2972],{"class":412,"line":841},[410,2962,2775],{"class":420},[410,2964,2965],{"class":1605}," 9201",[410,2967,2781],{"class":420},[410,2969,433],{"class":420},[410,2971,2786],{"class":420},[410,2973,2789],{"class":420},[230,2975,2976,2993,3003],{},[157,2977,2978,2979,2981,2982,2985,2986,2989,2990,2992],{},"Il validator ",[141,2980,572],{}," usa sempre ",[145,2983,2984],{},"cosmosKey"," per il signer della chain (firma l'announce on-chain); la firma dei ",[141,2987,2988],{},"checkpoint"," usa ",[145,2991,979],{}," (KMS).",[157,2994,2978,2995,2989,2997,2999,3000,3002],{},[141,2996,151],{},[145,2998,979],{}," sia per il checkpoint sia per il signer della chain. Finanzia il suo indirizzo EVM (derivato da KMS) con ",[141,3001,290],{}," prima di avviarlo.",[157,3004,3005,3008,3009,3012,3013,3008,3016,256],{},[145,3006,3007],{},"--user 0:0"," evita ",[145,3010,3011],{},"Permission denied"," sui volumi db; ",[145,3014,3015],{},"--ulimit nofile",[145,3017,3018],{},"Too many open files",[559,3020,3022],{"id":3021},"verifica-lannouncement-e-i-checkpoint","Verifica l'announcement e i checkpoint",[400,3024,3026],{"className":402,"code":3025,"filename":655,"language":405,"meta":406,"style":406},"# Announce BitSong (fino a ~2 min) — VALIDATOR_ADDR = indirizzo KMS del validator\nbitsongd query hyperlane ism announced-storage-locations \\\n  $MAILBOX_ID $(echo $VALIDATOR_ADDR | tr '[:upper:]' '[:lower:]') --output json --node $NODE | jq '.storage_locations'\n\n# Announce Base Sepolia\ncast call 0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9 \\\n  \"getAnnouncedStorageLocations(address[])(string[][])\" \"[$VALIDATOR_ADDR]\" --rpc-url $EVM_RPC\n\n# Checkpoint scritti su S3 (compaiono quando passa un nuovo messaggio)\naws s3 ls --recursive s3:\u002F\u002F$S3_BUCKET\u002Fbitsong-val1\u002F | grep checkpoint\n",[145,3027,3028,3033,3048,3104,3108,3113,3125,3153,3157,3162],{"__ignoreMap":406},[410,3029,3030],{"class":412,"line":413},[410,3031,3032],{"class":743},"# Announce BitSong (fino a ~2 min) — VALIDATOR_ADDR = indirizzo KMS del validator\n",[410,3034,3035,3037,3039,3041,3043,3046],{"class":412,"line":459},[410,3036,417],{"class":416},[410,3038,421],{"class":420},[410,3040,424],{"class":420},[410,3042,535],{"class":420},[410,3044,3045],{"class":420}," announced-storage-locations",[410,3047,1032],{"class":439},[410,3049,3050,3053,3055,3059,3062,3064,3067,3069,3072,3075,3077,3080,3082,3085,3087,3089,3091,3093,3095,3097,3099,3102],{"class":412,"line":493},[410,3051,3052],{"class":439},"  $MAILBOX_ID ",[410,3054,1483],{"class":443},[410,3056,3058],{"class":3057},"s2Zo4","echo",[410,3060,3061],{"class":439}," $VALIDATOR_ADDR ",[410,3063,444],{"class":443},[410,3065,3066],{"class":416}," tr",[410,3068,450],{"class":443},[410,3070,3071],{"class":420},"[:upper:]",[410,3073,3074],{"class":443},"'",[410,3076,450],{"class":443},[410,3078,3079],{"class":420},"[:lower:]",[410,3081,3074],{"class":443},[410,3083,3084],{"class":443},")",[410,3086,430],{"class":420},[410,3088,433],{"class":420},[410,3090,436],{"class":420},[410,3092,440],{"class":439},[410,3094,444],{"class":443},[410,3096,447],{"class":416},[410,3098,450],{"class":443},[410,3100,3101],{"class":420},".storage_locations",[410,3103,456],{"class":443},[410,3105,3106],{"class":412,"line":526},[410,3107,784],{"emptyLinePlaceholder":783},[410,3109,3110],{"class":412,"line":726},[410,3111,3112],{"class":743},"# Announce Base Sepolia\n",[410,3114,3115,3117,3120,3123],{"class":412,"line":747},[410,3116,248],{"class":416},[410,3118,3119],{"class":420}," call",[410,3121,3122],{"class":1605}," 0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9",[410,3124,1032],{"class":439},[410,3126,3127,3129,3132,3134,3136,3139,3142,3145,3147,3150],{"class":412,"line":763},[410,3128,1420],{"class":443},[410,3130,3131],{"class":420},"getAnnouncedStorageLocations(address[])(string[][])",[410,3133,672],{"class":443},[410,3135,1069],{"class":443},[410,3137,3138],{"class":420},"[",[410,3140,3141],{"class":439},"$VALIDATOR_ADDR",[410,3143,3144],{"class":420},"]",[410,3146,672],{"class":443},[410,3148,3149],{"class":420}," --rpc-url",[410,3151,3152],{"class":439}," $EVM_RPC\n",[410,3154,3155],{"class":412,"line":780},[410,3156,784],{"emptyLinePlaceholder":783},[410,3158,3159],{"class":412,"line":787},[410,3160,3161],{"class":743},"# Checkpoint scritti su S3 (compaiono quando passa un nuovo messaggio)\n",[410,3163,3164,3166,3168,3171,3174,3177,3179,3182,3184,3187],{"class":412,"line":793},[410,3165,979],{"class":416},[410,3167,2751],{"class":420},[410,3169,3170],{"class":420}," ls",[410,3172,3173],{"class":420}," --recursive",[410,3175,3176],{"class":420}," s3:\u002F\u002F",[410,3178,1201],{"class":439},[410,3180,3181],{"class":420},"\u002Fbitsong-val1\u002F",[410,3183,1509],{"class":443},[410,3185,3186],{"class":416}," grep",[410,3188,3189],{"class":420}," checkpoint\n",[918,3191],{},[225,3193,3195],{"id":3194},"_2-relayer","2. Relayer",[137,3197,3198,3199,3202,3203,3206,3207,3209],{},"Il relayer legge i checkpoint firmati (da S3) e ",[141,3200,3201],{},"consegna i messaggi in entrambe le direzioni",". Ne basta ",[141,3204,3205],{},"uno",". Usa una chiave ",[141,3208,265],{}," dedicata per Base Sepolia e la stessa chiave Cosmos per BitSong.",[1140,3211,3212,3213,3215],{},"Finanzia l'indirizzo EVM del relayer (KMS) con ",[141,3214,290],{}," (gas di consegna).",[400,3217,3219],{"className":402,"code":3218,"filename":655,"language":405,"meta":406,"style":406},"docker run -d \\\n  --name hl-relayer --restart unless-stopped --network host \\\n  --user 0:0 --ulimit nofile=65536:65536 \\\n  --env-file $HOME\u002Fhl\u002Fagent.env \\\n  -e CONFIG_FILES=\u002Fconfig\u002Fagent-config.json \\\n  -v $HOME\u002Fhl\u002Fconfig\u002Fagent-config.json:\u002Fconfig\u002Fagent-config.json:ro \\\n  -v $HOME\u002Fhl\u002Fdb\u002Frelayer:\u002Fhyperlane_db \\\n  $HYPERLANE_IMAGE .\u002Frelayer \\\n  --db \u002Fhyperlane_db --relayChains bitsong,basesepolia \\\n  --gasPaymentEnforcement '[{\"type\":\"none\"}]' \\\n  --chains.bitsong.signer.type cosmosKey --chains.bitsong.signer.key $COSMOS_SIGNER_KEY --chains.bitsong.signer.prefix bitsong \\\n  --chains.basesepolia.signer.type aws --chains.basesepolia.signer.region $AWS_REGION --chains.basesepolia.signer.id alias\u002Fhl-relayer \\\n  --metrics-port 9301 --log.format json --log.level info\n",[145,3220,3221,3231,3248,3260,3270,3278,3288,3299,3308,3322,3336,3352,3369],{"__ignoreMap":406},[410,3222,3223,3225,3227,3229],{"class":412,"line":413},[410,3224,2543],{"class":416},[410,3226,2576],{"class":420},[410,3228,2579],{"class":420},[410,3230,1032],{"class":439},[410,3232,3233,3235,3238,3240,3242,3244,3246],{"class":412,"line":459},[410,3234,2586],{"class":420},[410,3236,3237],{"class":420}," hl-relayer",[410,3239,2592],{"class":420},[410,3241,2595],{"class":420},[410,3243,2598],{"class":420},[410,3245,2601],{"class":420},[410,3247,1032],{"class":439},[410,3249,3250,3252,3254,3256,3258],{"class":412,"line":493},[410,3251,2608],{"class":420},[410,3253,2611],{"class":420},[410,3255,2614],{"class":420},[410,3257,2617],{"class":420},[410,3259,1032],{"class":439},[410,3261,3262,3264,3266,3268],{"class":412,"line":526},[410,3263,2624],{"class":420},[410,3265,1552],{"class":439},[410,3267,2629],{"class":420},[410,3269,1032],{"class":439},[410,3271,3272,3274,3276],{"class":412,"line":726},[410,3273,2636],{"class":420},[410,3275,2639],{"class":420},[410,3277,1032],{"class":439},[410,3279,3280,3282,3284,3286],{"class":412,"line":747},[410,3281,2646],{"class":420},[410,3283,1552],{"class":439},[410,3285,2651],{"class":420},[410,3287,1032],{"class":439},[410,3289,3290,3292,3294,3297],{"class":412,"line":763},[410,3291,2646],{"class":420},[410,3293,1552],{"class":439},[410,3295,3296],{"class":420},"\u002Fhl\u002Fdb\u002Frelayer:\u002Fhyperlane_db",[410,3298,1032],{"class":439},[410,3300,3301,3303,3306],{"class":412,"line":780},[410,3302,2669],{"class":439},[410,3304,3305],{"class":420},".\u002Frelayer",[410,3307,1032],{"class":439},[410,3309,3310,3312,3314,3317,3320],{"class":412,"line":787},[410,3311,2679],{"class":420},[410,3313,2682],{"class":420},[410,3315,3316],{"class":420}," --relayChains",[410,3318,3319],{"class":420}," bitsong,basesepolia",[410,3321,1032],{"class":439},[410,3323,3324,3327,3329,3332,3334],{"class":412,"line":793},[410,3325,3326],{"class":420},"  --gasPaymentEnforcement",[410,3328,450],{"class":443},[410,3330,3331],{"class":420},"[{\"type\":\"none\"}]",[410,3333,3074],{"class":443},[410,3335,1032],{"class":439},[410,3337,3338,3340,3342,3344,3346,3348,3350],{"class":412,"line":809},[410,3339,2727],{"class":420},[410,3341,2730],{"class":420},[410,3343,2733],{"class":420},[410,3345,2736],{"class":439},[410,3347,2739],{"class":420},[410,3349,2688],{"class":420},[410,3351,1032],{"class":439},[410,3353,3354,3356,3358,3360,3362,3364,3367],{"class":412,"line":825},[410,3355,2923],{"class":420},[410,3357,2709],{"class":420},[410,3359,2928],{"class":420},[410,3361,2715],{"class":439},[410,3363,2933],{"class":420},[410,3365,3366],{"class":420}," alias\u002Fhl-relayer",[410,3368,1032],{"class":439},[410,3370,3371,3373,3376,3378,3380,3382],{"class":412,"line":841},[410,3372,2775],{"class":420},[410,3374,3375],{"class":1605}," 9301",[410,3377,2781],{"class":420},[410,3379,433],{"class":420},[410,3381,2786],{"class":420},[410,3383,2789],{"class":420},[230,3385,3386,3402],{},[157,3387,3388,3389,3391,3392,3394,3395,3398,3399,3401],{},"Con i checkpoint su ",[141,3390,965],{}," il relayer li legge dall'URL annunciato — ",[141,3393,596],{}," serve ",[145,3396,3397],{},"--allowLocalCheckpointSyncers"," (è solo per ",[145,3400,953],{},").",[157,3403,3404,3407],{},[145,3405,3406],{},"--gasPaymentEnforcement '[{\"type\":\"none\"}]'"," disabilita l'enforcement del gas (solo testnet).",[400,3409,3412],{"className":402,"code":3410,"filename":3411,"language":405,"meta":406,"style":406},"docker logs -f --tail 100 hl-relayer\n","Verifica",[145,3413,3414],{"__ignoreMap":406},[410,3415,3416,3418,3421,3424,3427,3430],{"class":412,"line":413},[410,3417,2543],{"class":416},[410,3419,3420],{"class":420}," logs",[410,3422,3423],{"class":420}," -f",[410,3425,3426],{"class":420}," --tail",[410,3428,3429],{"class":1605}," 100",[410,3431,3432],{"class":420}," hl-relayer\n",[201,3434,3436,3442],{"title":3435},"Whitelist (opzionale)",[137,3437,3438,3439,3441],{},"Per consegnare ",[141,3440,961],{}," i messaggi del tuo warp token:",[400,3443,3445],{"className":402,"code":3444,"filename":655,"language":405,"meta":406,"style":406},"EVM_PADDED=$(printf \"0x%064s\" \"${HYP_ERC20_ADDR#0x}\" | tr ' ' '0')\n--whitelist \"[{\\\"senderAddress\\\":\\\"$TOKEN_ID\\\",\\\"destinationDomain\\\":\\\"$REMOTE_DOMAIN\\\"},{\\\"senderAddress\\\":\\\"$EVM_PADDED\\\",\\\"destinationDomain\\\":\\\"$DOMAIN_ID\\\"}]\"\n",[145,3446,3447,3495],{"__ignoreMap":406},[410,3448,3449,3452,3454,3457,3459,3462,3464,3467,3470,3473,3475,3478,3480,3482,3484,3486,3488,3491,3493],{"class":412,"line":413},[410,3450,3451],{"class":439},"EVM_PADDED",[410,3453,1009],{"class":443},[410,3455,3456],{"class":3057},"printf",[410,3458,1069],{"class":443},[410,3460,3461],{"class":420},"0x%064s",[410,3463,672],{"class":443},[410,3465,3466],{"class":443}," \"${",[410,3468,3469],{"class":439},"HYP_ERC20_ADDR",[410,3471,3472],{"class":443},"#",[410,3474,1480],{"class":439},[410,3476,3477],{"class":443},"}\"",[410,3479,1509],{"class":443},[410,3481,3066],{"class":416},[410,3483,450],{"class":443},[410,3485,450],{"class":443},[410,3487,450],{"class":443},[410,3489,3490],{"class":420},"0",[410,3492,3074],{"class":443},[410,3494,1048],{"class":443},[410,3496,3497,3500,3502,3505,3508,3511,3513,3515,3518,3520,3522,3525,3527,3529,3532,3535,3537,3539,3541,3543,3546,3548,3550,3552,3554,3556,3559,3562],{"class":412,"line":459},[410,3498,3499],{"class":416},"--whitelist",[410,3501,1069],{"class":443},[410,3503,3504],{"class":420},"[{",[410,3506,3507],{"class":439},"\\\"",[410,3509,3510],{"class":420},"senderAddress",[410,3512,3507],{"class":439},[410,3514,1580],{"class":420},[410,3516,3517],{"class":439},"\\\"$TOKEN_ID\\\"",[410,3519,1837],{"class":420},[410,3521,3507],{"class":439},[410,3523,3524],{"class":420},"destinationDomain",[410,3526,3507],{"class":439},[410,3528,1580],{"class":420},[410,3530,3531],{"class":439},"\\\"$REMOTE_DOMAIN\\\"",[410,3533,3534],{"class":420},"},{",[410,3536,3507],{"class":439},[410,3538,3510],{"class":420},[410,3540,3507],{"class":439},[410,3542,1580],{"class":420},[410,3544,3545],{"class":439},"\\\"$EVM_PADDED\\\"",[410,3547,1837],{"class":420},[410,3549,3507],{"class":439},[410,3551,3524],{"class":420},[410,3553,3507],{"class":439},[410,3555,1580],{"class":420},[410,3557,3558],{"class":439},"\\\"$DOMAIN_ID\\\"",[410,3560,3561],{"class":420},"}]",[410,3563,677],{"class":443},[918,3565],{},[225,3567,3569],{"id":3568},"_3-creare-un-nuovo-multisig-23","3. Creare un nuovo multisig 2\u002F3",[137,3571,3572,3573,3576,3577,3580],{},"Su Hyperlane il ",[141,3574,3575],{},"MultisigISM è immutabile",": se ne crea uno ",[141,3578,3579],{},"nuovo"," con la lista aggiornata di validator e la soglia, poi si ripunta la rotta del RoutingISM (operazioni 4 e 5).",[384,3582,3584,3585,3587,3588,3401],{"title":3583},"Richiede la chiave owner","Le operazioni 3-5 vanno firmate con la ",[141,3586,297],{}," del bridge (",[145,3589,3590],{},"--from \u003Cowner-key>",[137,3592,3593,3594,3597,3598,3601,3602,256],{},"Raccogli i ",[141,3595,3596],{},"3 indirizzi EVM"," dei validator (derivati da KMS in ",[160,3599,3600],{"href":162},"sezione 1",") e crea il MultisigISM con ",[141,3603,3604],{},"soglia 2 su 3",[384,3606,3608,3611,3612,3615,3616,3619,3620,3623,3624,3623,3627,256],{"title":3607},"Gli indirizzi devono essere ordinati",[145,3609,3610],{},"create-message-id-multisig"," richiede la lista di validator ",[141,3613,3614],{},"ordinata in modo crescente"," per valore di byte (esadecimale, case-insensitive), altrimenti fallisce con ",[145,3617,3618],{},"validator addresses are not sorted correctly in ascending order",". Es.: ",[145,3621,3622],{},"0x45ac…"," \u003C ",[145,3625,3626],{},"0x740b…",[145,3628,3629],{},"0xdb4e…",[400,3631,3634],{"className":402,"code":3632,"filename":3633,"language":405,"meta":406,"style":406},"# Ordina V1,V2,V3 in modo crescente (per byte) prima di creare l'ISM\nexport V1=\"0x\u003Caddr-piu-basso>\"; export V2=\"0x\u003Caddr-medio>\"; export V3=\"0x\u003Caddr-piu-alto>\"\n\n# Nota: con --gas auto il binario stampa \"gas estimate: N\" prima del JSON → estrai il txhash così\nTX_HASH=$(bitsongd tx hyperlane ism create-message-id-multisig \"$V1,$V2,$V3\" 2 \\\n    --from \u003Cowner-key> --keyring-backend test --chain-id $CHAIN_ID --node $NODE \\\n    --gas auto --gas-adjustment 1.5 --fees 10000${DENOM} --output json -y 2>&1 \\\n    | grep -o '\"txhash\":\"[A-Fa-f0-9]*\"' | head -1 | cut -d'\"' -f4)\necho \"TX: $TX_HASH\"\n\nNEW_ISM_ID=$(bitsongd query tx $TX_HASH --output json --node $NODE | \\\n  jq -r 'first(.events[] | select(.type | test(\"MultisigIsm\")) | .attributes[] | select(.key==\"ism_id\") | .value | fromjson)')\necho \"Nuovo MultisigISM (2\u002F3): $NEW_ISM_ID\"\n","Owner — Terminal",[145,3635,3636,3641,3690,3694,3699,3739,3772,3812,3853,3867,3871,3900,3917],{"__ignoreMap":406},[410,3637,3638],{"class":412,"line":413},[410,3639,3640],{"class":743},"# Ordina V1,V2,V3 in modo crescente (per byte) prima di creare l'ISM\n",[410,3642,3643,3645,3648,3650,3652,3655,3657,3660,3662,3665,3667,3669,3672,3674,3676,3678,3681,3683,3685,3688],{"class":412,"line":459},[410,3644,663],{"class":662},[410,3646,3647],{"class":439}," V1",[410,3649,669],{"class":443},[410,3651,672],{"class":443},[410,3653,3654],{"class":420},"0x\u003Caddr-piu-basso>",[410,3656,672],{"class":443},[410,3658,3659],{"class":443},";",[410,3661,1490],{"class":662},[410,3663,3664],{"class":439}," V2",[410,3666,669],{"class":443},[410,3668,672],{"class":443},[410,3670,3671],{"class":420},"0x\u003Caddr-medio>",[410,3673,672],{"class":443},[410,3675,3659],{"class":443},[410,3677,1490],{"class":662},[410,3679,3680],{"class":439}," V3",[410,3682,669],{"class":443},[410,3684,672],{"class":443},[410,3686,3687],{"class":420},"0x\u003Caddr-piu-alto>",[410,3689,677],{"class":443},[410,3691,3692],{"class":412,"line":493},[410,3693,784],{"emptyLinePlaceholder":783},[410,3695,3696],{"class":412,"line":526},[410,3697,3698],{"class":743},"# Nota: con --gas auto il binario stampa \"gas estimate: N\" prima del JSON → estrai il txhash così\n",[410,3700,3701,3704,3706,3708,3711,3713,3715,3718,3720,3723,3725,3728,3730,3733,3735,3737],{"class":412,"line":726},[410,3702,3703],{"class":439},"TX_HASH",[410,3705,1009],{"class":443},[410,3707,417],{"class":416},[410,3709,3710],{"class":420}," tx",[410,3712,424],{"class":420},[410,3714,535],{"class":420},[410,3716,3717],{"class":420}," create-message-id-multisig",[410,3719,1069],{"class":443},[410,3721,3722],{"class":439},"$V1",[410,3724,1837],{"class":420},[410,3726,3727],{"class":439},"$V2",[410,3729,1837],{"class":420},[410,3731,3732],{"class":439},"$V3",[410,3734,672],{"class":443},[410,3736,2341],{"class":1605},[410,3738,1032],{"class":439},[410,3740,3741,3744,3747,3750,3753,3756,3758,3760,3763,3766,3769],{"class":412,"line":747},[410,3742,3743],{"class":420},"    --from",[410,3745,3746],{"class":443}," \u003C",[410,3748,3749],{"class":420},"owner-ke",[410,3751,3752],{"class":439},"y",[410,3754,3755],{"class":443},">",[410,3757,1467],{"class":420},[410,3759,1503],{"class":420},[410,3761,3762],{"class":420}," --chain-id",[410,3764,3765],{"class":439}," $CHAIN_ID ",[410,3767,3768],{"class":420},"--node",[410,3770,3771],{"class":439}," $NODE \\\n",[410,3773,3774,3777,3780,3783,3786,3789,3792,3795,3798,3801,3803,3805,3808,3810],{"class":412,"line":763},[410,3775,3776],{"class":420},"    --gas",[410,3778,3779],{"class":420}," auto",[410,3781,3782],{"class":420}," --gas-adjustment",[410,3784,3785],{"class":1605}," 1.5",[410,3787,3788],{"class":420}," --fees",[410,3790,3791],{"class":1605}," 10000",[410,3793,3794],{"class":443},"${",[410,3796,3797],{"class":439},"DENOM",[410,3799,3800],{"class":443},"}",[410,3802,430],{"class":420},[410,3804,433],{"class":420},[410,3806,3807],{"class":420}," -y",[410,3809,1506],{"class":443},[410,3811,1032],{"class":439},[410,3813,3814,3817,3819,3821,3823,3826,3828,3830,3833,3835,3837,3840,3842,3844,3846,3848,3851],{"class":412,"line":780},[410,3815,3816],{"class":443},"    |",[410,3818,3186],{"class":416},[410,3820,1400],{"class":420},[410,3822,450],{"class":443},[410,3824,3825],{"class":420},"\"txhash\":\"[A-Fa-f0-9]*\"",[410,3827,3074],{"class":443},[410,3829,1509],{"class":443},[410,3831,3832],{"class":416}," head",[410,3834,1515],{"class":420},[410,3836,1509],{"class":443},[410,3838,3839],{"class":416}," cut",[410,3841,2579],{"class":420},[410,3843,3074],{"class":443},[410,3845,672],{"class":420},[410,3847,3074],{"class":443},[410,3849,3850],{"class":420}," -f4",[410,3852,1048],{"class":443},[410,3854,3855,3857,3859,3862,3865],{"class":412,"line":787},[410,3856,3058],{"class":3057},[410,3858,1069],{"class":443},[410,3860,3861],{"class":420},"TX: ",[410,3863,3864],{"class":439},"$TX_HASH",[410,3866,677],{"class":443},[410,3868,3869],{"class":412,"line":793},[410,3870,784],{"emptyLinePlaceholder":783},[410,3872,3873,3876,3878,3880,3882,3884,3887,3890,3892,3894,3896,3898],{"class":412,"line":809},[410,3874,3875],{"class":439},"NEW_ISM_ID",[410,3877,1009],{"class":443},[410,3879,417],{"class":416},[410,3881,421],{"class":420},[410,3883,3710],{"class":420},[410,3885,3886],{"class":439}," $TX_HASH ",[410,3888,3889],{"class":420},"--output",[410,3891,433],{"class":420},[410,3893,436],{"class":420},[410,3895,440],{"class":439},[410,3897,444],{"class":443},[410,3899,1032],{"class":439},[410,3901,3902,3905,3908,3910,3913,3915],{"class":412,"line":825},[410,3903,3904],{"class":416},"  jq",[410,3906,3907],{"class":420}," -r",[410,3909,450],{"class":443},[410,3911,3912],{"class":420},"first(.events[] | select(.type | test(\"MultisigIsm\")) | .attributes[] | select(.key==\"ism_id\") | .value | fromjson)",[410,3914,3074],{"class":443},[410,3916,1048],{"class":443},[410,3918,3919,3921,3923,3926,3929],{"class":412,"line":841},[410,3920,3058],{"class":3057},[410,3922,1069],{"class":443},[410,3924,3925],{"class":420},"Nuovo MultisigISM (2\u002F3): ",[410,3927,3928],{"class":439},"$NEW_ISM_ID",[410,3930,677],{"class":443},[1107,3932,3933,3934,3937,3938,3940,3941,3944,3945,245,3948,3401],{},"Soglia ",[145,3935,3936],{},"2"," su ",[145,3939,969],{},": servono 2 firme su 3. Il bridge resta operativo anche con un validator offline. Questo ISM verifica la direzione ",[141,3942,3943],{},"Base Sepolia → BitSong"," (lato Cosmos); per la direzione opposta aggiorna l'ISM ",[141,3946,3947],{},"lato EVM",[160,3949,3951],{"href":3950},"#aggiornare-lism-lato-evm","sotto",[918,3953],{},[225,3955,3957],{"id":3956},"_4-rimuovere-lattuale-multisig","4. Rimuovere l'attuale multisig",[137,3959,3960,3961,3964,3965,3967],{},"Verifica quale ISM è ",[141,3962,3963],{},"attualmente"," sulla rotta del dominio ",[145,3966,370],{},", poi rimuovi quella mappatura dal RoutingISM.",[400,3969,3971],{"className":402,"code":3970,"filename":655,"language":405,"meta":406,"style":406},"ACTIVE_ISM=$(bitsongd query hyperlane ism isms --output json --node $NODE \\\n  | jq -r '.isms[] | select(.\"@type\" | test(\"RoutingISM\")) | .routes[] | select(.domain==84532) | .ism')\necho \"ISM attuale (da sostituire): $ACTIVE_ISM\"\n",[145,3972,3973,3998,4016],{"__ignoreMap":406},[410,3974,3975,3978,3980,3982,3984,3986,3988,3990,3992,3994,3996],{"class":412,"line":413},[410,3976,3977],{"class":439},"ACTIVE_ISM",[410,3979,1009],{"class":443},[410,3981,417],{"class":416},[410,3983,421],{"class":420},[410,3985,424],{"class":420},[410,3987,535],{"class":420},[410,3989,538],{"class":420},[410,3991,430],{"class":420},[410,3993,433],{"class":420},[410,3995,436],{"class":420},[410,3997,3771],{"class":439},[410,3999,4000,4003,4005,4007,4009,4012,4014],{"class":412,"line":459},[410,4001,4002],{"class":443},"  |",[410,4004,447],{"class":416},[410,4006,3907],{"class":420},[410,4008,450],{"class":443},[410,4010,4011],{"class":420},".isms[] | select(.\"@type\" | test(\"RoutingISM\")) | .routes[] | select(.domain==84532) | .ism",[410,4013,3074],{"class":443},[410,4015,1048],{"class":443},[410,4017,4018,4020,4022,4025,4028],{"class":412,"line":493},[410,4019,3058],{"class":3057},[410,4021,1069],{"class":443},[410,4023,4024],{"class":420},"ISM attuale (da sostituire): ",[410,4026,4027],{"class":439},"$ACTIVE_ISM",[410,4029,677],{"class":443},[400,4031,4033],{"className":402,"code":4032,"filename":3633,"language":405,"meta":406,"style":406},"bitsongd tx hyperlane ism remove-routing-ism-domain $ROUTING_ISM_ID $REMOTE_DOMAIN \\\n    --from \u003Cowner-key> --keyring-backend test --chain-id $CHAIN_ID --node $NODE \\\n    --gas auto --gas-adjustment 1.5 --fees 10000${DENOM} -y\n",[145,4034,4035,4051,4075],{"__ignoreMap":406},[410,4036,4037,4039,4041,4043,4045,4048],{"class":412,"line":413},[410,4038,417],{"class":416},[410,4040,3710],{"class":420},[410,4042,424],{"class":420},[410,4044,535],{"class":420},[410,4046,4047],{"class":420}," remove-routing-ism-domain",[410,4049,4050],{"class":439}," $ROUTING_ISM_ID $REMOTE_DOMAIN \\\n",[410,4052,4053,4055,4057,4059,4061,4063,4065,4067,4069,4071,4073],{"class":412,"line":459},[410,4054,3743],{"class":420},[410,4056,3746],{"class":443},[410,4058,3749],{"class":420},[410,4060,3752],{"class":439},[410,4062,3755],{"class":443},[410,4064,1467],{"class":420},[410,4066,1503],{"class":420},[410,4068,3762],{"class":420},[410,4070,3765],{"class":439},[410,4072,3768],{"class":420},[410,4074,3771],{"class":439},[410,4076,4077,4079,4081,4083,4085,4087,4089,4091,4093,4095],{"class":412,"line":493},[410,4078,3776],{"class":420},[410,4080,3779],{"class":420},[410,4082,3782],{"class":420},[410,4084,3785],{"class":1605},[410,4086,3788],{"class":420},[410,4088,3791],{"class":1605},[410,4090,3794],{"class":443},[410,4092,3797],{"class":439},[410,4094,3800],{"class":443},[410,4096,4097],{"class":420}," -y\n",[384,4099,4100,606,4103,4106,4107,148,4110,4113,4114,4116,4117,4120,4121,4124,4125,4128,4129,4132],{},[145,4101,4102],{},"set-routing-ism-domain",[141,4104,4105],{},"non sovrascrive"," un dominio già mappato (emette l'evento ma lo stato non cambia): bisogna ",[141,4108,4109],{},"prima rimuovere",[141,4111,4112],{},"poi"," impostare. Tra i due comandi c'è una breve finestra in cui il dominio ",[145,4115,370],{}," resta ",[141,4118,4119],{},"senza ISM"," — pianifica la rotazione a basso traffico. Per il ",[141,4122,4123],{},"rollback"," rimetti la rotta sull'ISM precedente (",[145,4126,4127],{},"remove"," + ",[145,4130,4131],{},"set"," verso il vecchio ID).",[918,4134],{},[225,4136,4138],{"id":4137},"_5-impostare-il-nuovo-multisig","5. Impostare il nuovo multisig",[137,4140,4141,4142,4144],{},"Attendi che la rimozione sia in un blocco, poi ripunta la rotta del dominio Base Sepolia sul ",[141,4143,3579],{}," ISM 2\u002F3.",[400,4146,4148],{"className":402,"code":4147,"filename":3633,"language":405,"meta":406,"style":406},"bitsongd tx hyperlane ism set-routing-ism-domain $ROUTING_ISM_ID $REMOTE_DOMAIN $NEW_ISM_ID \\\n    --from \u003Cowner-key> --keyring-backend test --chain-id $CHAIN_ID --node $NODE \\\n    --gas auto --gas-adjustment 1.5 --fees 10000${DENOM} -y\n",[145,4149,4150,4166,4190],{"__ignoreMap":406},[410,4151,4152,4154,4156,4158,4160,4163],{"class":412,"line":413},[410,4153,417],{"class":416},[410,4155,3710],{"class":420},[410,4157,424],{"class":420},[410,4159,535],{"class":420},[410,4161,4162],{"class":420}," set-routing-ism-domain",[410,4164,4165],{"class":439}," $ROUTING_ISM_ID $REMOTE_DOMAIN $NEW_ISM_ID \\\n",[410,4167,4168,4170,4172,4174,4176,4178,4180,4182,4184,4186,4188],{"class":412,"line":459},[410,4169,3743],{"class":420},[410,4171,3746],{"class":443},[410,4173,3749],{"class":420},[410,4175,3752],{"class":439},[410,4177,3755],{"class":443},[410,4179,1467],{"class":420},[410,4181,1503],{"class":420},[410,4183,3762],{"class":420},[410,4185,3765],{"class":439},[410,4187,3768],{"class":420},[410,4189,3771],{"class":439},[410,4191,4192,4194,4196,4198,4200,4202,4204,4206,4208,4210],{"class":412,"line":493},[410,4193,3776],{"class":420},[410,4195,3779],{"class":420},[410,4197,3782],{"class":420},[410,4199,3785],{"class":1605},[410,4201,3788],{"class":420},[410,4203,3791],{"class":1605},[410,4205,3794],{"class":443},[410,4207,3797],{"class":439},[410,4209,3800],{"class":443},[410,4211,4097],{"class":420},[400,4213,4215],{"className":402,"code":4214,"filename":3411,"language":405,"meta":406,"style":406},"ACTIVE_ISM=$(bitsongd query hyperlane ism isms --output json --node $NODE \\\n  | jq -r '.isms[] | select(.\"@type\" | test(\"RoutingISM\")) | .routes[] | select(.domain==84532) | .ism')\necho \"ISM attivo: $ACTIVE_ISM  (atteso: $NEW_ISM_ID)\"\nbitsongd query hyperlane ism isms --output json --node $NODE \\\n  | jq --arg id \"$ACTIVE_ISM\" '.isms[] | select(.id==$id) | {id, validators, threshold}'\n",[145,4216,4217,4241,4257,4277,4297],{"__ignoreMap":406},[410,4218,4219,4221,4223,4225,4227,4229,4231,4233,4235,4237,4239],{"class":412,"line":413},[410,4220,3977],{"class":439},[410,4222,1009],{"class":443},[410,4224,417],{"class":416},[410,4226,421],{"class":420},[410,4228,424],{"class":420},[410,4230,535],{"class":420},[410,4232,538],{"class":420},[410,4234,430],{"class":420},[410,4236,433],{"class":420},[410,4238,436],{"class":420},[410,4240,3771],{"class":439},[410,4242,4243,4245,4247,4249,4251,4253,4255],{"class":412,"line":459},[410,4244,4002],{"class":443},[410,4246,447],{"class":416},[410,4248,3907],{"class":420},[410,4250,450],{"class":443},[410,4252,4011],{"class":420},[410,4254,3074],{"class":443},[410,4256,1048],{"class":443},[410,4258,4259,4261,4263,4266,4268,4271,4273,4275],{"class":412,"line":493},[410,4260,3058],{"class":3057},[410,4262,1069],{"class":443},[410,4264,4265],{"class":420},"ISM attivo: ",[410,4267,4027],{"class":439},[410,4269,4270],{"class":420},"  (atteso: ",[410,4272,3928],{"class":439},[410,4274,3084],{"class":420},[410,4276,677],{"class":443},[410,4278,4279,4281,4283,4285,4287,4289,4291,4293,4295],{"class":412,"line":526},[410,4280,417],{"class":416},[410,4282,421],{"class":420},[410,4284,424],{"class":420},[410,4286,535],{"class":420},[410,4288,538],{"class":420},[410,4290,430],{"class":420},[410,4292,433],{"class":420},[410,4294,436],{"class":420},[410,4296,3771],{"class":439},[410,4298,4299,4301,4303,4306,4309,4311,4313,4315,4317,4320],{"class":412,"line":726},[410,4300,4002],{"class":443},[410,4302,447],{"class":416},[410,4304,4305],{"class":420}," --arg",[410,4307,4308],{"class":420}," id",[410,4310,1069],{"class":443},[410,4312,4027],{"class":439},[410,4314,672],{"class":443},[410,4316,450],{"class":443},[410,4318,4319],{"class":420},".isms[] | select(.id==$id) | {id, validators, threshold}",[410,4321,456],{"class":443},[559,4323,4325],{"id":4324},"aggiornare-lism-lato-evm","Aggiornare l'ISM lato EVM",[137,4327,4328,4329,4332,4333,4336,4337,4340,4341,4344,4345,4348,4349,4352],{},"La direzione ",[141,4330,4331],{},"BitSong → Base Sepolia"," è verificata da un ",[145,4334,4335],{},"StaticMessageIdMultisigISM"," su Base Sepolia, agganciato all'HypERC20. Portalo a 2\u002F3: l'ISM puoi ",[141,4338,4339],{},"deployarlo con qualsiasi chiave finanziata"," (anche la KMS del relayer via ",[145,4342,4343],{},"--aws","); solo ",[145,4346,4347],{},"setInterchainSecurityModule"," richiede la ",[141,4350,4351],{},"owner key"," dell'HypERC20.",[400,4354,4356],{"className":402,"code":4355,"filename":655,"language":405,"meta":406,"style":406},"export HYP_ERC20_ADDR=\"0x27d0F8cBF125995f91407e9E5F70EF52c4412878\"   # verifica l'indirizzo corrente\nFACTORY=\"0xfc6e546510dC9d76057F1f76633FCFfC188CB213\"\nVALS=\"[$V1,$V2,$V3]\"   # stessi 3 indirizzi, ordinati\n\n# 1. Predici e deploya l'ISM 2\u002F3 (qui con la KMS del relayer: AWS_KMS_KEY_ID=alias\u002Fhl-relayer ... --aws)\nNEW_EVM_ISM=$(cast call $FACTORY \"deploy(address[],uint8)(address)\" \"$VALS\" 2 --rpc-url $EVM_RPC)\ncast send $FACTORY \"deploy(address[],uint8)\" \"$VALS\" 2 --aws --rpc-url $EVM_RPC\necho \"Nuovo ISM EVM: $NEW_EVM_ISM\"\n\n# 2. Aggancialo all'HypERC20 (OWNER key dell'HypERC20)\ncast send $HYP_ERC20_ADDR \"setInterchainSecurityModule(address)\" $NEW_EVM_ISM \\\n    --private-key \u003Cowner-evm-key> --rpc-url $EVM_RPC\n\n# 3. Verifica\ncast call $HYP_ERC20_ADDR \"interchainSecurityModule()(address)\" --rpc-url $EVM_RPC\n",[145,4357,4358,4377,4390,4418,4422,4427,4464,4495,4509,4513,4518,4537,4555,4559,4564],{"__ignoreMap":406},[410,4359,4360,4362,4365,4367,4369,4372,4374],{"class":412,"line":413},[410,4361,663],{"class":662},[410,4363,4364],{"class":439}," HYP_ERC20_ADDR",[410,4366,669],{"class":443},[410,4368,672],{"class":443},[410,4370,4371],{"class":420},"0x27d0F8cBF125995f91407e9E5F70EF52c4412878",[410,4373,672],{"class":443},[410,4375,4376],{"class":743},"   # verifica l'indirizzo corrente\n",[410,4378,4379,4382,4384,4386,4388],{"class":412,"line":459},[410,4380,4381],{"class":439},"FACTORY",[410,4383,669],{"class":443},[410,4385,672],{"class":443},[410,4387,382],{"class":420},[410,4389,677],{"class":443},[410,4391,4392,4395,4397,4399,4401,4403,4405,4407,4409,4411,4413,4415],{"class":412,"line":493},[410,4393,4394],{"class":439},"VALS",[410,4396,669],{"class":443},[410,4398,672],{"class":443},[410,4400,3138],{"class":420},[410,4402,3722],{"class":439},[410,4404,1837],{"class":420},[410,4406,3727],{"class":439},[410,4408,1837],{"class":420},[410,4410,3732],{"class":439},[410,4412,3144],{"class":420},[410,4414,672],{"class":443},[410,4416,4417],{"class":743},"   # stessi 3 indirizzi, ordinati\n",[410,4419,4420],{"class":412,"line":526},[410,4421,784],{"emptyLinePlaceholder":783},[410,4423,4424],{"class":412,"line":726},[410,4425,4426],{"class":743},"# 1. Predici e deploya l'ISM 2\u002F3 (qui con la KMS del relayer: AWS_KMS_KEY_ID=alias\u002Fhl-relayer ... --aws)\n",[410,4428,4429,4432,4434,4436,4438,4441,4443,4446,4448,4450,4453,4455,4457,4459,4462],{"class":412,"line":747},[410,4430,4431],{"class":439},"NEW_EVM_ISM",[410,4433,1009],{"class":443},[410,4435,248],{"class":416},[410,4437,3119],{"class":420},[410,4439,4440],{"class":439}," $FACTORY ",[410,4442,672],{"class":443},[410,4444,4445],{"class":420},"deploy(address[],uint8)(address)",[410,4447,672],{"class":443},[410,4449,1069],{"class":443},[410,4451,4452],{"class":439},"$VALS",[410,4454,672],{"class":443},[410,4456,2341],{"class":1605},[410,4458,3149],{"class":420},[410,4460,4461],{"class":439}," $EVM_RPC",[410,4463,1048],{"class":443},[410,4465,4466,4468,4471,4473,4475,4478,4480,4482,4484,4486,4488,4491,4493],{"class":412,"line":763},[410,4467,248],{"class":416},[410,4469,4470],{"class":420}," send",[410,4472,4440],{"class":439},[410,4474,672],{"class":443},[410,4476,4477],{"class":420},"deploy(address[],uint8)",[410,4479,672],{"class":443},[410,4481,1069],{"class":443},[410,4483,4452],{"class":439},[410,4485,672],{"class":443},[410,4487,2341],{"class":1605},[410,4489,4490],{"class":420}," --aws",[410,4492,3149],{"class":420},[410,4494,3152],{"class":439},[410,4496,4497,4499,4501,4504,4507],{"class":412,"line":780},[410,4498,3058],{"class":3057},[410,4500,1069],{"class":443},[410,4502,4503],{"class":420},"Nuovo ISM EVM: ",[410,4505,4506],{"class":439},"$NEW_EVM_ISM",[410,4508,677],{"class":443},[410,4510,4511],{"class":412,"line":787},[410,4512,784],{"emptyLinePlaceholder":783},[410,4514,4515],{"class":412,"line":793},[410,4516,4517],{"class":743},"# 2. Aggancialo all'HypERC20 (OWNER key dell'HypERC20)\n",[410,4519,4520,4522,4524,4527,4529,4532,4534],{"class":412,"line":809},[410,4521,248],{"class":416},[410,4523,4470],{"class":420},[410,4525,4526],{"class":439}," $HYP_ERC20_ADDR ",[410,4528,672],{"class":443},[410,4530,4531],{"class":420},"setInterchainSecurityModule(address)",[410,4533,672],{"class":443},[410,4535,4536],{"class":439}," $NEW_EVM_ISM \\\n",[410,4538,4539,4542,4544,4547,4549,4551,4553],{"class":412,"line":825},[410,4540,4541],{"class":420},"    --private-key",[410,4543,3746],{"class":443},[410,4545,4546],{"class":420},"owner-evm-ke",[410,4548,3752],{"class":439},[410,4550,3755],{"class":443},[410,4552,3149],{"class":420},[410,4554,3152],{"class":439},[410,4556,4557],{"class":412,"line":841},[410,4558,784],{"emptyLinePlaceholder":783},[410,4560,4561],{"class":412,"line":857},[410,4562,4563],{"class":743},"# 3. Verifica\n",[410,4565,4566,4568,4570,4572,4574,4577,4579,4581],{"class":412,"line":862},[410,4567,248],{"class":416},[410,4569,3119],{"class":420},[410,4571,4526],{"class":439},[410,4573,672],{"class":443},[410,4575,4576],{"class":420},"interchainSecurityModule()(address)",[410,4578,672],{"class":443},[410,4580,3149],{"class":420},[410,4582,3152],{"class":439},[1107,4584,4585,4586,4589],{},"Senza questo aggiornamento, BitSong → Base Sepolia resterebbe verificato dal vecchio set di validator. Aggiorna ",[141,4587,4588],{},"entrambi"," i lati per completare la rotazione.",[918,4591],{},[225,4593,4595],{"id":4594},"_6-test-transfer-bitsong-base-sepolia","6. Test transfer BitSong → Base Sepolia",[137,4597,4598],{},"I token vengono bloccati come collaterale su BitSong e mintati come HypERC20 su Base Sepolia.",[400,4600,4602],{"className":402,"code":4601,"filename":655,"language":405,"meta":406,"style":406},"export TOKEN_ID=\"0x726f757465725f61707000000000000000000000000000010000000000000000\"\nexport HYP_ERC20_ADDR=\"0x27d0F8cBF125995f91407e9E5F70EF52c4412878\"\n\nRECIPIENT_ADDR=\"0x\u003Cevm-recipient>\"\nRECIPIENT_BYTES32=$(printf \"0x%064s\" \"${RECIPIENT_ADDR#0x}\" | tr ' ' '0')\n\nREQUIRED_FEE=$(bitsongd query hyperlane hooks quote-gas-payment $IGP_ID $REMOTE_DOMAIN 300000 -o json --node $NODE | jq -r '.gas_payment[0].amount')\n\nbitsongd tx warp transfer $TOKEN_ID $REMOTE_DOMAIN $RECIPIENT_BYTES32 7777 \\\n    --max-hyperlane-fee \"${REQUIRED_FEE}utbtsg\" \\\n    --from $KEY_NAME --keyring-backend test --chain-id $CHAIN_ID --node $NODE \\\n    --gas auto --gas-adjustment 1.5 --fees 10000${DENOM} --output json -y\n",[145,4603,4604,4620,4634,4638,4652,4693,4697,4744,4748,4768,4785,4805],{"__ignoreMap":406},[410,4605,4606,4608,4611,4613,4615,4618],{"class":412,"line":413},[410,4607,663],{"class":662},[410,4609,4610],{"class":439}," TOKEN_ID",[410,4612,669],{"class":443},[410,4614,672],{"class":443},[410,4616,4617],{"class":420},"0x726f757465725f61707000000000000000000000000000010000000000000000",[410,4619,677],{"class":443},[410,4621,4622,4624,4626,4628,4630,4632],{"class":412,"line":459},[410,4623,663],{"class":662},[410,4625,4364],{"class":439},[410,4627,669],{"class":443},[410,4629,672],{"class":443},[410,4631,4371],{"class":420},[410,4633,677],{"class":443},[410,4635,4636],{"class":412,"line":493},[410,4637,784],{"emptyLinePlaceholder":783},[410,4639,4640,4643,4645,4647,4650],{"class":412,"line":526},[410,4641,4642],{"class":439},"RECIPIENT_ADDR",[410,4644,669],{"class":443},[410,4646,672],{"class":443},[410,4648,4649],{"class":420},"0x\u003Cevm-recipient>",[410,4651,677],{"class":443},[410,4653,4654,4657,4659,4661,4663,4665,4667,4669,4671,4673,4675,4677,4679,4681,4683,4685,4687,4689,4691],{"class":412,"line":726},[410,4655,4656],{"class":439},"RECIPIENT_BYTES32",[410,4658,1009],{"class":443},[410,4660,3456],{"class":3057},[410,4662,1069],{"class":443},[410,4664,3461],{"class":420},[410,4666,672],{"class":443},[410,4668,3466],{"class":443},[410,4670,4642],{"class":439},[410,4672,3472],{"class":443},[410,4674,1480],{"class":439},[410,4676,3477],{"class":443},[410,4678,1509],{"class":443},[410,4680,3066],{"class":416},[410,4682,450],{"class":443},[410,4684,450],{"class":443},[410,4686,450],{"class":443},[410,4688,3490],{"class":420},[410,4690,3074],{"class":443},[410,4692,1048],{"class":443},[410,4694,4695],{"class":412,"line":747},[410,4696,784],{"emptyLinePlaceholder":783},[410,4698,4699,4702,4704,4706,4708,4710,4712,4715,4718,4721,4723,4725,4727,4729,4731,4733,4735,4737,4740,4742],{"class":412,"line":763},[410,4700,4701],{"class":439},"REQUIRED_FEE",[410,4703,1009],{"class":443},[410,4705,417],{"class":416},[410,4707,421],{"class":420},[410,4709,424],{"class":420},[410,4711,468],{"class":420},[410,4713,4714],{"class":420}," quote-gas-payment",[410,4716,4717],{"class":439}," $IGP_ID $REMOTE_DOMAIN ",[410,4719,4720],{"class":1605},"300000",[410,4722,1400],{"class":420},[410,4724,433],{"class":420},[410,4726,436],{"class":420},[410,4728,440],{"class":439},[410,4730,444],{"class":443},[410,4732,447],{"class":416},[410,4734,3907],{"class":420},[410,4736,450],{"class":443},[410,4738,4739],{"class":420},".gas_payment[0].amount",[410,4741,3074],{"class":443},[410,4743,1048],{"class":443},[410,4745,4746],{"class":412,"line":780},[410,4747,784],{"emptyLinePlaceholder":783},[410,4749,4750,4752,4754,4757,4760,4763,4766],{"class":412,"line":787},[410,4751,417],{"class":416},[410,4753,3710],{"class":420},[410,4755,4756],{"class":420}," warp",[410,4758,4759],{"class":420}," transfer",[410,4761,4762],{"class":439}," $TOKEN_ID $REMOTE_DOMAIN $RECIPIENT_BYTES32 ",[410,4764,4765],{"class":1605},"7777",[410,4767,1032],{"class":439},[410,4769,4770,4773,4775,4777,4779,4781,4783],{"class":412,"line":793},[410,4771,4772],{"class":420},"    --max-hyperlane-fee",[410,4774,3466],{"class":443},[410,4776,4701],{"class":439},[410,4778,3800],{"class":443},[410,4780,721],{"class":420},[410,4782,672],{"class":443},[410,4784,1032],{"class":439},[410,4786,4787,4789,4792,4795,4797,4799,4801,4803],{"class":412,"line":809},[410,4788,3743],{"class":420},[410,4790,4791],{"class":439}," $KEY_NAME ",[410,4793,4794],{"class":420},"--keyring-backend",[410,4796,1503],{"class":420},[410,4798,3762],{"class":420},[410,4800,3765],{"class":439},[410,4802,3768],{"class":420},[410,4804,3771],{"class":439},[410,4806,4807,4809,4811,4813,4815,4817,4819,4821,4823,4825,4827,4829],{"class":412,"line":825},[410,4808,3776],{"class":420},[410,4810,3779],{"class":420},[410,4812,3782],{"class":420},[410,4814,3785],{"class":1605},[410,4816,3788],{"class":420},[410,4818,3791],{"class":1605},[410,4820,3794],{"class":443},[410,4822,3797],{"class":439},[410,4824,3800],{"class":443},[410,4826,430],{"class":420},[410,4828,433],{"class":420},[410,4830,4097],{"class":420},[137,4832,4833,4834,148,4837,4840,4841,4843],{},"Dopo la consegna (i validator firmano il checkpoint del nuovo messaggio → S3 → relayer), verifica su Base Sepolia (",[145,4835,4836],{},"balanceOf",[145,4838,4839],{},"totalSupply"," aumentano di ",[145,4842,4765],{},"):",[400,4845,4847],{"className":402,"code":4846,"filename":655,"language":405,"meta":406,"style":406},"cast call \"$HYP_ERC20_ADDR\" \"totalSupply()(uint256)\" --rpc-url \"$EVM_RPC\"\ncast call \"$HYP_ERC20_ADDR\" \"balanceOf(address)(uint256)\" \"$RECIPIENT_ADDR\" --rpc-url \"$EVM_RPC\"\n",[145,4848,4849,4878],{"__ignoreMap":406},[410,4850,4851,4853,4855,4857,4860,4862,4864,4867,4869,4871,4873,4876],{"class":412,"line":413},[410,4852,248],{"class":416},[410,4854,3119],{"class":420},[410,4856,1069],{"class":443},[410,4858,4859],{"class":439},"$HYP_ERC20_ADDR",[410,4861,672],{"class":443},[410,4863,1069],{"class":443},[410,4865,4866],{"class":420},"totalSupply()(uint256)",[410,4868,672],{"class":443},[410,4870,3149],{"class":420},[410,4872,1069],{"class":443},[410,4874,4875],{"class":439},"$EVM_RPC",[410,4877,677],{"class":443},[410,4879,4880,4882,4884,4886,4888,4890,4892,4895,4897,4899,4902,4904,4906,4908,4910],{"class":412,"line":459},[410,4881,248],{"class":416},[410,4883,3119],{"class":420},[410,4885,1069],{"class":443},[410,4887,4859],{"class":439},[410,4889,672],{"class":443},[410,4891,1069],{"class":443},[410,4893,4894],{"class":420},"balanceOf(address)(uint256)",[410,4896,672],{"class":443},[410,4898,1069],{"class":443},[410,4900,4901],{"class":439},"$RECIPIENT_ADDR",[410,4903,672],{"class":443},[410,4905,3149],{"class":420},[410,4907,1069],{"class":443},[410,4909,4875],{"class":439},[410,4911,677],{"class":443},[918,4913],{},[225,4915,4917],{"id":4916},"_7-test-transfer-base-sepolia-bitsong","7. Test transfer Base Sepolia → BitSong",[137,4919,4920,4921,4924,4925,4928],{},"Ritorno: l'HypERC20 viene ",[141,4922,4923],{},"bruciato"," su Base Sepolia, il collaterale ",[141,4926,4927],{},"sbloccato"," su BitSong.",[1140,4930,4931,4934,4935,4938,4939,4942,4943,256],{},[145,4932,4933],{},"transferRemote"," brucia i token del chiamante: devi ",[141,4936,4937],{},"già possedere"," HypERC20 (dalla ",[160,4940,4941],{"href":192},"direzione BitSong → Base","), altrimenti ",[145,4944,4945],{},"ERC20: burn amount exceeds balance",[400,4947,4949],{"className":402,"code":4948,"filename":655,"language":405,"meta":406,"style":406},"# Destinatario Cosmos (bech32) → bytes32\nCOSMOS_RECIPIENT=\"bitsong1...\"\nADDR_HEX=$(bitsongd keys parse \"$COSMOS_RECIPIENT\" 2>&1 | grep -i bytes | awk '{print $2}')\nRECIPIENT_BYTES32=\"0x$(printf '%064s' \"$ADDR_HEX\" | tr ' ' '0')\"\n\n# Quota il gas EVM e brucia verso BitSong (dominio 71717171).\n# Se il detentore è una chiave KMS, firma con --aws (AWS_KMS_KEY_ID=alias\u002F…); altrimenti --private-key.\nVAL=$(cast call \"$HYP_ERC20_ADDR\" \"quoteGasPayment(uint32)(uint256)\" $DOMAIN_ID --rpc-url $EVM_RPC)\ncast send \"$HYP_ERC20_ADDR\" \"transferRemote(uint32,bytes32,uint256)\" \\\n    \"$DOMAIN_ID\" \"$RECIPIENT_BYTES32\" 4444 --value \"$VAL\" \\\n    --aws --rpc-url \"$EVM_RPC\"\n",[145,4950,4951,4956,4970,5017,5060,5064,5069,5074,5108,5129,5160],{"__ignoreMap":406},[410,4952,4953],{"class":412,"line":413},[410,4954,4955],{"class":743},"# Destinatario Cosmos (bech32) → bytes32\n",[410,4957,4958,4961,4963,4965,4968],{"class":412,"line":459},[410,4959,4960],{"class":439},"COSMOS_RECIPIENT",[410,4962,669],{"class":443},[410,4964,672],{"class":443},[410,4966,4967],{"class":420},"bitsong1...",[410,4969,677],{"class":443},[410,4971,4972,4975,4977,4979,4981,4984,4986,4989,4991,4993,4995,4997,5000,5003,5005,5008,5010,5013,5015],{"class":412,"line":493},[410,4973,4974],{"class":439},"ADDR_HEX",[410,4976,1009],{"class":443},[410,4978,417],{"class":416},[410,4980,1458],{"class":420},[410,4982,4983],{"class":420}," parse",[410,4985,1069],{"class":443},[410,4987,4988],{"class":439},"$COSMOS_RECIPIENT",[410,4990,672],{"class":443},[410,4992,1506],{"class":443},[410,4994,1509],{"class":443},[410,4996,3186],{"class":416},[410,4998,4999],{"class":420}," -i",[410,5001,5002],{"class":420}," bytes",[410,5004,1509],{"class":443},[410,5006,5007],{"class":416}," awk",[410,5009,450],{"class":443},[410,5011,5012],{"class":420},"{print $2}",[410,5014,3074],{"class":443},[410,5016,1048],{"class":443},[410,5018,5019,5021,5023,5025,5027,5029,5031,5033,5036,5038,5040,5043,5045,5047,5049,5051,5053,5055,5057],{"class":412,"line":526},[410,5020,4656],{"class":439},[410,5022,669],{"class":443},[410,5024,672],{"class":443},[410,5026,1480],{"class":420},[410,5028,1483],{"class":443},[410,5030,3456],{"class":3057},[410,5032,450],{"class":443},[410,5034,5035],{"class":420},"%064s",[410,5037,3074],{"class":443},[410,5039,1069],{"class":443},[410,5041,5042],{"class":439},"$ADDR_HEX",[410,5044,672],{"class":443},[410,5046,1509],{"class":443},[410,5048,3066],{"class":416},[410,5050,450],{"class":443},[410,5052,450],{"class":443},[410,5054,450],{"class":443},[410,5056,3490],{"class":420},[410,5058,5059],{"class":443},"')\"\n",[410,5061,5062],{"class":412,"line":726},[410,5063,784],{"emptyLinePlaceholder":783},[410,5065,5066],{"class":412,"line":747},[410,5067,5068],{"class":743},"# Quota il gas EVM e brucia verso BitSong (dominio 71717171).\n",[410,5070,5071],{"class":412,"line":763},[410,5072,5073],{"class":743},"# Se il detentore è una chiave KMS, firma con --aws (AWS_KMS_KEY_ID=alias\u002F…); altrimenti --private-key.\n",[410,5075,5076,5079,5081,5083,5085,5087,5089,5091,5093,5096,5098,5101,5104,5106],{"class":412,"line":780},[410,5077,5078],{"class":439},"VAL",[410,5080,1009],{"class":443},[410,5082,248],{"class":416},[410,5084,3119],{"class":420},[410,5086,1069],{"class":443},[410,5088,4859],{"class":439},[410,5090,672],{"class":443},[410,5092,1069],{"class":443},[410,5094,5095],{"class":420},"quoteGasPayment(uint32)(uint256)",[410,5097,672],{"class":443},[410,5099,5100],{"class":439}," $DOMAIN_ID ",[410,5102,5103],{"class":420},"--rpc-url",[410,5105,4461],{"class":439},[410,5107,1048],{"class":443},[410,5109,5110,5112,5114,5116,5118,5120,5122,5125,5127],{"class":412,"line":787},[410,5111,248],{"class":416},[410,5113,4470],{"class":420},[410,5115,1069],{"class":443},[410,5117,4859],{"class":439},[410,5119,672],{"class":443},[410,5121,1069],{"class":443},[410,5123,5124],{"class":420},"transferRemote(uint32,bytes32,uint256)",[410,5126,672],{"class":443},[410,5128,1032],{"class":439},[410,5130,5131,5133,5136,5138,5140,5143,5145,5148,5151,5153,5156,5158],{"class":412,"line":793},[410,5132,1588],{"class":443},[410,5134,5135],{"class":439},"$DOMAIN_ID",[410,5137,672],{"class":443},[410,5139,1069],{"class":443},[410,5141,5142],{"class":439},"$RECIPIENT_BYTES32",[410,5144,672],{"class":443},[410,5146,5147],{"class":1605}," 4444",[410,5149,5150],{"class":420}," --value",[410,5152,1069],{"class":443},[410,5154,5155],{"class":439},"$VAL",[410,5157,672],{"class":443},[410,5159,1032],{"class":439},[410,5161,5162,5165,5167,5169,5171],{"class":412,"line":809},[410,5163,5164],{"class":420},"    --aws",[410,5166,3149],{"class":420},[410,5168,1069],{"class":443},[410,5170,4875],{"class":439},[410,5172,677],{"class":443},[137,5174,5175,5176,5178,5179,4843],{},"Verifica lo sblocco su BitSong (il saldo ",[145,5177,721],{}," del destinatario aumenta di ",[145,5180,5181],{},"4444",[400,5183,5185],{"className":402,"code":5184,"filename":655,"language":405,"meta":406,"style":406},"bitsongd query bank balances \"$COSMOS_RECIPIENT\" --node $NODE --output json | jq '.balances'\n",[145,5186,5187],{"__ignoreMap":406},[410,5188,5189,5191,5193,5196,5199,5201,5203,5205,5207,5209,5211,5213,5215,5217,5219,5222],{"class":412,"line":413},[410,5190,417],{"class":416},[410,5192,421],{"class":420},[410,5194,5195],{"class":420}," bank",[410,5197,5198],{"class":420}," balances",[410,5200,1069],{"class":443},[410,5202,4988],{"class":439},[410,5204,672],{"class":443},[410,5206,436],{"class":420},[410,5208,440],{"class":439},[410,5210,3889],{"class":420},[410,5212,433],{"class":420},[410,5214,1509],{"class":443},[410,5216,447],{"class":416},[410,5218,450],{"class":443},[410,5220,5221],{"class":420},".balances",[410,5223,456],{"class":443},[1107,5225,5226,5227,5231,5232,5235,5236,5239,5240,5243],{},"Usa il dominio ",[141,5228,5229],{},[145,5230,366],{},". Su testnet (enforcement off) il ",[145,5233,5234],{},"--value"," minimo richiesto è quello di ",[145,5237,5238],{},"quoteGasPayment"," (spesso ",[145,5241,5242],{},"1"," wei).",[918,5245],{},[225,5247,5249],{"id":5248},"operazioni-e-troubleshooting","Operazioni e troubleshooting",[2562,5251,5252,5285,5335],{},[400,5253,5256],{"className":402,"code":5254,"filename":5255,"language":405,"meta":406,"style":406},"docker ps --filter \"name=hl-\" --format \"table {{.Names}}\\t{{.Status}}\"\n","Stato agenti",[145,5257,5258],{"__ignoreMap":406},[410,5259,5260,5262,5265,5268,5270,5273,5275,5278,5280,5283],{"class":412,"line":413},[410,5261,2543],{"class":416},[410,5263,5264],{"class":420}," ps",[410,5266,5267],{"class":420}," --filter",[410,5269,1069],{"class":443},[410,5271,5272],{"class":420},"name=hl-",[410,5274,672],{"class":443},[410,5276,5277],{"class":420}," --format",[410,5279,1069],{"class":443},[410,5281,5282],{"class":420},"table {{.Names}}\\t{{.Status}}",[410,5284,677],{"class":443},[400,5286,5289],{"className":402,"code":5287,"filename":5288,"language":405,"meta":406,"style":406},"docker logs -f --tail 100 hl-val1-bitsong\ndocker logs -f --tail 100 hl-val1-basesepolia\ndocker logs -f --tail 100 hl-relayer\n","Log",[145,5290,5291,5306,5321],{"__ignoreMap":406},[410,5292,5293,5295,5297,5299,5301,5303],{"class":412,"line":413},[410,5294,2543],{"class":416},[410,5296,3420],{"class":420},[410,5298,3423],{"class":420},[410,5300,3426],{"class":420},[410,5302,3429],{"class":1605},[410,5304,5305],{"class":420}," hl-val1-bitsong\n",[410,5307,5308,5310,5312,5314,5316,5318],{"class":412,"line":459},[410,5309,2543],{"class":416},[410,5311,3420],{"class":420},[410,5313,3423],{"class":420},[410,5315,3426],{"class":420},[410,5317,3429],{"class":1605},[410,5319,5320],{"class":420}," hl-val1-basesepolia\n",[410,5322,5323,5325,5327,5329,5331,5333],{"class":412,"line":493},[410,5324,2543],{"class":416},[410,5326,3420],{"class":420},[410,5328,3423],{"class":420},[410,5330,3426],{"class":420},[410,5332,3429],{"class":1605},[410,5334,3432],{"class":420},[400,5336,5339],{"className":402,"code":5337,"filename":5338,"language":405,"meta":406,"style":406},"for f in bitsong-val1 basesepolia-val1; do echo \"$f: $(aws s3 ls --recursive s3:\u002F\u002F$S3_BUCKET\u002F$f\u002F | grep -c checkpoint)\"; done\n","Checkpoint su S3",[145,5340,5341],{"__ignoreMap":406},[410,5342,5343,5347,5350,5353,5355,5357,5359,5362,5365,5367,5370,5373,5375,5377,5380,5382,5385,5387,5390,5392,5394,5397,5400,5402],{"class":412,"line":413},[410,5344,5346],{"class":5345},"s7zQu","for",[410,5348,5349],{"class":439}," f ",[410,5351,5352],{"class":5345},"in",[410,5354,2768],{"class":420},[410,5356,2956],{"class":420},[410,5358,3659],{"class":443},[410,5360,5361],{"class":5345}," do",[410,5363,5364],{"class":3057}," echo",[410,5366,1069],{"class":443},[410,5368,5369],{"class":439},"$f",[410,5371,5372],{"class":420},": ",[410,5374,1483],{"class":443},[410,5376,979],{"class":416},[410,5378,5379],{"class":420}," s3 ls --recursive s3:\u002F\u002F",[410,5381,1201],{"class":439},[410,5383,5384],{"class":420},"\u002F",[410,5386,5369],{"class":439},[410,5388,5389],{"class":420},"\u002F ",[410,5391,444],{"class":443},[410,5393,3186],{"class":416},[410,5395,5396],{"class":420}," -c checkpoint",[410,5398,5399],{"class":443},")\"",[410,5401,3659],{"class":443},[410,5403,5404],{"class":5345}," done\n",[5406,5407,5408,5460,5498,5522,5533,5543,5560,5574],"accordion",{},[5409,5410,5413,5414,5417,5418,5421,5422,5424,5425,5428,5429,5432,5433,5436,5437,5439,5440,5443,5444,5447,5448,5451,5452,5455,5456,5459],"accordion-item",{"icon":5411,"label":5412},"i-lucide-circle-help","Nessun checkpoint su S3 → relayer 'Unable to reach quorum'","Causa più comune con S3: bucket ",[141,5415,5416],{},"non public-read",". I validator leggono i checkpoint ",[141,5419,5420],{},"in modo anonimo","; con bucket privato la GET anonima torna ",[141,5423,1157],{}," e il ",[145,5426,5427],{},"TipCheckpointSubmitter"," ritenta all'infinito su ",[145,5430,5431],{},"hyperlane-base\u002Fsrc\u002Ftypes\u002Fs3_storage.rs:101"," (stessa riga di ",[145,5434,5435],{},"Failed to read reorg status",") senza scrivere ",[145,5438,1165],{},". Applica la ",[141,5441,5442],{},"bucket policy public-read"," (vedi ",[160,5445,3600],{"href":5446},"#crea-il-bucket-s3-dei-checkpoint-deve-essere-public-read","): GET anonima su chiave mancante deve dare ",[141,5449,5450],{},"404",", non 403. Le scritture richiedono ACL abilitate (",[145,5453,5454],{},"ObjectOwnership=ObjectWriter","). A un tip tranquillo ",[145,5457,5458],{},"checkpoint_queue_len: 0"," è normale finché non arriva un nuovo messaggio.",[5409,5461,5463,5464,5467,5468,606,5470,391,5472,5474,5475,5477,5478,5482,5483,5486,5487,5489,5490,5493,5494,5497],{"icon":5411,"label":5462},"RPC Cosmos sovraccarico \u002F 502 durante il sync","Il validator Cosmos costruisce il tree ",[141,5465,5466],{},"dallo stato chain (gRPC)",": usa ",[145,5469,2500],{},[141,5471,2503],{},[145,5473,5242],{},". Con ",[145,5476,2507],{}," più agenti scansionano milioni di blocchi ed ",[141,5479,2511,5480],{},[145,5481,2514],{}," dell'RPC (HTTP non risponde, 502 \u002F connection reset; la chain resta sana). Riduci il carico: ",[145,5484,5485],{},"index.from"," recente, ",[145,5488,2039],{}," ~500, ",[145,5491,5492],{},"--ulimit nofile=65536",", e usa l'",[141,5495,5496],{},"IP diretto"," del nodo.",[5409,5499,5501,5502,5504,5505,631,5507,5509,5510,5513,5514,5516,5517,5519,5520,3401],{"icon":5411,"label":5500},"Base Sepolia: 'please limit the query to at most 1000 blocks'","L'RPC Coinbase CDP limita ",[145,5503,630],{}," a 1000 blocchi: imposta ",[145,5506,2526],{},[141,5508,642],{}," (un range di 1000 inclusi = 1001 → rifiutato). L'RPC pubblico ",[145,5511,5512],{},"sepolia.base.org"," limita a 2000 e va in rate-limit: preferisci CDP ",[145,5515,624],{}," (il path ",[145,5518,613],{}," è la mainnet ",[145,5521,620],{},[5409,5523,5525,5526,5528,5529,5532],{"icon":5411,"label":5524},"validator addresses are not sorted correctly","La lista per ",[145,5527,3610],{}," (e per il factory ISM lato EVM) va ",[141,5530,5531],{},"ordinata crescente per byte"," (hex). Riordina e riprova.",[5409,5534,5536,5537,5540,5541,256],{"icon":5411,"label":5535},"set-routing-ism-domain non cambia la rotta","Non sovrascrive un dominio già mappato: ",[145,5538,5539],{},"remove-routing-ism-domain",", attendi l'inclusione, poi ",[145,5542,4102],{},[5409,5544,5546,5549,5550,5553,5554,5556,5557,256],{"icon":5411,"label":5545},"txhash vuoto dopo una tx (con --gas auto)",[145,5547,5548],{},"--gas auto"," stampa ",[145,5551,5552],{},"gas estimate: N"," prima del JSON, rompendo ",[145,5555,255],{},". Estrai così: ",[145,5558,5559],{},"... -y 2>&1 | grep -o '\"txhash\":\"[A-Fa-f0-9]*\"' | head -1 | cut -d'\"' -f4",[5409,5561,5563,5564,5566,5567,5570,5571,256],{"icon":5411,"label":5562},"Permission denied su \u002Fhyperlane_db \u002F Too many open files","Avvia i container con ",[145,5565,3007],{}," (o ",[145,5568,5569],{},"$(id -u):$(id -g)",") e ",[145,5572,5573],{},"--ulimit nofile=65536:65536",[5409,5575,5577,5578,5580,5581,5583],{"icon":5411,"label":5576},"Il validator non annuncia","BitSong: l'account Cosmos di firma ha bisogno di ",[141,5579,286],{}," per il gas. Base Sepolia: l'indirizzo KMS del validator ha bisogno di ",[141,5582,290],{},". Finanzia e riavvia il container.",[5585,5586,5587,5592,5596],"card-group",{},[5588,5589,5591],"card",{"icon":44,"title":5590,"to":42},"Agent Keys (AWS KMS\u002FS3)","Setup di produzione: IAM, KMS e bucket S3.",[5588,5593,5595],{"icon":57,"title":5594,"to":55},"Warp Token","Deploy del warp route ed enrollment dei router.",[5588,5597,5599],{"icon":72,"title":5598,"to":65},"Entra nel Multisig (IT)","Aggiungersi come validator a un bridge esistente con AWS.",[5601,5602,5603],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":406,"searchDepth":459,"depth":459,"links":5605},[5606,5607,5611,5620,5621,5622,5623,5626,5627,5628],{"id":227,"depth":459,"text":228},{"id":318,"depth":459,"text":319,"children":5608},[5609,5610],{"id":561,"depth":493,"text":562},{"id":650,"depth":493,"text":651},{"id":922,"depth":459,"text":923,"children":5612},[5613,5614,5615,5616,5618,5619],{"id":972,"depth":493,"text":973},{"id":1137,"depth":493,"text":1138},{"id":1438,"depth":493,"text":1439},{"id":1532,"depth":493,"text":5617},"Crea l'agent-config.json",{"id":2532,"depth":493,"text":2533},{"id":3021,"depth":493,"text":3022},{"id":3194,"depth":459,"text":3195},{"id":3568,"depth":459,"text":3569},{"id":3956,"depth":459,"text":3957},{"id":4137,"depth":459,"text":4138,"children":5624},[5625],{"id":4324,"depth":493,"text":4325},{"id":4594,"depth":459,"text":4595},{"id":4916,"depth":459,"text":4917},{"id":5248,"depth":459,"text":5249},"Runbook operativo (validato end-to-end) per validator e relayer in AWS KMS + S3, rotazione del multisig 2\u002F3 e test di trasferimento warp sul bridge Hyperlane BitSong (crescendo-1) ↔ Base Sepolia.","md",null,{},{"icon":76},{"title":5635,"description":5636},"Runbook Bridge Hyperlane BitSong - Validator, Relayer, Multisig 2\u002F3","Procedura validata end-to-end per avviare 3 validator + relayer in AWS KMS\u002FS3 sincronizzati con i nodi pubblici, ruotare il MultisigISM 2\u002F3 su entrambi i lati e testare i trasferimenti warp BitSong ↔ Base Sepolia.","MCoCWekx3VjGksRfwxYsqfPKVfb-zK7MW2NT77O7L98",[5639,5641],{"title":69,"path":70,"stem":71,"description":5640,"icon":72,"children":-1},"Owner procedure to change the Hyperlane validator set or threshold on the live BitSong crescendo-1 bridge by creating a new MultisigISM and re-pointing both sides.",{"title":11,"path":91,"stem":92,"description":5642,"icon":14,"children":-1},"Developer overview of the BitSong crescendo-1 testnet with chain specs, endpoints, and tools.",1781776025524]