signMessage
Function
Sign the message
according to the account
, ethConnectedSigner
, arJWK
, isSmartAccount
parameters passed when the Everpay instance was created.
Parameter
everpay.signMessage(message: string, smartAccountDirectly?: boolean): Promise<SignMessageResult>
danger
smartAccountDirectly
may not be passed, default is false.- The
smartAccountDirectly
parameter is only valid for mailbox account signatures. - When it is an email account,
!!smartAccountDirectly
istrue
.- The
webauthn
direct signaturemessage
is used. message
Must be >= 96 in length.- The
message
field in the returned result is the same as the originalmessage
.
- The
- When it is an email account,
! !smartAccountDirectly
isfalse
.- everpay-js internally hash the
message
withhashMessage
before signing it withwebauthn
message
has no length limit.- The
message
field in the returned result is a hex string afterhashMessage(message)
.
- everpay-js internally hash the
Return
export interface SignMessageResult {
message: string
sig: string
}
Example
EVM signMessage
describe('signMessage for EVM', () => {
test('signMessage EVM should be OK', async () => {
const message = 'verify'
const signResult = await everpayEVM.signMessage(message)
expect(signResult.message).toBe(message)
return await everpayEVM.verifyMessage({
type: 'sign',
message,
account: ethWalletHasUSDT.address,
sig: signResult.sig
}).then(result => {
expect(result.public).toBeTruthy()
expect(result.publicId.toLowerCase()).toBe(ethWalletHasUSDT.address.toLowerCase())
})
})
})
Arweave signMessage
describe('signMessage for Arweave', () => {
test('signMessage for Arweave should be OK', async () => {
const account = arWallet1.address
const message = 'verify'
const signResult = await everpayAR.signMessage(message)
expect(signResult.message).toBe(message)
return await everpayAR.verifyMessage({
type: 'sign',
message,
account,
sig: signResult.sig
}).then(result => {
expect(result.public).toBeTruthy()
expect(result.publicId.toLowerCase()).toBe(account.toLowerCase())
})
})
})
Smart Account signMessage
danger
Due to browser window security popup restrictions, do not call the smartAccountAuth
interface and the signMessage
interface in the same function, they must be triggered by different event functions. The following is just an example
const authResult = await new Everpay().smartAccountAuth()
const everpaySmartAccount = new Everpay({
account: authResult.account,
isSmartAccount: true
})
const signResult = await everpaySmartAccount.signMessage('Hello World')
/*
{
message: "0xa1de988600a42c4b4ab089b619297c17d53cffae5d5120d82d8a92d0bb3b78f2",
sig: "eyJpZCI6IjMxMXFZREhCZTE4U0hLVS1IUjFYUHJoUGZ2bjE5Q3I1RVYwU1FZbl9scVkiLCJyYXdJZCI6IjMxMXFZREhCZTE4U0hLVS1IUjFYUHJoUGZ2bjE5Q3I1RVYwU1FZbl9scVkiLCJjbGllbnREYXRhSlNPTiI6ImV5SjBlWEJsSWpvaWQyVmlZWFYwYUc0dVoyVjBJaXdpWTJoaGJHeGxibWRsSWpvaVRVaG9hRTFYVW14UFZHYzBUbXBCZDFsVVVYbFplbEpwVGtkR2FVMUVaelZaYWxsNFQxUkpOVTR5VFhoT01sRXhUVEpPYlZwdFJteE9WMUV4VFZSSmQxcEVaM2xhUkdob1QxUkthMDFIU21sTk1ra3pUMGRaZVNJc0ltOXlhV2RwYmlJNkltaDBkSEE2THk5c2IyTmhiR2h2YzNRNk9EQTRNU0lzSW1OeWIzTnpUM0pwWjJsdUlqcG1ZV3h6WlgwIiwiYXV0aGVudGljYXRvckRhdGEiOiJTWllONVlnT2pHaDBOQmNQWkhaZ1c0X2tycm1paGpMSG1Wenp1b01kbDJNRkFBQUFBQSIsInNpZ25hdHVyZSI6Ik1FWUNJUUROLVZTVG1IMGJ5eElfYzY3dFN1VC1CNmR2aVNjaFozVXhlZ2FqTllHYWVBSWhBTDBXcmRCdGJBbWYtRWxqa3lFQkZVYzJUcWxYeDhGWVNLb2JRaWlHTEhqRSIsInVzZXJIYW5kbGUiOiJSbDY2SHJnZGd1bEpzZyJ9,eyJpZCI6IjMxMXFZREhCZTE4U0hLVStIUjFYUHJoUGZ2bjE5Q3I1RVYwU1FZbi9scVk9IiwicHVibGljS2V5IjoicFFFQ0F5WWdBU0ZZSUZldWlsY0ZVdGowZGl5SUFRcnZGdFJRVjRRbndSem1SUldmRGNtY1ZYd0JJbGdnOW5hdjVUeVdiL2Y1RWgxWkQ4c2k3aFRROXlVY2wybVRuQi9iOUF3Z1I4MD0iLCJhdHRlc3RhdGlvblR5cGUiOiJwYWNrZWQiLCJ0cmFuc3BvcnQiOlsiaW50ZXJuYWwiXSwiZmxhZ3MiOnsidXNlclByZXNlbnQiOnRydWUsInVzZXJWZXJpZmllZCI6dHJ1ZSwiYmFja3VwRWxpZ2libGUiOmZhbHNlLCJiYWNrdXBTdGF0ZSI6ZmFsc2V9LCJhdXRoZW50aWNhdG9yIjp7IkFBR1VJRCI6InJjNEFBalc4eGdwa2l3c2w4ZkJWQXc9PSIsInNpZ25Db3VudCI6MCwiY2xvbmVXYXJuaW5nIjpmYWxzZSwiYXR0YWNobWVudCI6InBsYXRmb3JtIn19,FIDO2"
}
*/
const signDirectlyResult = await everpaySmartAccount.signMessage('h'.repeat(96), true)
/*
{
message: "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
sig: "eyJpZCI6IjMxMXFZREhCZTE4U0hLVS1IUjFYUHJoUGZ2bjE5Q3I1RVYwU1FZbl9scVkiLCJyYXdJZCI6IjMxMXFZREhCZTE4U0hLVS1IUjFYUHJoUGZ2bjE5Q3I1RVYwU1FZbl9scVkiLCJjbGllbnREYXRhSlNPTiI6ImV5SjBlWEJsSWpvaWQyVmlZWFYwYUc0dVoyVjBJaXdpWTJoaGJHeGxibWRsSWpvaVlVZG9iMkZIYUc5aFIyaHZZVWRvYjJGSGFHOWhSMmh2WVVkb2IyRkhhRzloUjJodllVZG9iMkZIYUc5aFIyaHZZVWRvYjJGSGFHOWhSMmh2WVVkb2IyRkhhRzloUjJodllVZG9iMkZIYUc5aFIyaHZZVWRvYjJGSGFHOWhSMmh2WVVkb2IyRkhhRzloUjJodllVZG9iMkZIYUc5aFIyaHZZVWRvYjJGSGFHOGlMQ0p2Y21sbmFXNGlPaUpvZEhSd09pOHZiRzlqWVd4b2IzTjBPamd3T0RFaUxDSmpjbTl6YzA5eWFXZHBiaUk2Wm1Gc2MyVjkiLCJhdXRoZW50aWNhdG9yRGF0YSI6IlNaWU41WWdPakdoME5CY1BaSFpnVzRfa3JybWloakxIbVZ6enVvTWRsMk1GQUFBQUFBIiwic2lnbmF0dXJlIjoiTUVZQ0lRRFR5cmZmQVozNmR6Nk1jS2o5alA3TmxXa2N1TXBnVGFHdE14UUw1Z3JlRUFJaEFMSFVOa2MxUGl0cXplRzNuMnlkV3hSWjhoNW9TMDJPNWg0cEdic05JSUY5IiwidXNlckhhbmRsZSI6IlJsNjZIcmdkZ3VsSnNnIn0=,eyJpZCI6IjMxMXFZREhCZTE4U0hLVStIUjFYUHJoUGZ2bjE5Q3I1RVYwU1FZbi9scVk9IiwicHVibGljS2V5IjoicFFFQ0F5WWdBU0ZZSUZldWlsY0ZVdGowZGl5SUFRcnZGdFJRVjRRbndSem1SUldmRGNtY1ZYd0JJbGdnOW5hdjVUeVdiL2Y1RWgxWkQ4c2k3aFRROXlVY2wybVRuQi9iOUF3Z1I4MD0iLCJhdHRlc3RhdGlvblR5cGUiOiJwYWNrZWQiLCJ0cmFuc3BvcnQiOlsiaW50ZXJuYWwiXSwiZmxhZ3MiOnsidXNlclByZXNlbnQiOnRydWUsInVzZXJWZXJpZmllZCI6dHJ1ZSwiYmFja3VwRWxpZ2libGUiOmZhbHNlLCJiYWNrdXBTdGF0ZSI6ZmFsc2V9LCJhdXRoZW50aWNhdG9yIjp7IkFBR1VJRCI6InJjNEFBalc4eGdwa2l3c2w4ZkJWQXc9PSIsInNpZ25Db3VudCI6MCwiY2xvbmVXYXJuaW5nIjpmYWxzZSwiYXR0YWNobWVudCI6InBsYXRmb3JtIn19,FIDO2"
}
*/