[{"data":1,"prerenderedAt":3846},["ShallowReactive",2],{"navigation_docs":3,"-operators-hyperlane-join-multisig":131,"-operators-hyperlane-join-multisig-surround":3841},[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":64,"body":133,"description":3832,"extension":3833,"links":3834,"meta":3835,"navigation":3836,"path":65,"seo":3837,"stem":66,"__hash__":3840},"docs\u002F1.operators\u002F7.hyperlane\u002F6.join-multisig.md",{"type":134,"value":135,"toc":3810},"minimark",[136,162,173,192,206,215,220,231,248,255,305,308,329,333,343,388,504,523,527,592,664,668,676,703,721,728,748,754,757,820,833,836,886,904,910,920,926,932,938,941,949,967,971,974,1001,1038,1190,1228,1232,1246,1251,1259,1262,1370,1380,1384,1391,1470,1473,1575,1579,1597,1600,1676,1720,1730,2681,2714,2755,2791,2795,2802,2821,2850,2854,3156,3170,3174,3189,3443,3447,3450,3501,3508,3590,3597,3600,3643,3647,3789,3793,3806],[137,138,139,140,144,145,149,150,153,154,157,158,161],"p",{},"This guide explains ",[141,142,143],"strong",{},"how to join the validator multisig"," of the BitSong Hyperlane bridge (",[146,147,148],"code",{},"crescendo-1"," ↔ Base Sepolia) using a ",[141,151,152],{},"production AWS"," setup: signing key in ",[141,155,156],{},"AWS KMS"," and checkpoints in ",[141,159,160],{},"S3",".",[137,163,164,165,168,169,172],{},"It is for operators joining an ",[141,166,167],{},"existing"," bridge: you do ",[141,170,171],{},"not"," deploy the Mailbox, ISMs, or hooks — those already exist. You only generate your key, get added to the multisig, and start your validators.",[137,174,175,176,184,185,188,189,191],{},"It follows the ",[177,178,183],"a",{"href":179,"rel":180,"target":182},"https:\u002F\u002Fdocs.hyperlane.xyz\u002Fdocs\u002Foperate\u002Fvalidators\u002Frun-validators",[181],"nofollow","_blank","official Hyperlane documentation"," adapted for BitSong. For the full AWS console walkthrough and the run\u002Foperate details, see the ",[177,186,187],{"href":42},"Agent Keys"," and ",[177,190,50],{"href":51}," guides.",[193,194,195,196,199,200,202,203,205],"warning",{},"This is a ",[141,197,198],{},"production"," setup: no plaintext EVM private keys, no checkpoints on the local filesystem. It uses ",[141,201,156],{}," for signing and ",[141,204,160],{}," for checkpoint storage.",[207,208,210,211,214],"tip",{"title":209},"Tested end-to-end","This flow has been verified on the field: KMS key creation, address derivation, joining the MultisigISM, starting a second AWS-KMS validator, and a successful ",[141,212,213],{},"on-chain announcement"," on Base Sepolia.",[216,217,219],"h2",{"id":218},"how-joining-works","How joining works",[137,221,222,223,226,227,230],{},"The multisig is enforced on-chain by a ",[141,224,225],{},"MessageId Multisig ISM",": it holds the list of validator EVM addresses and a ",[141,228,229],{},"threshold"," of required signatures.",[193,232,233,234,237,238,241,242,245,246,161],{},"On Hyperlane the ",[141,235,236],{},"MultisigISM is immutable",": there is no command to add a validator to an existing ISM. To add you, the bridge ",[141,239,240],{},"owner"," must ",[141,243,244],{},"create a new MultisigISM"," with the updated list and re-point the RoutingISM route to it. That owner procedure is documented in ",[177,247,69],{"href":70},[137,249,250,251,254],{},"There are therefore ",[141,252,253],{},"two roles",":",[256,257,258,274],"table",{},[259,260,261],"thead",{},[262,263,264,268,271],"tr",{},[265,266,267],"th",{},"Role",[265,269,270],{},"Who",[265,272,273],{},"What they do",[275,276,277,292],"tbody",{},[262,278,279,286,289],{},[280,281,282,285],"td",{},[141,283,284],{},"Operator"," (you)",[280,287,288],{},"New validator",[280,290,291],{},"Create the KMS key, share the EVM address, run the validators",[262,293,294,299,302],{},[280,295,296],{},[141,297,298],{},"Bridge owner",[280,300,301],{},"BitSong team",[280,303,304],{},"Create the new MultisigISM with your address and update the RoutingISM",[137,306,307],{},"The full flow:",[309,310,312,317,321,325],"steps",{"level":311},"3",[313,314,316],"h3",{"id":315},"you-prepare-the-aws-resources-and-derive-the-validator-address","You prepare the AWS resources and derive the validator address",[313,318,320],{"id":319},"you-send-your-evm-address-to-the-bitsong-team","You send your EVM address to the BitSong team",[313,322,324],{"id":323},"the-bitsong-team-adds-you-to-the-multisig-new-ism-new-threshold","The BitSong team adds you to the multisig (new ISM + new threshold)",[313,326,328],{"id":327},"you-start-the-two-validators-and-wait-for-the-announcement","You start the two validators and wait for the announcement",[216,330,332],{"id":331},"bridge-parameters-crescendo-1","Bridge parameters (crescendo-1)",[137,334,335,336,339,340,161],{},"These are the ",[141,337,338],{},"real"," IDs of the bridge currently in production. You need them for the ",[146,341,342],{},"agent-config.json",[344,345,346,354,358,364,370,376],"field-group",{},[347,348,351],"field",{"name":349,"type":350},"Mailbox ID (BitSong)","hex",[146,352,353],{},"0x68797065726c616e650000000000000000000000000000000000000000000000",[347,355,357],{"name":356,"type":350},"validatorAnnounce (BitSong)","Same value as the Mailbox ID (on Cosmos the announcement is handled by the mailbox module).",[347,359,361],{"name":360,"type":350},"MerkleTreeHook (BitSong)",[146,362,363],{},"0x726f757465725f706f73745f6469737061746368000000030000000000000000",[347,365,367],{"name":366,"type":350},"IGP (BitSong)",[146,368,369],{},"0x726f757465725f706f73745f6469737061746368000000040000000000000001",[347,371,373],{"name":372,"type":350},"RoutingISM (BitSong)",[146,374,375],{},"0x726f757465725f69736d00000000000000000000000000010000000000000001",[347,377,380,381,384,385],{"name":378,"type":379},"Domain ID","number","BitSong: ",[146,382,383],{},"71717171"," — Base Sepolia: ",[146,386,387],{},"84532",[389,390,391,394],"note",{},[137,392,393],{},"If these IDs ever change, recover them from the node:",[395,396,402],"pre",{"className":397,"code":398,"filename":399,"language":400,"meta":401,"style":401},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bitsongd query hyperlane mailboxes --output json | jq '.mailboxes'\nbitsongd query hyperlane hooks merkle-tree-hooks --output json | jq '.merkle_tree_hooks'\nbitsongd query hyperlane hooks igps --output json | jq '.igps'\n","Terminal","bash","",[146,403,404,445,475],{"__ignoreMap":401},[405,406,409,413,417,420,423,426,429,433,436,439,442],"span",{"class":407,"line":408},"line",1,[405,410,412],{"class":411},"sBMFI","bitsongd",[405,414,416],{"class":415},"sfazB"," query",[405,418,419],{"class":415}," hyperlane",[405,421,422],{"class":415}," mailboxes",[405,424,425],{"class":415}," --output",[405,427,428],{"class":415}," json",[405,430,432],{"class":431},"sMK4o"," |",[405,434,435],{"class":411}," jq",[405,437,438],{"class":431}," '",[405,440,441],{"class":415},".mailboxes",[405,443,444],{"class":431},"'\n",[405,446,448,450,452,454,457,460,462,464,466,468,470,473],{"class":407,"line":447},2,[405,449,412],{"class":411},[405,451,416],{"class":415},[405,453,419],{"class":415},[405,455,456],{"class":415}," hooks",[405,458,459],{"class":415}," merkle-tree-hooks",[405,461,425],{"class":415},[405,463,428],{"class":415},[405,465,432],{"class":431},[405,467,435],{"class":411},[405,469,438],{"class":431},[405,471,472],{"class":415},".merkle_tree_hooks",[405,474,444],{"class":431},[405,476,478,480,482,484,486,489,491,493,495,497,499,502],{"class":407,"line":477},3,[405,479,412],{"class":411},[405,481,416],{"class":415},[405,483,419],{"class":415},[405,485,456],{"class":415},[405,487,488],{"class":415}," igps",[405,490,425],{"class":415},[405,492,428],{"class":415},[405,494,432],{"class":431},[405,496,435],{"class":411},[405,498,438],{"class":431},[405,500,501],{"class":415},".igps",[405,503,444],{"class":431},[389,505,507,508,510,511,514,515,518,519,522],{"title":506},"Reference deployment mode","On the current ",[146,509,148],{}," deployment the bridge validators run in ",[141,512,513],{},"local"," mode (hex key + filesystem checkpoints), not AWS. This ",[141,516,517],{},"does not change"," the joining procedure: the MultisigISM stores only ",[141,520,521],{},"EVM addresses",", so an AWS-KMS validator and a hex-key validator can coexist in the same multisig. This guide uses AWS because it is the recommended production approach.",[216,524,526],{"id":525},"prerequisites","Prerequisites",[528,529,530,538,549,559,565,571,585],"ul",{},[531,532,533,534,537],"li",{},"A ",[141,535,536],{},"VPS"," (Ubuntu 22.04\u002F24.04, 2 vCPU, 2 GB RAM, 20 GB disk recommended)",[531,539,540,543,544,548],{},[141,541,542],{},"Docker"," installed and working (",[177,545,547],{"href":546},"\u002Foperators\u002Fhyperlane\u002Fvalidators#install-docker","guide",")",[531,550,551,554,555,558],{},[141,552,553],{},"Foundry"," installed (provides ",[146,556,557],{},"cast",", needed to derive the address from KMS)",[531,560,561,562],{},"An ",[141,563,564],{},"AWS account",[531,566,533,567,570],{},[141,568,569],{},"private Base Sepolia RPC"," endpoint (do not use public RPCs in production)",[531,572,573,574,577,578,581,582,548],{},"Access to a ",[141,575,576],{},"synced BitSong node"," (RPC ",[146,579,580],{},"26657"," + gRPC ",[146,583,584],{},"9090",[531,586,587,588,591],{},"A Cosmos account funded with ",[141,589,590],{},"TBTSG"," to pay for the announcement gas",[395,593,595],{"className":397,"code":594,"filename":399,"language":400,"meta":401,"style":401},"sudo apt-get update && sudo apt-get install -y jq awscli\ncurl -L https:\u002F\u002Ffoundry.paradigm.xyz | bash && source ~\u002F.bashrc && foundryup\ncast --version\n",[146,596,597,627,657],{"__ignoreMap":401},[405,598,599,602,605,608,611,614,616,619,622,624],{"class":407,"line":408},[405,600,601],{"class":411},"sudo",[405,603,604],{"class":415}," apt-get",[405,606,607],{"class":415}," update",[405,609,610],{"class":431}," &&",[405,612,613],{"class":411}," sudo",[405,615,604],{"class":415},[405,617,618],{"class":415}," install",[405,620,621],{"class":415}," -y",[405,623,435],{"class":415},[405,625,626],{"class":415}," awscli\n",[405,628,629,632,635,638,640,643,645,649,652,654],{"class":407,"line":447},[405,630,631],{"class":411},"curl",[405,633,634],{"class":415}," -L",[405,636,637],{"class":415}," https:\u002F\u002Ffoundry.paradigm.xyz",[405,639,432],{"class":431},[405,641,642],{"class":411}," bash",[405,644,610],{"class":431},[405,646,648],{"class":647},"s2Zo4"," source",[405,650,651],{"class":415}," ~\u002F.bashrc",[405,653,610],{"class":431},[405,655,656],{"class":411}," foundryup\n",[405,658,659,661],{"class":407,"line":477},[405,660,557],{"class":411},[405,662,663],{"class":415}," --version\n",[216,665,667],{"id":666},"step-1-create-the-aws-resources","Step 1 — Create the AWS resources",[137,669,670,671,675],{},"Create the three AWS resources following the detailed ",[177,672,674],{"href":673},"\u002Foperators\u002Fhyperlane\u002Fagent-keys#aws-environment-production","Agent Keys → AWS Environment"," guide:",[677,678,679,689,696],"ol",{},[531,680,681,684,685,688],{},[141,682,683],{},"IAM user"," (e.g. ",[146,686,687],{},"hyperlane-validator-bitsong",") with an access key for \"Application running outside AWS\"",[531,690,691,692,695],{},"Asymmetric ",[141,693,694],{},"KMS key"," for validator signing",[531,697,698,699,702],{},"Publicly readable ",[141,700,701],{},"S3 bucket"," for checkpoints",[137,704,705,706,709,710,713,714,717,718,161],{},"For the IAM user ",[141,707,708],{},"access key",": console → IAM → Users → (your user) → ",[141,711,712],{},"Security credentials"," → ",[141,715,716],{},"Create access key"," → use case ",[141,719,720],{},"\"Application running outside AWS\"",[137,722,723],{},[724,725],"img",{"alt":726,"src":727},"IAM – Use case: Application running outside AWS","\u002Fimages\u002Fhyperlane\u002Fjoin-multisig\u002F05-iam-access-key-usecase.png",[729,730,731,732,735,736,739,740,743,744,747],"caution",{},"The ",[141,733,734],{},"secret access key"," is shown ",[141,737,738],{},"only once",". Download the ",[146,741,742],{},".csv"," or copy it immediately; it cannot be recovered. Treat it like a password: keep it only in the server's environment file (",[146,745,746],{},"chmod 600","), never in a repository.",[137,749,750],{},[724,751],{"alt":752,"src":753},"IAM – Access key created (secret masked)","\u002Fimages\u002Fhyperlane\u002Fjoin-multisig\u002F06-iam-access-key-creata.png",[137,755,756],{},"Configure the environment on the server:",[395,758,760],{"className":397,"code":759,"filename":399,"language":400,"meta":401,"style":401},"export AWS_ACCESS_KEY_ID=\"\u003Cyour-access-key-id>\"\nexport AWS_SECRET_ACCESS_KEY=\"\u003Cyour-secret-access-key>\"\nexport AWS_REGION=\"us-east-1\"   # use your region\n",[146,761,762,784,800],{"__ignoreMap":401},[405,763,764,768,772,775,778,781],{"class":407,"line":408},[405,765,767],{"class":766},"spNyl","export",[405,769,771],{"class":770},"sTEyZ"," AWS_ACCESS_KEY_ID",[405,773,774],{"class":431},"=",[405,776,777],{"class":431},"\"",[405,779,780],{"class":415},"\u003Cyour-access-key-id>",[405,782,783],{"class":431},"\"\n",[405,785,786,788,791,793,795,798],{"class":407,"line":447},[405,787,767],{"class":766},[405,789,790],{"class":770}," AWS_SECRET_ACCESS_KEY",[405,792,774],{"class":431},[405,794,777],{"class":431},[405,796,797],{"class":415},"\u003Cyour-secret-access-key>",[405,799,783],{"class":431},[405,801,802,804,807,809,811,814,816],{"class":407,"line":477},[405,803,767],{"class":766},[405,805,806],{"class":770}," AWS_REGION",[405,808,774],{"class":431},[405,810,777],{"class":431},[405,812,813],{"class":415},"us-east-1",[405,815,777],{"class":431},[405,817,819],{"class":818},"sHwdD","   # use your region\n",[193,821,822,825,826,829,830,161],{},[146,823,824],{},"AWS_REGION"," is ",[141,827,828],{},"required",". Without it the agent fails with ",[146,831,832],{},"Invalid Configuration: Missing Region",[137,834,835],{},"Create the KMS key with these parameters:",[256,837,838,848],{},[259,839,840],{},[262,841,842,845],{},[265,843,844],{},"Setting",[265,846,847],{},"Value",[275,849,850,858,866,876],{},[262,851,852,855],{},[280,853,854],{},"Key type",[280,856,857],{},"Asymmetric",[262,859,860,863],{},[280,861,862],{},"Key usage",[280,864,865],{},"Sign and verify",[262,867,868,871],{},[280,869,870],{},"Key spec",[280,872,873],{},[146,874,875],{},"ECC_SECG_P256K1",[262,877,878,881],{},[280,879,880],{},"Alias",[280,882,883],{},[146,884,885],{},"hyperlane-validator-signer-bitsong",[137,887,888,889,892,893,895,896,898,899,903],{},"In the KMS console, ",[141,890,891],{},"Create key → Configure key",": select ",[141,894,857],{},", ",[141,897,865],{},", and the spec ",[141,900,901],{},[146,902,875],{}," (the secp256k1 curve used by Ethereum and Hyperlane).",[137,905,906],{},[724,907],{"alt":908,"src":909},"KMS – Configure key: Asymmetric, Sign and verify, ECC_SECG_P256K1","\u002Fimages\u002Fhyperlane\u002Fjoin-multisig\u002F01-kms-configura-chiave.png",[137,911,912,913,916,917,919],{},"In the ",[141,914,915],{},"Define key usage permissions"," step, select the validator's ",[141,918,683],{}," so the agent can sign with the key:",[137,921,922],{},[724,923],{"alt":924,"src":925},"KMS – Key users: select the validator IAM user","\u002Fimages\u002Fhyperlane\u002Fjoin-multisig\u002F02-kms-utenti-chiave.png",[137,927,928,929,254],{},"Once finished, the key appears under ",[141,930,931],{},"Customer managed keys",[137,933,934],{},[724,935],{"alt":936,"src":937},"KMS – Key created","\u002Fimages\u002Fhyperlane\u002Fjoin-multisig\u002F04-kms-chiave-creata.png",[137,939,940],{},"And an S3 bucket (same region) with this name:",[395,942,947],{"className":943,"code":945,"filename":701,"language":946,"meta":401},[944],"language-text","hyperlane-validator-signatures-bitsong\n","text",[146,948,945],{"__ignoreMap":401},[137,950,951,952,955,956,959,960,963,964,161],{},"The bucket policy (public read + write only for your IAM user) is documented in the ",[177,953,187],{"href":954},"\u002Foperators\u002Fhyperlane\u002Fagent-keys#create-an-s3-bucket-for-checkpoint-storage"," guide. The bucket ",[141,957,958],{},"must be publicly readable",", otherwise the validator never writes its checkpoints — verify an anonymous GET on a missing key returns ",[141,961,962],{},"404",", not ",[141,965,966],{},"403",[216,968,970],{"id":969},"step-2-derive-your-validator-evm-address","Step 2 — Derive your validator EVM address",[137,972,973],{},"This is the address that will go into the multisig. Derive it from the KMS key:",[395,975,977],{"className":397,"code":976,"filename":399,"language":400,"meta":401,"style":401},"AWS_KMS_KEY_ID=alias\u002Fhyperlane-validator-signer-bitsong cast wallet address --aws\n",[146,978,979],{"__ignoreMap":401},[405,980,981,984,986,989,992,995,998],{"class":407,"line":408},[405,982,983],{"class":770},"AWS_KMS_KEY_ID",[405,985,774],{"class":431},[405,987,988],{"class":415},"alias\u002Fhyperlane-validator-signer-bitsong",[405,990,991],{"class":411}," cast",[405,993,994],{"class":415}," wallet",[405,996,997],{"class":415}," address",[405,999,1000],{"class":415}," --aws\n",[395,1002,1004],{"className":397,"code":1003,"filename":399,"language":400,"meta":401,"style":401},"export VALIDATOR_ADDR=\"0x\u003Ckms-derived-validator-address>\"\necho \"Validator address to register in the multisig: $VALIDATOR_ADDR\"\n",[146,1005,1006,1022],{"__ignoreMap":401},[405,1007,1008,1010,1013,1015,1017,1020],{"class":407,"line":408},[405,1009,767],{"class":766},[405,1011,1012],{"class":770}," VALIDATOR_ADDR",[405,1014,774],{"class":431},[405,1016,777],{"class":431},[405,1018,1019],{"class":415},"0x\u003Ckms-derived-validator-address>",[405,1021,783],{"class":431},[405,1023,1024,1027,1030,1033,1036],{"class":407,"line":447},[405,1025,1026],{"class":647},"echo",[405,1028,1029],{"class":431}," \"",[405,1031,1032],{"class":415},"Validator address to register in the multisig: ",[405,1034,1035],{"class":770},"$VALIDATOR_ADDR",[405,1037,783],{"class":431},[207,1039,1041,1059,1179],{"title":1040},"No access key? Derive the address from the public key",[137,1042,1043,1044,1047,1048,1051,1052,1055,1056,1058],{},"The EVM address depends only on the ",[141,1045,1046],{},"public key",", which is not a secret. In the KMS console open the key → ",[141,1049,1050],{},"Public key"," tab, copy the PEM, and compute the address locally (needs only ",[146,1053,1054],{},"openssl"," + ",[146,1057,557],{},"):",[395,1060,1062],{"className":397,"code":1061,"filename":399,"language":400,"meta":401,"style":401},"# save the PEM to pk.pem, then:\nPOINT=$(openssl pkey -pubin -in pk.pem -outform DER | tail -c 65 | xxd -p | tr -d '\\n')\ncast to-checksum-address 0x$(cast keccak 0x${POINT:2} | cut -c27-66)\n",[146,1063,1064,1069,1136],{"__ignoreMap":401},[405,1065,1066],{"class":407,"line":408},[405,1067,1068],{"class":818},"# save the PEM to pk.pem, then:\n",[405,1070,1071,1074,1077,1079,1082,1085,1088,1091,1094,1097,1099,1102,1105,1109,1111,1114,1117,1119,1122,1125,1127,1130,1133],{"class":407,"line":447},[405,1072,1073],{"class":770},"POINT",[405,1075,1076],{"class":431},"=$(",[405,1078,1054],{"class":411},[405,1080,1081],{"class":415}," pkey",[405,1083,1084],{"class":415}," -pubin",[405,1086,1087],{"class":415}," -in",[405,1089,1090],{"class":415}," pk.pem",[405,1092,1093],{"class":415}," -outform",[405,1095,1096],{"class":415}," DER",[405,1098,432],{"class":431},[405,1100,1101],{"class":411}," tail",[405,1103,1104],{"class":415}," -c",[405,1106,1108],{"class":1107},"sbssI"," 65",[405,1110,432],{"class":431},[405,1112,1113],{"class":411}," xxd",[405,1115,1116],{"class":415}," -p",[405,1118,432],{"class":431},[405,1120,1121],{"class":411}," tr",[405,1123,1124],{"class":415}," -d",[405,1126,438],{"class":431},[405,1128,1129],{"class":415},"\\n",[405,1131,1132],{"class":431},"'",[405,1134,1135],{"class":431},")\n",[405,1137,1138,1140,1143,1146,1149,1151,1154,1156,1159,1161,1163,1166,1169,1171,1174,1177],{"class":407,"line":477},[405,1139,557],{"class":411},[405,1141,1142],{"class":415}," to-checksum-address",[405,1144,1145],{"class":415}," 0x",[405,1147,1148],{"class":431},"$(",[405,1150,557],{"class":411},[405,1152,1153],{"class":415}," keccak",[405,1155,1145],{"class":415},[405,1157,1158],{"class":431},"${",[405,1160,1073],{"class":770},[405,1162,254],{"class":431},[405,1164,1165],{"class":770},"2",[405,1167,1168],{"class":431},"}",[405,1170,432],{"class":431},[405,1172,1173],{"class":411}," cut",[405,1175,1176],{"class":415}," -c27-66",[405,1178,1135],{"class":431},[137,1180,1181,1182,1185,1186,1189],{},"The address is the last 20 bytes of ",[146,1183,1184],{},"keccak256(uncompressed-public-key)"," — exactly what ",[146,1187,1188],{},"cast wallet address --aws"," does, but without credentials.",[207,1191,1192,1195],{},[137,1193,1194],{},"Verify S3 write access before continuing:",[395,1196,1198],{"className":397,"code":1197,"filename":399,"language":400,"meta":401,"style":401},"aws s3 cp \u002Fetc\u002Fhostname s3:\u002F\u002Fhyperlane-validator-signatures-bitsong\u002Fhealthcheck.txt\naws s3 rm s3:\u002F\u002Fhyperlane-validator-signatures-bitsong\u002Fhealthcheck.txt\n",[146,1199,1200,1217],{"__ignoreMap":401},[405,1201,1202,1205,1208,1211,1214],{"class":407,"line":408},[405,1203,1204],{"class":411},"aws",[405,1206,1207],{"class":415}," s3",[405,1209,1210],{"class":415}," cp",[405,1212,1213],{"class":415}," \u002Fetc\u002Fhostname",[405,1215,1216],{"class":415}," s3:\u002F\u002Fhyperlane-validator-signatures-bitsong\u002Fhealthcheck.txt\n",[405,1218,1219,1221,1223,1226],{"class":407,"line":447},[405,1220,1204],{"class":411},[405,1222,1207],{"class":415},[405,1224,1225],{"class":415}," rm",[405,1227,1216],{"class":415},[216,1229,1231],{"id":1230},"step-3-send-your-address-to-the-bitsong-team","Step 3 — Send your address to the BitSong team",[137,1233,1234,1235,1238,1239,1241,1242,1245],{},"Share ",[141,1236,1237],{},"only the EVM address"," (",[146,1240,1035],{},") with the team — ",[141,1243,1244],{},"never"," the private key or AWS credentials.",[137,1247,1248,1249,161],{},"The BitSong team (bridge owner) re-creates the MultisigISM with the updated validator list and re-points the route. The exact owner commands are documented in ",[177,1250,69],{"href":70},[389,1252,731,1253,1255,1256,1258],{},[141,1254,229],{}," defines how many signatures are required for a message to be accepted. With 3 validators, a threshold of ",[146,1257,1165],{}," keeps the bridge operational even if one validator goes offline.",[137,1260,1261],{},"When the operation is complete, verify your address is in the active multisig:",[395,1263,1265],{"className":397,"code":1264,"filename":399,"language":400,"meta":401,"style":401},"# ID of the MultisigISM currently pointed to by the Base Sepolia route\nACTIVE_ISM=$(bitsongd query hyperlane ism isms --output json \\\n  | jq -r '.isms[] | select(.\"@type\" | test(\"RoutingISM\")) | .routes[] | select(.domain==84532) | .ism')\n\nbitsongd query hyperlane ism isms --output json \\\n  | jq --arg id \"$ACTIVE_ISM\" '.isms[] | select(.id==$id) | {id, validators, threshold}'\n",[146,1266,1267,1272,1298,1317,1324,1343],{"__ignoreMap":401},[405,1268,1269],{"class":407,"line":408},[405,1270,1271],{"class":818},"# ID of the MultisigISM currently pointed to by the Base Sepolia route\n",[405,1273,1274,1277,1279,1281,1283,1285,1288,1291,1293,1295],{"class":407,"line":447},[405,1275,1276],{"class":770},"ACTIVE_ISM",[405,1278,1076],{"class":431},[405,1280,412],{"class":411},[405,1282,416],{"class":415},[405,1284,419],{"class":415},[405,1286,1287],{"class":415}," ism",[405,1289,1290],{"class":415}," isms",[405,1292,425],{"class":415},[405,1294,428],{"class":415},[405,1296,1297],{"class":770}," \\\n",[405,1299,1300,1303,1305,1308,1310,1313,1315],{"class":407,"line":477},[405,1301,1302],{"class":431},"  |",[405,1304,435],{"class":411},[405,1306,1307],{"class":415}," -r",[405,1309,438],{"class":431},[405,1311,1312],{"class":415},".isms[] | select(.\"@type\" | test(\"RoutingISM\")) | .routes[] | select(.domain==84532) | .ism",[405,1314,1132],{"class":431},[405,1316,1135],{"class":431},[405,1318,1320],{"class":407,"line":1319},4,[405,1321,1323],{"emptyLinePlaceholder":1322},true,"\n",[405,1325,1327,1329,1331,1333,1335,1337,1339,1341],{"class":407,"line":1326},5,[405,1328,412],{"class":411},[405,1330,416],{"class":415},[405,1332,419],{"class":415},[405,1334,1287],{"class":415},[405,1336,1290],{"class":415},[405,1338,425],{"class":415},[405,1340,428],{"class":415},[405,1342,1297],{"class":770},[405,1344,1346,1348,1350,1353,1356,1358,1361,1363,1365,1368],{"class":407,"line":1345},6,[405,1347,1302],{"class":431},[405,1349,435],{"class":411},[405,1351,1352],{"class":415}," --arg",[405,1354,1355],{"class":415}," id",[405,1357,1029],{"class":431},[405,1359,1360],{"class":770},"$ACTIVE_ISM",[405,1362,777],{"class":431},[405,1364,438],{"class":431},[405,1366,1367],{"class":415},".isms[] | select(.id==$id) | {id, validators, threshold}",[405,1369,444],{"class":431},[137,1371,1372,1373,1375,1376,1379],{},"Your ",[146,1374,1035],{}," must appear in the ",[146,1377,1378],{},"validators"," array.",[216,1381,1383],{"id":1382},"step-4-create-the-cosmos-announcement-key","Step 4 — Create the Cosmos announcement key",[137,1385,1386,1387,1390],{},"BitSong is a Cosmos chain: checkpoint signing uses KMS, but the on-chain ",[141,1388,1389],{},"announcement transaction"," needs a Cosmos key (hex format).",[395,1392,1394],{"className":397,"code":1393,"filename":399,"language":400,"meta":401,"style":401},"bitsongd keys add hyperlane-signer --keyring-backend test\n\nCOSMOS_SIGNER_KEY=0x$(bitsongd keys export hyperlane-signer --unarmored-hex --unsafe --keyring-backend test 2>&1 | tail -1)\nexport COSMOS_SIGNER_KEY\n",[146,1395,1396,1415,1419,1463],{"__ignoreMap":401},[405,1397,1398,1400,1403,1406,1409,1412],{"class":407,"line":408},[405,1399,412],{"class":411},[405,1401,1402],{"class":415}," keys",[405,1404,1405],{"class":415}," add",[405,1407,1408],{"class":415}," hyperlane-signer",[405,1410,1411],{"class":415}," --keyring-backend",[405,1413,1414],{"class":415}," test\n",[405,1416,1417],{"class":407,"line":447},[405,1418,1323],{"emptyLinePlaceholder":1322},[405,1420,1421,1424,1426,1429,1431,1433,1435,1438,1440,1443,1446,1448,1451,1454,1456,1458,1461],{"class":407,"line":477},[405,1422,1423],{"class":770},"COSMOS_SIGNER_KEY",[405,1425,774],{"class":431},[405,1427,1428],{"class":415},"0x",[405,1430,1148],{"class":431},[405,1432,412],{"class":411},[405,1434,1402],{"class":415},[405,1436,1437],{"class":415}," export",[405,1439,1408],{"class":415},[405,1441,1442],{"class":415}," --unarmored-hex",[405,1444,1445],{"class":415}," --unsafe",[405,1447,1411],{"class":415},[405,1449,1450],{"class":415}," test",[405,1452,1453],{"class":431}," 2>&1",[405,1455,432],{"class":431},[405,1457,1101],{"class":411},[405,1459,1460],{"class":415}," -1",[405,1462,1135],{"class":431},[405,1464,1465,1467],{"class":407,"line":1319},[405,1466,767],{"class":766},[405,1468,1469],{"class":770}," COSMOS_SIGNER_KEY\n",[137,1471,1472],{},"Fund the account with TBTSG (without a balance the announcement fails):",[395,1474,1476],{"className":397,"code":1475,"filename":399,"language":400,"meta":401,"style":401},"bitsongd tx bank send \u003Cyour-funded-key> $(bitsongd keys show hyperlane-signer -a --keyring-backend test) 10000000utbtsg \\\n  --from \u003Cyour-funded-key> --keyring-backend test \\\n  --chain-id crescendo-1 --node tcp:\u002F\u002Flocalhost:26657 \\\n  --fees 10000utbtsg -y\n",[146,1477,1478,1529,1548,1564],{"__ignoreMap":401},[405,1479,1480,1482,1485,1488,1491,1494,1497,1500,1503,1506,1508,1510,1513,1515,1518,1520,1522,1524,1527],{"class":407,"line":408},[405,1481,412],{"class":411},[405,1483,1484],{"class":415}," tx",[405,1486,1487],{"class":415}," bank",[405,1489,1490],{"class":415}," send",[405,1492,1493],{"class":431}," \u003C",[405,1495,1496],{"class":415},"your-funded-ke",[405,1498,1499],{"class":770},"y",[405,1501,1502],{"class":431},">",[405,1504,1505],{"class":431}," $(",[405,1507,412],{"class":411},[405,1509,1402],{"class":415},[405,1511,1512],{"class":415}," show",[405,1514,1408],{"class":415},[405,1516,1517],{"class":415}," -a",[405,1519,1411],{"class":415},[405,1521,1450],{"class":415},[405,1523,548],{"class":431},[405,1525,1526],{"class":415}," 10000000utbtsg",[405,1528,1297],{"class":770},[405,1530,1531,1534,1536,1538,1540,1542,1544,1546],{"class":407,"line":447},[405,1532,1533],{"class":415},"  --from",[405,1535,1493],{"class":431},[405,1537,1496],{"class":415},[405,1539,1499],{"class":770},[405,1541,1502],{"class":431},[405,1543,1411],{"class":415},[405,1545,1450],{"class":415},[405,1547,1297],{"class":770},[405,1549,1550,1553,1556,1559,1562],{"class":407,"line":477},[405,1551,1552],{"class":415},"  --chain-id",[405,1554,1555],{"class":415}," crescendo-1",[405,1557,1558],{"class":415}," --node",[405,1560,1561],{"class":415}," tcp:\u002F\u002Flocalhost:26657",[405,1563,1297],{"class":770},[405,1565,1566,1569,1572],{"class":407,"line":1319},[405,1567,1568],{"class":415},"  --fees",[405,1570,1571],{"class":415}," 10000utbtsg",[405,1573,1574],{"class":415}," -y\n",[216,1576,1578],{"id":1577},"step-5-prepare-configuration-and-environment","Step 5 — Prepare configuration and environment",[395,1580,1582],{"className":397,"code":1581,"filename":399,"language":400,"meta":401,"style":401},"mkdir -p $HOME\u002Fhyperlane-bitsong\u002F{config,db}\n",[146,1583,1584],{"__ignoreMap":401},[405,1585,1586,1589,1591,1594],{"class":407,"line":408},[405,1587,1588],{"class":411},"mkdir",[405,1590,1116],{"class":415},[405,1592,1593],{"class":770}," $HOME",[405,1595,1596],{"class":415},"\u002Fhyperlane-bitsong\u002F{config,db}\n",[137,1598,1599],{},"Environment file (restricted permissions):",[395,1601,1604],{"className":397,"code":1602,"filename":1603,"language":400,"meta":401,"style":401},"AWS_ACCESS_KEY_ID=\u003Cyour-access-key-id>\nAWS_SECRET_ACCESS_KEY=\u003Cyour-secret-access-key>\nAWS_REGION=us-east-1\nCOSMOS_SIGNER_KEY=0x\u003Cyour-cosmos-signer-private-key>\nS3_BUCKET=hyperlane-validator-signatures-bitsong\nHYPERLANE_IMAGE=ghcr.io\u002Fhyperlane-xyz\u002Fhyperlane-agent:agents-v2.2.0\n","$HOME\u002Fhyperlane-bitsong\u002Fvalidator.env",[146,1605,1606,1620,1632,1641,1657,1666],{"__ignoreMap":401},[405,1607,1608,1611,1614,1617],{"class":407,"line":408},[405,1609,1610],{"class":770},"AWS_ACCESS_KEY_ID",[405,1612,1613],{"class":431},"=\u003C",[405,1615,1616],{"class":415},"your-access-key-id",[405,1618,1619],{"class":431},">\n",[405,1621,1622,1625,1627,1630],{"class":407,"line":447},[405,1623,1624],{"class":770},"AWS_SECRET_ACCESS_KEY",[405,1626,1613],{"class":431},[405,1628,1629],{"class":415},"your-secret-access-key",[405,1631,1619],{"class":431},[405,1633,1634,1636,1638],{"class":407,"line":477},[405,1635,824],{"class":770},[405,1637,774],{"class":431},[405,1639,1640],{"class":415},"us-east-1\n",[405,1642,1643,1645,1647,1649,1652,1655],{"class":407,"line":1319},[405,1644,1423],{"class":770},[405,1646,774],{"class":431},[405,1648,1428],{"class":415},[405,1650,1651],{"class":431},"\u003C",[405,1653,1654],{"class":415},"your-cosmos-signer-private-key",[405,1656,1619],{"class":431},[405,1658,1659,1662,1664],{"class":407,"line":1326},[405,1660,1661],{"class":770},"S3_BUCKET",[405,1663,774],{"class":431},[405,1665,945],{"class":415},[405,1667,1668,1671,1673],{"class":407,"line":1345},[405,1669,1670],{"class":770},"HYPERLANE_IMAGE",[405,1672,774],{"class":431},[405,1674,1675],{"class":415},"ghcr.io\u002Fhyperlane-xyz\u002Fhyperlane-agent:agents-v2.2.0\n",[395,1677,1679],{"className":397,"code":1678,"filename":399,"language":400,"meta":401,"style":401},"chmod 600 $HOME\u002Fhyperlane-bitsong\u002Fvalidator.env\nsource $HOME\u002Fhyperlane-bitsong\u002Fvalidator.env\ndocker pull --platform linux\u002Famd64 $HYPERLANE_IMAGE\n",[146,1680,1681,1694,1703],{"__ignoreMap":401},[405,1682,1683,1686,1689,1691],{"class":407,"line":408},[405,1684,1685],{"class":411},"chmod",[405,1687,1688],{"class":1107}," 600",[405,1690,1593],{"class":770},[405,1692,1693],{"class":415},"\u002Fhyperlane-bitsong\u002Fvalidator.env\n",[405,1695,1696,1699,1701],{"class":407,"line":447},[405,1697,1698],{"class":647},"source",[405,1700,1593],{"class":770},[405,1702,1693],{"class":415},[405,1704,1705,1708,1711,1714,1717],{"class":407,"line":477},[405,1706,1707],{"class":411},"docker",[405,1709,1710],{"class":415}," pull",[405,1712,1713],{"class":415}," --platform",[405,1715,1716],{"class":415}," linux\u002Famd64",[405,1718,1719],{"class":770}," $HYPERLANE_IMAGE\n",[137,1721,1722,1723,1725,1726,1729],{},"Create the ",[146,1724,342],{}," with the ",[141,1727,1728],{},"real bridge IDs"," already filled in:",[395,1731,1736],{"className":1732,"code":1733,"filename":1734,"language":1735,"meta":401,"style":401},"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\u002F127.0.0.1:26657\" }],\n      \"grpcUrls\": [{ \"http\": \"http:\u002F\u002F127.0.0.1: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\u002F\u003Cyour-private-base-sepolia-rpc>\" }],\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\u002Fhyperlane-bitsong\u002Fconfig\u002Fagent-config.json","json",[146,1737,1738,1743,1758,1772,1793,1812,1828,1849,1869,1886,1903,1924,1959,1990,2073,2121,2142,2196,2238,2258,2278,2298,2316,2322,2336,2355,2371,2386,2406,2436,2496,2546,2585,2605,2625,2645,2663,2669,2675],{"__ignoreMap":401},[405,1739,1740],{"class":407,"line":408},[405,1741,1742],{"class":431},"{\n",[405,1744,1745,1748,1751,1753,1755],{"class":407,"line":447},[405,1746,1747],{"class":431},"  \"",[405,1749,1750],{"class":766},"chains",[405,1752,777],{"class":431},[405,1754,254],{"class":431},[405,1756,1757],{"class":431}," {\n",[405,1759,1760,1763,1766,1768,1770],{"class":407,"line":477},[405,1761,1762],{"class":431},"    \"",[405,1764,1765],{"class":411},"bitsong",[405,1767,777],{"class":431},[405,1769,254],{"class":431},[405,1771,1757],{"class":431},[405,1773,1774,1777,1780,1782,1784,1786,1788,1790],{"class":407,"line":1319},[405,1775,1776],{"class":431},"      \"",[405,1778,1779],{"class":1107},"name",[405,1781,777],{"class":431},[405,1783,254],{"class":431},[405,1785,1029],{"class":431},[405,1787,1765],{"class":415},[405,1789,777],{"class":431},[405,1791,1792],{"class":431},",\n",[405,1794,1795,1797,1800,1802,1804,1806,1808,1810],{"class":407,"line":1326},[405,1796,1776],{"class":431},[405,1798,1799],{"class":1107},"chainId",[405,1801,777],{"class":431},[405,1803,254],{"class":431},[405,1805,1029],{"class":431},[405,1807,148],{"class":415},[405,1809,777],{"class":431},[405,1811,1792],{"class":431},[405,1813,1814,1816,1819,1821,1823,1826],{"class":407,"line":1345},[405,1815,1776],{"class":431},[405,1817,1818],{"class":1107},"domainId",[405,1820,777],{"class":431},[405,1822,254],{"class":431},[405,1824,1825],{"class":1107}," 71717171",[405,1827,1792],{"class":431},[405,1829,1831,1833,1836,1838,1840,1842,1845,1847],{"class":407,"line":1830},7,[405,1832,1776],{"class":431},[405,1834,1835],{"class":1107},"protocol",[405,1837,777],{"class":431},[405,1839,254],{"class":431},[405,1841,1029],{"class":431},[405,1843,1844],{"class":415},"cosmosNative",[405,1846,777],{"class":431},[405,1848,1792],{"class":431},[405,1850,1852,1854,1857,1859,1861,1863,1865,1867],{"class":407,"line":1851},8,[405,1853,1776],{"class":431},[405,1855,1856],{"class":1107},"bech32Prefix",[405,1858,777],{"class":431},[405,1860,254],{"class":431},[405,1862,1029],{"class":431},[405,1864,1765],{"class":415},[405,1866,777],{"class":431},[405,1868,1792],{"class":431},[405,1870,1872,1874,1877,1879,1881,1884],{"class":407,"line":1871},9,[405,1873,1776],{"class":431},[405,1875,1876],{"class":1107},"slip44",[405,1878,777],{"class":431},[405,1880,254],{"class":431},[405,1882,1883],{"class":1107}," 639",[405,1885,1792],{"class":431},[405,1887,1889,1891,1894,1896,1898,1901],{"class":407,"line":1888},10,[405,1890,1776],{"class":431},[405,1892,1893],{"class":1107},"contractAddressBytes",[405,1895,777],{"class":431},[405,1897,254],{"class":431},[405,1899,1900],{"class":1107}," 32",[405,1902,1792],{"class":431},[405,1904,1906,1908,1911,1913,1915,1917,1920,1922],{"class":407,"line":1905},11,[405,1907,1776],{"class":431},[405,1909,1910],{"class":1107},"canonicalAsset",[405,1912,777],{"class":431},[405,1914,254],{"class":431},[405,1916,1029],{"class":431},[405,1918,1919],{"class":415},"utbtsg",[405,1921,777],{"class":431},[405,1923,1792],{"class":431},[405,1925,1927,1929,1932,1934,1936,1939,1941,1945,1947,1949,1951,1954,1956],{"class":407,"line":1926},12,[405,1928,1776],{"class":431},[405,1930,1931],{"class":1107},"rpcUrls",[405,1933,777],{"class":431},[405,1935,254],{"class":431},[405,1937,1938],{"class":431}," [{",[405,1940,1029],{"class":431},[405,1942,1944],{"class":1943},"swJcz","http",[405,1946,777],{"class":431},[405,1948,254],{"class":431},[405,1950,1029],{"class":431},[405,1952,1953],{"class":415},"http:\u002F\u002F127.0.0.1:26657",[405,1955,777],{"class":431},[405,1957,1958],{"class":431}," }],\n",[405,1960,1962,1964,1967,1969,1971,1973,1975,1977,1979,1981,1983,1986,1988],{"class":407,"line":1961},13,[405,1963,1776],{"class":431},[405,1965,1966],{"class":1107},"grpcUrls",[405,1968,777],{"class":431},[405,1970,254],{"class":431},[405,1972,1938],{"class":431},[405,1974,1029],{"class":431},[405,1976,1944],{"class":1943},[405,1978,777],{"class":431},[405,1980,254],{"class":431},[405,1982,1029],{"class":431},[405,1984,1985],{"class":415},"http:\u002F\u002F127.0.0.1:9090",[405,1987,777],{"class":431},[405,1989,1958],{"class":431},[405,1991,1993,1995,1998,2000,2002,2005,2007,2009,2011,2013,2015,2018,2020,2023,2025,2028,2030,2032,2034,2037,2039,2041,2043,2046,2048,2050,2053,2055,2057,2060,2062,2064,2066,2068,2070],{"class":407,"line":1992},14,[405,1994,1776],{"class":431},[405,1996,1997],{"class":1107},"nativeToken",[405,1999,777],{"class":431},[405,2001,254],{"class":431},[405,2003,2004],{"class":431}," {",[405,2006,1029],{"class":431},[405,2008,1779],{"class":1943},[405,2010,777],{"class":431},[405,2012,254],{"class":431},[405,2014,1029],{"class":431},[405,2016,2017],{"class":415},"BitSong",[405,2019,777],{"class":431},[405,2021,2022],{"class":431},",",[405,2024,1029],{"class":431},[405,2026,2027],{"class":1943},"symbol",[405,2029,777],{"class":431},[405,2031,254],{"class":431},[405,2033,1029],{"class":431},[405,2035,2036],{"class":415},"BTSG",[405,2038,777],{"class":431},[405,2040,2022],{"class":431},[405,2042,1029],{"class":431},[405,2044,2045],{"class":1943},"decimals",[405,2047,777],{"class":431},[405,2049,254],{"class":431},[405,2051,2052],{"class":1107}," 6",[405,2054,2022],{"class":431},[405,2056,1029],{"class":431},[405,2058,2059],{"class":1943},"denom",[405,2061,777],{"class":431},[405,2063,254],{"class":431},[405,2065,1029],{"class":431},[405,2067,1919],{"class":415},[405,2069,777],{"class":431},[405,2071,2072],{"class":431}," },\n",[405,2074,2076,2078,2081,2083,2085,2087,2089,2092,2094,2096,2098,2101,2103,2105,2107,2109,2111,2113,2115,2117,2119],{"class":407,"line":2075},15,[405,2077,1776],{"class":431},[405,2079,2080],{"class":1107},"gasPrice",[405,2082,777],{"class":431},[405,2084,254],{"class":431},[405,2086,2004],{"class":431},[405,2088,1029],{"class":431},[405,2090,2091],{"class":1943},"amount",[405,2093,777],{"class":431},[405,2095,254],{"class":431},[405,2097,1029],{"class":431},[405,2099,2100],{"class":415},"0.025",[405,2102,777],{"class":431},[405,2104,2022],{"class":431},[405,2106,1029],{"class":431},[405,2108,2059],{"class":1943},[405,2110,777],{"class":431},[405,2112,254],{"class":431},[405,2114,1029],{"class":431},[405,2116,1919],{"class":415},[405,2118,777],{"class":431},[405,2120,2072],{"class":431},[405,2122,2124,2126,2129,2131,2133,2135,2138,2140],{"class":407,"line":2123},16,[405,2125,1776],{"class":431},[405,2127,2128],{"class":1107},"gasMultiplier",[405,2130,777],{"class":431},[405,2132,254],{"class":431},[405,2134,1029],{"class":431},[405,2136,2137],{"class":415},"1.5",[405,2139,777],{"class":431},[405,2141,1792],{"class":431},[405,2143,2145,2147,2150,2152,2154,2156,2158,2161,2163,2165,2168,2170,2172,2175,2177,2179,2181,2183,2185,2188,2190,2192,2194],{"class":407,"line":2144},17,[405,2146,1776],{"class":431},[405,2148,2149],{"class":1107},"blocks",[405,2151,777],{"class":431},[405,2153,254],{"class":431},[405,2155,2004],{"class":431},[405,2157,1029],{"class":431},[405,2159,2160],{"class":1943},"confirmations",[405,2162,777],{"class":431},[405,2164,254],{"class":431},[405,2166,2167],{"class":1107}," 1",[405,2169,2022],{"class":431},[405,2171,1029],{"class":431},[405,2173,2174],{"class":1943},"estimateBlockTime",[405,2176,777],{"class":431},[405,2178,254],{"class":431},[405,2180,2052],{"class":1107},[405,2182,2022],{"class":431},[405,2184,1029],{"class":431},[405,2186,2187],{"class":1943},"reorgPeriod",[405,2189,777],{"class":431},[405,2191,254],{"class":431},[405,2193,2167],{"class":1107},[405,2195,2072],{"class":431},[405,2197,2199,2201,2204,2206,2208,2210,2212,2215,2217,2219,2222,2224,2226,2229,2231,2233,2236],{"class":407,"line":2198},18,[405,2200,1776],{"class":431},[405,2202,2203],{"class":1107},"index",[405,2205,777],{"class":431},[405,2207,254],{"class":431},[405,2209,2004],{"class":431},[405,2211,1029],{"class":431},[405,2213,2214],{"class":1943},"from",[405,2216,777],{"class":431},[405,2218,254],{"class":431},[405,2220,2221],{"class":1107}," 3895000",[405,2223,2022],{"class":431},[405,2225,1029],{"class":431},[405,2227,2228],{"class":1943},"chunk",[405,2230,777],{"class":431},[405,2232,254],{"class":431},[405,2234,2235],{"class":1107}," 500",[405,2237,2072],{"class":431},[405,2239,2241,2243,2246,2248,2250,2252,2254,2256],{"class":407,"line":2240},19,[405,2242,1776],{"class":431},[405,2244,2245],{"class":1107},"mailbox",[405,2247,777],{"class":431},[405,2249,254],{"class":431},[405,2251,1029],{"class":431},[405,2253,353],{"class":415},[405,2255,777],{"class":431},[405,2257,1792],{"class":431},[405,2259,2261,2263,2266,2268,2270,2272,2274,2276],{"class":407,"line":2260},20,[405,2262,1776],{"class":431},[405,2264,2265],{"class":1107},"validatorAnnounce",[405,2267,777],{"class":431},[405,2269,254],{"class":431},[405,2271,1029],{"class":431},[405,2273,353],{"class":415},[405,2275,777],{"class":431},[405,2277,1792],{"class":431},[405,2279,2281,2283,2286,2288,2290,2292,2294,2296],{"class":407,"line":2280},21,[405,2282,1776],{"class":431},[405,2284,2285],{"class":1107},"merkleTreeHook",[405,2287,777],{"class":431},[405,2289,254],{"class":431},[405,2291,1029],{"class":431},[405,2293,363],{"class":415},[405,2295,777],{"class":431},[405,2297,1792],{"class":431},[405,2299,2301,2303,2306,2308,2310,2312,2314],{"class":407,"line":2300},22,[405,2302,1776],{"class":431},[405,2304,2305],{"class":1107},"interchainGasPaymaster",[405,2307,777],{"class":431},[405,2309,254],{"class":431},[405,2311,1029],{"class":431},[405,2313,369],{"class":415},[405,2315,783],{"class":431},[405,2317,2319],{"class":407,"line":2318},23,[405,2320,2321],{"class":431},"    },\n",[405,2323,2325,2327,2330,2332,2334],{"class":407,"line":2324},24,[405,2326,1762],{"class":431},[405,2328,2329],{"class":411},"basesepolia",[405,2331,777],{"class":431},[405,2333,254],{"class":431},[405,2335,1757],{"class":431},[405,2337,2339,2341,2343,2345,2347,2349,2351,2353],{"class":407,"line":2338},25,[405,2340,1776],{"class":431},[405,2342,1779],{"class":1107},[405,2344,777],{"class":431},[405,2346,254],{"class":431},[405,2348,1029],{"class":431},[405,2350,2329],{"class":415},[405,2352,777],{"class":431},[405,2354,1792],{"class":431},[405,2356,2358,2360,2362,2364,2366,2369],{"class":407,"line":2357},26,[405,2359,1776],{"class":431},[405,2361,1799],{"class":1107},[405,2363,777],{"class":431},[405,2365,254],{"class":431},[405,2367,2368],{"class":1107}," 84532",[405,2370,1792],{"class":431},[405,2372,2374,2376,2378,2380,2382,2384],{"class":407,"line":2373},27,[405,2375,1776],{"class":431},[405,2377,1818],{"class":1107},[405,2379,777],{"class":431},[405,2381,254],{"class":431},[405,2383,2368],{"class":1107},[405,2385,1792],{"class":431},[405,2387,2389,2391,2393,2395,2397,2399,2402,2404],{"class":407,"line":2388},28,[405,2390,1776],{"class":431},[405,2392,1835],{"class":1107},[405,2394,777],{"class":431},[405,2396,254],{"class":431},[405,2398,1029],{"class":431},[405,2400,2401],{"class":415},"ethereum",[405,2403,777],{"class":431},[405,2405,1792],{"class":431},[405,2407,2409,2411,2413,2415,2417,2419,2421,2423,2425,2427,2429,2432,2434],{"class":407,"line":2408},29,[405,2410,1776],{"class":431},[405,2412,1931],{"class":1107},[405,2414,777],{"class":431},[405,2416,254],{"class":431},[405,2418,1938],{"class":431},[405,2420,1029],{"class":431},[405,2422,1944],{"class":1943},[405,2424,777],{"class":431},[405,2426,254],{"class":431},[405,2428,1029],{"class":431},[405,2430,2431],{"class":415},"https:\u002F\u002F\u003Cyour-private-base-sepolia-rpc>",[405,2433,777],{"class":431},[405,2435,1958],{"class":431},[405,2437,2439,2441,2443,2445,2447,2449,2451,2453,2455,2457,2459,2462,2464,2466,2468,2470,2472,2474,2476,2479,2481,2483,2485,2487,2489,2491,2494],{"class":407,"line":2438},30,[405,2440,1776],{"class":431},[405,2442,1997],{"class":1107},[405,2444,777],{"class":431},[405,2446,254],{"class":431},[405,2448,2004],{"class":431},[405,2450,1029],{"class":431},[405,2452,1779],{"class":1943},[405,2454,777],{"class":431},[405,2456,254],{"class":431},[405,2458,1029],{"class":431},[405,2460,2461],{"class":415},"Ether",[405,2463,777],{"class":431},[405,2465,2022],{"class":431},[405,2467,1029],{"class":431},[405,2469,2027],{"class":1943},[405,2471,777],{"class":431},[405,2473,254],{"class":431},[405,2475,1029],{"class":431},[405,2477,2478],{"class":415},"ETH",[405,2480,777],{"class":431},[405,2482,2022],{"class":431},[405,2484,1029],{"class":431},[405,2486,2045],{"class":1943},[405,2488,777],{"class":431},[405,2490,254],{"class":431},[405,2492,2493],{"class":1107}," 18",[405,2495,2072],{"class":431},[405,2497,2499,2501,2503,2505,2507,2509,2511,2513,2515,2517,2519,2521,2523,2525,2527,2529,2532,2534,2536,2538,2540,2542,2544],{"class":407,"line":2498},31,[405,2500,1776],{"class":431},[405,2502,2149],{"class":1107},[405,2504,777],{"class":431},[405,2506,254],{"class":431},[405,2508,2004],{"class":431},[405,2510,1029],{"class":431},[405,2512,2160],{"class":1943},[405,2514,777],{"class":431},[405,2516,254],{"class":431},[405,2518,2167],{"class":1107},[405,2520,2022],{"class":431},[405,2522,1029],{"class":431},[405,2524,2174],{"class":1943},[405,2526,777],{"class":431},[405,2528,254],{"class":431},[405,2530,2531],{"class":1107}," 2",[405,2533,2022],{"class":431},[405,2535,1029],{"class":431},[405,2537,2187],{"class":1943},[405,2539,777],{"class":431},[405,2541,254],{"class":431},[405,2543,2167],{"class":1107},[405,2545,2072],{"class":431},[405,2547,2549,2551,2553,2555,2557,2559,2561,2563,2565,2567,2570,2572,2574,2576,2578,2580,2583],{"class":407,"line":2548},32,[405,2550,1776],{"class":431},[405,2552,2203],{"class":1107},[405,2554,777],{"class":431},[405,2556,254],{"class":431},[405,2558,2004],{"class":431},[405,2560,1029],{"class":431},[405,2562,2214],{"class":1943},[405,2564,777],{"class":431},[405,2566,254],{"class":431},[405,2568,2569],{"class":1107}," 39040037",[405,2571,2022],{"class":431},[405,2573,1029],{"class":431},[405,2575,2228],{"class":1943},[405,2577,777],{"class":431},[405,2579,254],{"class":431},[405,2581,2582],{"class":1107}," 999",[405,2584,2072],{"class":431},[405,2586,2588,2590,2592,2594,2596,2598,2601,2603],{"class":407,"line":2587},33,[405,2589,1776],{"class":431},[405,2591,2245],{"class":1107},[405,2593,777],{"class":431},[405,2595,254],{"class":431},[405,2597,1029],{"class":431},[405,2599,2600],{"class":415},"0x6966b0E55883d49BFB24539356a2f8A673E02039",[405,2602,777],{"class":431},[405,2604,1792],{"class":431},[405,2606,2608,2610,2612,2614,2616,2618,2621,2623],{"class":407,"line":2607},34,[405,2609,1776],{"class":431},[405,2611,2265],{"class":1107},[405,2613,777],{"class":431},[405,2615,254],{"class":431},[405,2617,1029],{"class":431},[405,2619,2620],{"class":415},"0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9",[405,2622,777],{"class":431},[405,2624,1792],{"class":431},[405,2626,2628,2630,2632,2634,2636,2638,2641,2643],{"class":407,"line":2627},35,[405,2629,1776],{"class":431},[405,2631,2285],{"class":1107},[405,2633,777],{"class":431},[405,2635,254],{"class":431},[405,2637,1029],{"class":431},[405,2639,2640],{"class":415},"0x86fb9F1c124fB20ff130C41a79a432F770f67AFD",[405,2642,777],{"class":431},[405,2644,1792],{"class":431},[405,2646,2648,2650,2652,2654,2656,2658,2661],{"class":407,"line":2647},36,[405,2649,1776],{"class":431},[405,2651,2305],{"class":1107},[405,2653,777],{"class":431},[405,2655,254],{"class":431},[405,2657,1029],{"class":431},[405,2659,2660],{"class":415},"0x28B02B97a850872C4D33C3E024fab6499ad96564",[405,2662,783],{"class":431},[405,2664,2666],{"class":407,"line":2665},37,[405,2667,2668],{"class":431},"    }\n",[405,2670,2672],{"class":407,"line":2671},38,[405,2673,2674],{"class":431},"  }\n",[405,2676,2678],{"class":407,"line":2677},39,[405,2679,2680],{"class":431},"}\n",[389,2682,2683,2684,2686,2687,2689,2690,2693,2694,2697,2698,2701,2702,2705,2706,2709,2710,2713],{},"Point BitSong's ",[146,2685,1931],{},"\u002F",[146,2688,1966],{}," at ",[141,2691,2692],{},"your"," node. For Base Sepolia use a ",[141,2695,2696],{},"private RPC",". The ",[146,2699,2700],{},"index.from"," for BitSong should be a ",[141,2703,2704],{},"recent"," height (not ",[146,2707,2708],{},"1","), and ",[146,2711,2712],{},"39040037"," for Base Sepolia matches the current bridge deployment.",[193,2715,731,2716,2719,2720,2723,2724,2727,2728,2731,2732,2735,2736,2739,2740,2743,2744,2747,2748,2751,2752,2754],{},[141,2717,2718],{},"public"," Base Sepolia RPC (",[146,2721,2722],{},"https:\u002F\u002Fsepolia.base.org",") limits log queries to ",[141,2725,2726],{},"2000 blocks",", and Coinbase CDP limits to ",[141,2729,2730],{},"1000",". With a higher ",[146,2733,2734],{},"index.chunk"," you will see ",[146,2737,2738],{},"query exceeds max block range"," and indexing stalls. Keep ",[146,2741,2742],{},"basesepolia.index.chunk"," ≤ ",[146,2745,2746],{},"999"," (CDP) or ≤ ",[146,2749,2750],{},"2000"," (public) — ",[146,2753,2746],{}," is safe for both.",[395,2756,2758],{"className":397,"code":2757,"filename":399,"language":400,"meta":401,"style":401},"jq . $HOME\u002Fhyperlane-bitsong\u002Fconfig\u002Fagent-config.json > \u002Fdev\u002Fnull && echo \"Valid JSON\"\n",[146,2759,2760],{"__ignoreMap":401},[405,2761,2762,2765,2768,2770,2773,2776,2779,2781,2784,2786,2789],{"class":407,"line":408},[405,2763,2764],{"class":411},"jq",[405,2766,2767],{"class":415}," .",[405,2769,1593],{"class":770},[405,2771,2772],{"class":415},"\u002Fhyperlane-bitsong\u002Fconfig\u002Fagent-config.json",[405,2774,2775],{"class":431}," >",[405,2777,2778],{"class":415}," \u002Fdev\u002Fnull",[405,2780,610],{"class":431},[405,2782,2783],{"class":647}," echo",[405,2785,1029],{"class":431},[405,2787,2788],{"class":415},"Valid JSON",[405,2790,783],{"class":431},[216,2792,2794],{"id":2793},"step-6-start-the-two-validators","Step 6 — Start the two validators",[137,2796,2797,2798,2801],{},"You need ",[141,2799,2800],{},"two"," containers: one watches BitSong, the other Base Sepolia. Both sign with the same KMS key but write to separate S3 folders.",[193,2803,2805,2806,2808,2809,2812,2813,2816,2817,2820],{"title":2804},"S3 or localStorage?","In production use ",[141,2807,160],{},": relayers (often on other machines) read checkpoints from the URL announced on-chain. With ",[146,2810,2811],{},"--checkpointSyncer.type localStorage"," the validator announces a ",[146,2814,2815],{},"file:\u002F\u002F\u002F..."," path readable ",[141,2818,2819],{},"only by relayers on the same host"," — fine for a single-machine test, unsuitable for a distributed setup.",[395,2822,2824],{"className":397,"code":2823,"filename":399,"language":400,"meta":401,"style":401},"mkdir -p $HOME\u002Fhyperlane-bitsong\u002Fdb\u002Fvalidator-bitsong $HOME\u002Fhyperlane-bitsong\u002Fdb\u002Fvalidator-basesepolia\nsource $HOME\u002Fhyperlane-bitsong\u002Fvalidator.env\n",[146,2825,2826,2842],{"__ignoreMap":401},[405,2827,2828,2830,2832,2834,2837,2839],{"class":407,"line":408},[405,2829,1588],{"class":411},[405,2831,1116],{"class":415},[405,2833,1593],{"class":770},[405,2835,2836],{"class":415},"\u002Fhyperlane-bitsong\u002Fdb\u002Fvalidator-bitsong",[405,2838,1593],{"class":770},[405,2840,2841],{"class":415},"\u002Fhyperlane-bitsong\u002Fdb\u002Fvalidator-basesepolia\n",[405,2843,2844,2846,2848],{"class":407,"line":447},[405,2845,1698],{"class":647},[405,2847,1593],{"class":770},[405,2849,1693],{"class":415},[313,2851,2853],{"id":2852},"bitsong-validator","BitSong validator",[395,2855,2857],{"className":397,"code":2856,"filename":399,"language":400,"meta":401,"style":401},"docker run -d \\\n  --name hyperlane-validator-bitsong \\\n  --restart unless-stopped \\\n  --network host \\\n  --user $(id -u):$(id -g) \\\n  --ulimit nofile=65536:65536 \\\n  --env-file $HOME\u002Fhyperlane-bitsong\u002Fvalidator.env \\\n  -e CONFIG_FILES=\u002Fconfig\u002Fagent-config.json \\\n  -v $HOME\u002Fhyperlane-bitsong\u002Fconfig\u002Fagent-config.json:\u002Fconfig\u002Fagent-config.json:ro \\\n  -v $HOME\u002Fhyperlane-bitsong\u002Fdb\u002Fvalidator-bitsong:\u002Fhyperlane_db \\\n  --log-opt max-size=50m --log-opt max-file=5 \\\n  $HYPERLANE_IMAGE \\\n  .\u002Fvalidator \\\n  --db \u002Fhyperlane_db \\\n  --originChainName bitsong \\\n  --reorgPeriod 1 --interval 10 \\\n  --validator.type aws \\\n  --validator.region $AWS_REGION \\\n  --validator.id alias\u002Fhyperlane-validator-signer-bitsong \\\n  --chains.bitsong.signer.type cosmosKey \\\n  --chains.bitsong.signer.key $COSMOS_SIGNER_KEY \\\n  --chains.bitsong.signer.prefix bitsong \\\n  --checkpointSyncer.type s3 \\\n  --checkpointSyncer.bucket $S3_BUCKET \\\n  --checkpointSyncer.region $AWS_REGION \\\n  --checkpointSyncer.folder bitsong \\\n  --metrics-port 9101 --log.format json --log.level info\n",[146,2858,2859,2870,2880,2890,2900,2928,2938,2950,2960,2972,2983,3002,3007,3014,3024,3034,3049,3059,3067,3077,3087,3095,3104,3113,3121,3128,3137],{"__ignoreMap":401},[405,2860,2861,2863,2866,2868],{"class":407,"line":408},[405,2862,1707],{"class":411},[405,2864,2865],{"class":415}," run",[405,2867,1124],{"class":415},[405,2869,1297],{"class":770},[405,2871,2872,2875,2878],{"class":407,"line":447},[405,2873,2874],{"class":415},"  --name",[405,2876,2877],{"class":415}," hyperlane-validator-bitsong",[405,2879,1297],{"class":770},[405,2881,2882,2885,2888],{"class":407,"line":477},[405,2883,2884],{"class":415},"  --restart",[405,2886,2887],{"class":415}," unless-stopped",[405,2889,1297],{"class":770},[405,2891,2892,2895,2898],{"class":407,"line":1319},[405,2893,2894],{"class":415},"  --network",[405,2896,2897],{"class":415}," host",[405,2899,1297],{"class":770},[405,2901,2902,2905,2907,2910,2913,2915,2917,2919,2921,2924,2926],{"class":407,"line":1326},[405,2903,2904],{"class":415},"  --user",[405,2906,1505],{"class":431},[405,2908,2909],{"class":411},"id",[405,2911,2912],{"class":415}," -u",[405,2914,548],{"class":431},[405,2916,254],{"class":415},[405,2918,1148],{"class":431},[405,2920,2909],{"class":411},[405,2922,2923],{"class":415}," -g",[405,2925,548],{"class":431},[405,2927,1297],{"class":770},[405,2929,2930,2933,2936],{"class":407,"line":1345},[405,2931,2932],{"class":415},"  --ulimit",[405,2934,2935],{"class":415}," nofile=65536:65536",[405,2937,1297],{"class":770},[405,2939,2940,2943,2945,2948],{"class":407,"line":1830},[405,2941,2942],{"class":415},"  --env-file",[405,2944,1593],{"class":770},[405,2946,2947],{"class":415},"\u002Fhyperlane-bitsong\u002Fvalidator.env",[405,2949,1297],{"class":770},[405,2951,2952,2955,2958],{"class":407,"line":1851},[405,2953,2954],{"class":415},"  -e",[405,2956,2957],{"class":415}," CONFIG_FILES=\u002Fconfig\u002Fagent-config.json",[405,2959,1297],{"class":770},[405,2961,2962,2965,2967,2970],{"class":407,"line":1871},[405,2963,2964],{"class":415},"  -v",[405,2966,1593],{"class":770},[405,2968,2969],{"class":415},"\u002Fhyperlane-bitsong\u002Fconfig\u002Fagent-config.json:\u002Fconfig\u002Fagent-config.json:ro",[405,2971,1297],{"class":770},[405,2973,2974,2976,2978,2981],{"class":407,"line":1888},[405,2975,2964],{"class":415},[405,2977,1593],{"class":770},[405,2979,2980],{"class":415},"\u002Fhyperlane-bitsong\u002Fdb\u002Fvalidator-bitsong:\u002Fhyperlane_db",[405,2982,1297],{"class":770},[405,2984,2985,2988,2991,2994,2997,3000],{"class":407,"line":1905},[405,2986,2987],{"class":415},"  --log-opt",[405,2989,2990],{"class":415}," max-size=50m",[405,2992,2993],{"class":415}," --log-opt",[405,2995,2996],{"class":415}," max-file=",[405,2998,2999],{"class":1107},"5",[405,3001,1297],{"class":770},[405,3003,3004],{"class":407,"line":1926},[405,3005,3006],{"class":770},"  $HYPERLANE_IMAGE \\\n",[405,3008,3009,3012],{"class":407,"line":1961},[405,3010,3011],{"class":415},"  .\u002Fvalidator",[405,3013,1297],{"class":770},[405,3015,3016,3019,3022],{"class":407,"line":1992},[405,3017,3018],{"class":415},"  --db",[405,3020,3021],{"class":415}," \u002Fhyperlane_db",[405,3023,1297],{"class":770},[405,3025,3026,3029,3032],{"class":407,"line":2075},[405,3027,3028],{"class":415},"  --originChainName",[405,3030,3031],{"class":415}," bitsong",[405,3033,1297],{"class":770},[405,3035,3036,3039,3041,3044,3047],{"class":407,"line":2123},[405,3037,3038],{"class":415},"  --reorgPeriod",[405,3040,2167],{"class":1107},[405,3042,3043],{"class":415}," --interval",[405,3045,3046],{"class":1107}," 10",[405,3048,1297],{"class":770},[405,3050,3051,3054,3057],{"class":407,"line":2144},[405,3052,3053],{"class":415},"  --validator.type",[405,3055,3056],{"class":415}," aws",[405,3058,1297],{"class":770},[405,3060,3061,3064],{"class":407,"line":2198},[405,3062,3063],{"class":415},"  --validator.region",[405,3065,3066],{"class":770}," $AWS_REGION \\\n",[405,3068,3069,3072,3075],{"class":407,"line":2240},[405,3070,3071],{"class":415},"  --validator.id",[405,3073,3074],{"class":415}," alias\u002Fhyperlane-validator-signer-bitsong",[405,3076,1297],{"class":770},[405,3078,3079,3082,3085],{"class":407,"line":2260},[405,3080,3081],{"class":415},"  --chains.bitsong.signer.type",[405,3083,3084],{"class":415}," cosmosKey",[405,3086,1297],{"class":770},[405,3088,3089,3092],{"class":407,"line":2280},[405,3090,3091],{"class":415},"  --chains.bitsong.signer.key",[405,3093,3094],{"class":770}," $COSMOS_SIGNER_KEY \\\n",[405,3096,3097,3100,3102],{"class":407,"line":2300},[405,3098,3099],{"class":415},"  --chains.bitsong.signer.prefix",[405,3101,3031],{"class":415},[405,3103,1297],{"class":770},[405,3105,3106,3109,3111],{"class":407,"line":2318},[405,3107,3108],{"class":415},"  --checkpointSyncer.type",[405,3110,1207],{"class":415},[405,3112,1297],{"class":770},[405,3114,3115,3118],{"class":407,"line":2324},[405,3116,3117],{"class":415},"  --checkpointSyncer.bucket",[405,3119,3120],{"class":770}," $S3_BUCKET \\\n",[405,3122,3123,3126],{"class":407,"line":2338},[405,3124,3125],{"class":415},"  --checkpointSyncer.region",[405,3127,3066],{"class":770},[405,3129,3130,3133,3135],{"class":407,"line":2357},[405,3131,3132],{"class":415},"  --checkpointSyncer.folder",[405,3134,3031],{"class":415},[405,3136,1297],{"class":770},[405,3138,3139,3142,3145,3148,3150,3153],{"class":407,"line":2373},[405,3140,3141],{"class":415},"  --metrics-port",[405,3143,3144],{"class":1107}," 9101",[405,3146,3147],{"class":415}," --log.format",[405,3149,428],{"class":415},[405,3151,3152],{"class":415}," --log.level",[405,3154,3155],{"class":415}," info\n",[389,3157,3158,3159,3162,3163,3166,3167,3169],{},"The BitSong validator always uses ",[146,3160,3161],{},"cosmosKey"," for the chain signer (to sign the on-chain announcement), while ",[141,3164,3165],{},"checkpoint"," signing uses ",[146,3168,1204],{}," (KMS).",[313,3171,3173],{"id":3172},"base-sepolia-validator","Base Sepolia validator",[729,3175,3176,3177,3179,3180,1238,3183,3188],{},"The Base Sepolia validator sends an on-chain announcement transaction: fund your ",[146,3178,1035],{}," with ",[141,3181,3182],{},"ETH on Base Sepolia",[177,3184,3187],{"href":3185,"rel":3186,"target":182},"https:\u002F\u002Fportal.cdp.coinbase.com\u002Fproducts\u002Ffaucet",[181],"Coinbase faucet",") before starting it.",[395,3190,3192],{"className":397,"code":3191,"filename":399,"language":400,"meta":401,"style":401},"docker run -d \\\n  --name hyperlane-validator-basesepolia \\\n  --restart unless-stopped \\\n  --network host \\\n  --user $(id -u):$(id -g) \\\n  --ulimit nofile=65536:65536 \\\n  --env-file $HOME\u002Fhyperlane-bitsong\u002Fvalidator.env \\\n  -e CONFIG_FILES=\u002Fconfig\u002Fagent-config.json \\\n  -v $HOME\u002Fhyperlane-bitsong\u002Fconfig\u002Fagent-config.json:\u002Fconfig\u002Fagent-config.json:ro \\\n  -v $HOME\u002Fhyperlane-bitsong\u002Fdb\u002Fvalidator-basesepolia:\u002Fhyperlane_db \\\n  --log-opt max-size=50m --log-opt max-file=5 \\\n  $HYPERLANE_IMAGE \\\n  .\u002Fvalidator \\\n  --db \u002Fhyperlane_db \\\n  --originChainName basesepolia \\\n  --reorgPeriod 1 --interval 10 \\\n  --validator.type aws \\\n  --validator.region $AWS_REGION \\\n  --validator.id alias\u002Fhyperlane-validator-signer-bitsong \\\n  --chains.basesepolia.signer.type aws \\\n  --chains.basesepolia.signer.region $AWS_REGION \\\n  --chains.basesepolia.signer.id alias\u002Fhyperlane-validator-signer-bitsong \\\n  --checkpointSyncer.type s3 \\\n  --checkpointSyncer.bucket $S3_BUCKET \\\n  --checkpointSyncer.region $AWS_REGION \\\n  --checkpointSyncer.folder basesepolia \\\n  --metrics-port 9201 --log.format json --log.level info\n",[146,3193,3194,3204,3213,3221,3229,3253,3261,3271,3279,3289,3300,3314,3318,3324,3332,3341,3353,3361,3367,3375,3384,3391,3400,3408,3414,3420,3428],{"__ignoreMap":401},[405,3195,3196,3198,3200,3202],{"class":407,"line":408},[405,3197,1707],{"class":411},[405,3199,2865],{"class":415},[405,3201,1124],{"class":415},[405,3203,1297],{"class":770},[405,3205,3206,3208,3211],{"class":407,"line":447},[405,3207,2874],{"class":415},[405,3209,3210],{"class":415}," hyperlane-validator-basesepolia",[405,3212,1297],{"class":770},[405,3214,3215,3217,3219],{"class":407,"line":477},[405,3216,2884],{"class":415},[405,3218,2887],{"class":415},[405,3220,1297],{"class":770},[405,3222,3223,3225,3227],{"class":407,"line":1319},[405,3224,2894],{"class":415},[405,3226,2897],{"class":415},[405,3228,1297],{"class":770},[405,3230,3231,3233,3235,3237,3239,3241,3243,3245,3247,3249,3251],{"class":407,"line":1326},[405,3232,2904],{"class":415},[405,3234,1505],{"class":431},[405,3236,2909],{"class":411},[405,3238,2912],{"class":415},[405,3240,548],{"class":431},[405,3242,254],{"class":415},[405,3244,1148],{"class":431},[405,3246,2909],{"class":411},[405,3248,2923],{"class":415},[405,3250,548],{"class":431},[405,3252,1297],{"class":770},[405,3254,3255,3257,3259],{"class":407,"line":1345},[405,3256,2932],{"class":415},[405,3258,2935],{"class":415},[405,3260,1297],{"class":770},[405,3262,3263,3265,3267,3269],{"class":407,"line":1830},[405,3264,2942],{"class":415},[405,3266,1593],{"class":770},[405,3268,2947],{"class":415},[405,3270,1297],{"class":770},[405,3272,3273,3275,3277],{"class":407,"line":1851},[405,3274,2954],{"class":415},[405,3276,2957],{"class":415},[405,3278,1297],{"class":770},[405,3280,3281,3283,3285,3287],{"class":407,"line":1871},[405,3282,2964],{"class":415},[405,3284,1593],{"class":770},[405,3286,2969],{"class":415},[405,3288,1297],{"class":770},[405,3290,3291,3293,3295,3298],{"class":407,"line":1888},[405,3292,2964],{"class":415},[405,3294,1593],{"class":770},[405,3296,3297],{"class":415},"\u002Fhyperlane-bitsong\u002Fdb\u002Fvalidator-basesepolia:\u002Fhyperlane_db",[405,3299,1297],{"class":770},[405,3301,3302,3304,3306,3308,3310,3312],{"class":407,"line":1905},[405,3303,2987],{"class":415},[405,3305,2990],{"class":415},[405,3307,2993],{"class":415},[405,3309,2996],{"class":415},[405,3311,2999],{"class":1107},[405,3313,1297],{"class":770},[405,3315,3316],{"class":407,"line":1926},[405,3317,3006],{"class":770},[405,3319,3320,3322],{"class":407,"line":1961},[405,3321,3011],{"class":415},[405,3323,1297],{"class":770},[405,3325,3326,3328,3330],{"class":407,"line":1992},[405,3327,3018],{"class":415},[405,3329,3021],{"class":415},[405,3331,1297],{"class":770},[405,3333,3334,3336,3339],{"class":407,"line":2075},[405,3335,3028],{"class":415},[405,3337,3338],{"class":415}," basesepolia",[405,3340,1297],{"class":770},[405,3342,3343,3345,3347,3349,3351],{"class":407,"line":2123},[405,3344,3038],{"class":415},[405,3346,2167],{"class":1107},[405,3348,3043],{"class":415},[405,3350,3046],{"class":1107},[405,3352,1297],{"class":770},[405,3354,3355,3357,3359],{"class":407,"line":2144},[405,3356,3053],{"class":415},[405,3358,3056],{"class":415},[405,3360,1297],{"class":770},[405,3362,3363,3365],{"class":407,"line":2198},[405,3364,3063],{"class":415},[405,3366,3066],{"class":770},[405,3368,3369,3371,3373],{"class":407,"line":2240},[405,3370,3071],{"class":415},[405,3372,3074],{"class":415},[405,3374,1297],{"class":770},[405,3376,3377,3380,3382],{"class":407,"line":2260},[405,3378,3379],{"class":415},"  --chains.basesepolia.signer.type",[405,3381,3056],{"class":415},[405,3383,1297],{"class":770},[405,3385,3386,3389],{"class":407,"line":2280},[405,3387,3388],{"class":415},"  --chains.basesepolia.signer.region",[405,3390,3066],{"class":770},[405,3392,3393,3396,3398],{"class":407,"line":2300},[405,3394,3395],{"class":415},"  --chains.basesepolia.signer.id",[405,3397,3074],{"class":415},[405,3399,1297],{"class":770},[405,3401,3402,3404,3406],{"class":407,"line":2318},[405,3403,3108],{"class":415},[405,3405,1207],{"class":415},[405,3407,1297],{"class":770},[405,3409,3410,3412],{"class":407,"line":2324},[405,3411,3117],{"class":415},[405,3413,3120],{"class":770},[405,3415,3416,3418],{"class":407,"line":2338},[405,3417,3125],{"class":415},[405,3419,3066],{"class":770},[405,3421,3422,3424,3426],{"class":407,"line":2357},[405,3423,3132],{"class":415},[405,3425,3338],{"class":415},[405,3427,1297],{"class":770},[405,3429,3430,3432,3435,3437,3439,3441],{"class":407,"line":2373},[405,3431,3141],{"class":415},[405,3433,3434],{"class":1107}," 9201",[405,3436,3147],{"class":415},[405,3438,428],{"class":415},[405,3440,3152],{"class":415},[405,3442,3155],{"class":415},[216,3444,3446],{"id":3445},"step-7-verify","Step 7 — Verify",[137,3448,3449],{},"Check the containers are running and read the logs:",[395,3451,3453],{"className":397,"code":3452,"filename":399,"language":400,"meta":401,"style":401},"docker ps --filter \"name=hyperlane-validator\" --format \"table {{.Names}}\\t{{.Status}}\"\ndocker logs -f --tail 100 hyperlane-validator-bitsong\n",[146,3454,3455,3482],{"__ignoreMap":401},[405,3456,3457,3459,3462,3465,3467,3470,3472,3475,3477,3480],{"class":407,"line":408},[405,3458,1707],{"class":411},[405,3460,3461],{"class":415}," ps",[405,3463,3464],{"class":415}," --filter",[405,3466,1029],{"class":431},[405,3468,3469],{"class":415},"name=hyperlane-validator",[405,3471,777],{"class":431},[405,3473,3474],{"class":415}," --format",[405,3476,1029],{"class":431},[405,3478,3479],{"class":415},"table {{.Names}}\\t{{.Status}}",[405,3481,783],{"class":431},[405,3483,3484,3486,3489,3492,3495,3498],{"class":407,"line":447},[405,3485,1707],{"class":411},[405,3487,3488],{"class":415}," logs",[405,3490,3491],{"class":415}," -f",[405,3493,3494],{"class":415}," --tail",[405,3496,3497],{"class":1107}," 100",[405,3499,3500],{"class":415}," hyperlane-validator-bitsong\n",[137,3502,3503,3504,3507],{},"Verify the BitSong validator ",[141,3505,3506],{},"announcement"," (can take up to 2 minutes):",[395,3509,3511],{"className":397,"code":3510,"filename":399,"language":400,"meta":401,"style":401},"bitsongd query hyperlane ism announced-storage-locations \\\n  0x68797065726c616e650000000000000000000000000000000000000000000000 \\\n  $(echo $VALIDATOR_ADDR | tr '[:upper:]' '[:lower:]') \\\n  --output json --node tcp:\u002F\u002Flocalhost:26657 | jq '.storage_locations'\n",[146,3512,3513,3528,3535,3568],{"__ignoreMap":401},[405,3514,3515,3517,3519,3521,3523,3526],{"class":407,"line":408},[405,3516,412],{"class":411},[405,3518,416],{"class":415},[405,3520,419],{"class":415},[405,3522,1287],{"class":415},[405,3524,3525],{"class":415}," announced-storage-locations",[405,3527,1297],{"class":770},[405,3529,3530,3533],{"class":407,"line":447},[405,3531,3532],{"class":1107},"  0x68797065726c616e650000000000000000000000000000000000000000000000",[405,3534,1297],{"class":770},[405,3536,3537,3540,3542,3545,3548,3550,3552,3555,3557,3559,3562,3564,3566],{"class":407,"line":477},[405,3538,3539],{"class":431},"  $(",[405,3541,1026],{"class":647},[405,3543,3544],{"class":770}," $VALIDATOR_ADDR ",[405,3546,3547],{"class":431},"|",[405,3549,1121],{"class":411},[405,3551,438],{"class":431},[405,3553,3554],{"class":415},"[:upper:]",[405,3556,1132],{"class":431},[405,3558,438],{"class":431},[405,3560,3561],{"class":415},"[:lower:]",[405,3563,1132],{"class":431},[405,3565,548],{"class":431},[405,3567,1297],{"class":770},[405,3569,3570,3573,3575,3577,3579,3581,3583,3585,3588],{"class":407,"line":1319},[405,3571,3572],{"class":415},"  --output",[405,3574,428],{"class":415},[405,3576,1558],{"class":415},[405,3578,1561],{"class":415},[405,3580,432],{"class":431},[405,3582,435],{"class":411},[405,3584,438],{"class":431},[405,3586,3587],{"class":415},".storage_locations",[405,3589,444],{"class":431},[137,3591,3592,3593,3596],{},"A non-empty ",[146,3594,3595],{},"storage_locations"," array confirms the validator announced where relayers can find its checkpoints.",[137,3598,3599],{},"Verify checkpoints are written to S3 (they appear when messages are dispatched from the origin Mailbox):",[395,3601,3603],{"className":397,"code":3602,"filename":399,"language":400,"meta":401,"style":401},"aws s3 ls s3:\u002F\u002F$S3_BUCKET\u002Fbitsong\u002F --recursive\naws s3 ls s3:\u002F\u002F$S3_BUCKET\u002Fbasesepolia\u002F --recursive\n",[146,3604,3605,3626],{"__ignoreMap":401},[405,3606,3607,3609,3611,3614,3617,3620,3623],{"class":407,"line":408},[405,3608,1204],{"class":411},[405,3610,1207],{"class":415},[405,3612,3613],{"class":415}," ls",[405,3615,3616],{"class":415}," s3:\u002F\u002F",[405,3618,3619],{"class":770},"$S3_BUCKET",[405,3621,3622],{"class":415},"\u002Fbitsong\u002F",[405,3624,3625],{"class":415}," --recursive\n",[405,3627,3628,3630,3632,3634,3636,3638,3641],{"class":407,"line":447},[405,3629,1204],{"class":411},[405,3631,1207],{"class":415},[405,3633,3613],{"class":415},[405,3635,3616],{"class":415},[405,3637,3619],{"class":770},[405,3639,3640],{"class":415},"\u002Fbasesepolia\u002F",[405,3642,3625],{"class":415},[216,3644,3646],{"id":3645},"troubleshooting","Troubleshooting",[3648,3649,3650,3688,3724,3755,3780],"accordion",{},[3651,3652,3655,3658],"accordion-item",{"icon":3653,"label":3654},"i-lucide-circle-help","The BitSong validator does not announce",[137,3656,3657],{},"The Cosmos signer account needs TBTSG for gas. Check the address, fund it, and restart the container:",[395,3659,3661],{"className":397,"code":3660,"filename":399,"language":400,"meta":401,"style":401},"bitsongd keys show hyperlane-signer -a --keyring-backend test\ndocker restart hyperlane-validator-bitsong\n",[146,3662,3663,3679],{"__ignoreMap":401},[405,3664,3665,3667,3669,3671,3673,3675,3677],{"class":407,"line":408},[405,3666,412],{"class":411},[405,3668,1402],{"class":415},[405,3670,1512],{"class":415},[405,3672,1408],{"class":415},[405,3674,1517],{"class":415},[405,3676,1411],{"class":415},[405,3678,1414],{"class":415},[405,3680,3681,3683,3686],{"class":407,"line":447},[405,3682,1707],{"class":411},[405,3684,3685],{"class":415}," restart",[405,3687,3500],{"class":415},[3651,3689,3691,3694],{"icon":3653,"label":3690},"The Base Sepolia validator does not announce",[137,3692,3693],{},"The KMS-derived address needs ETH on Base Sepolia. Recover it, fund it, and restart:",[395,3695,3697],{"className":397,"code":3696,"filename":399,"language":400,"meta":401,"style":401},"AWS_KMS_KEY_ID=alias\u002Fhyperlane-validator-signer-bitsong cast wallet address --aws\ndocker restart hyperlane-validator-basesepolia\n",[146,3698,3699,3715],{"__ignoreMap":401},[405,3700,3701,3703,3705,3707,3709,3711,3713],{"class":407,"line":408},[405,3702,983],{"class":770},[405,3704,774],{"class":431},[405,3706,988],{"class":415},[405,3708,991],{"class":411},[405,3710,994],{"class":415},[405,3712,997],{"class":415},[405,3714,1000],{"class":415},[405,3716,3717,3719,3721],{"class":407,"line":447},[405,3718,1707],{"class":411},[405,3720,3685],{"class":415},[405,3722,3723],{"class":415}," hyperlane-validator-basesepolia\n",[3651,3725,3727,3739],{"icon":3653,"label":3726},"Missing Region error",[137,3728,3729,3731,3732,3735,3736,254],{},[146,3730,824],{}," must be present in ",[146,3733,3734],{},"validator.env"," and passed to the container via ",[146,3737,3738],{},"--env-file",[395,3740,3742],{"className":397,"code":3741,"filename":399,"language":400,"meta":401,"style":401},"grep AWS_REGION $HOME\u002Fhyperlane-bitsong\u002Fvalidator.env\n",[146,3743,3744],{"__ignoreMap":401},[405,3745,3746,3749,3751,3753],{"class":407,"line":408},[405,3747,3748],{"class":411},"grep",[405,3750,806],{"class":415},[405,3752,1593],{"class":770},[405,3754,1693],{"class":415},[3651,3756,3758,3767],{"icon":3653,"label":3757},"The container exits right after starting",[137,3759,3760,3761,3764,3765,161],{},"Read the logs: common causes are invalid ",[146,3762,3763],{},"agent-config"," JSON, unreachable RPC\u002FgRPC endpoints, missing AWS credentials, a wrong KMS alias, or a missing ",[146,3766,1423],{},[395,3768,3770],{"className":397,"code":3769,"filename":399,"language":400,"meta":401,"style":401},"docker logs hyperlane-validator-bitsong\n",[146,3771,3772],{"__ignoreMap":401},[405,3773,3774,3776,3778],{"class":407,"line":408},[405,3775,1707],{"class":411},[405,3777,3488],{"class":415},[405,3779,3500],{"class":415},[3651,3781,3783,3784,3788],{"icon":3653,"label":3782},"My address is not in the multisig","Until the owner re-creates the MultisigISM with your address, your signatures are not verified. Check the active ISM (see ",[177,3785,3787],{"href":3786},"#step-3-send-your-address-to-the-bitsong-team","Step 3",") and, if it is missing, contact the team again.",[216,3790,3792],{"id":3791},"next-steps","Next Steps",[3794,3795,3796,3800,3803],"card-group",{},[3797,3798,3799],"card",{"icon":28,"title":50,"to":51},"Full validator\u002Frelayer reference: local and AWS deployments, monitoring, and operations.",[3797,3801,3802],{"icon":72,"title":69,"to":70},"The owner-side procedure that adds your address to the bridge.",[3797,3804,3805],{"icon":44,"title":187,"to":42},"Detailed IAM, KMS, and S3 bucket steps in the AWS console.",[3807,3808,3809],"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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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}",{"title":401,"searchDepth":447,"depth":447,"links":3811},[3812,3818,3819,3820,3821,3822,3823,3824,3825,3829,3830,3831],{"id":218,"depth":447,"text":219,"children":3813},[3814,3815,3816,3817],{"id":315,"depth":477,"text":316},{"id":319,"depth":477,"text":320},{"id":323,"depth":477,"text":324},{"id":327,"depth":477,"text":328},{"id":331,"depth":447,"text":332},{"id":525,"depth":447,"text":526},{"id":666,"depth":447,"text":667},{"id":969,"depth":447,"text":970},{"id":1230,"depth":447,"text":1231},{"id":1382,"depth":447,"text":1383},{"id":1577,"depth":447,"text":1578},{"id":2793,"depth":447,"text":2794,"children":3826},[3827,3828],{"id":2852,"depth":477,"text":2853},{"id":3172,"depth":477,"text":3173},{"id":3445,"depth":447,"text":3446},{"id":3645,"depth":447,"text":3646},{"id":3791,"depth":447,"text":3792},"Join the BitSong Hyperlane validator multisig on an existing bridge using a production AWS setup (KMS signing + S3 checkpoint storage).","md",null,{},{"icon":67},{"title":3838,"description":3839},"Join the Hyperlane Multisig - BitSong AWS Production Guide","Step-by-step guide to join the BitSong Hyperlane validator multisig on crescendo-1 with AWS KMS and S3, on an already-deployed bridge.","iSWFg4qp2uLjSJ0gLmglDT1Gr_tTgDxcMqAp_8jQKnc",[3842,3844],{"title":59,"path":60,"stem":61,"description":3843,"icon":62,"children":-1},"Test cross-chain token transfers between BitSong and Base Sepolia using your deployed Hyperlane warp route.",{"title":69,"path":70,"stem":71,"description":3845,"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.",1781776026670]