본문으로 건너뛰기

Cosmos

이 파트에서는 Cosmos 트랜잭션 전송을 dapp.request를 통해 시작하는 방식을 소개합니다. 이 API에서 제공하는 것보다 더 높은 수준의 추상화가 필요한 경우 공급자를 직접 사용하는 대신, 편의 라이브러리를 사용하는 것이 좋습니다. WELLDONE Wallet은 dapp 메소드의 편리한 사용을 위한 방법을 강구 중입니다.

Cosmos 네트워크에 트랜잭션을 보내기 위해서는 다음의 과정이 먼저 필요합니다.

  1. Universal Provider (window.dapp) 감지
  2. 사용자가 연결된 Cosmos 네트워크 감지
  3. 사용자의 Cosmos 계정 가져오기

WELLDONE Wallet에서는 해당 지갑 주소에 연결된 네트워크를 자동으로 감지하여 가져옵니다. 따라서 트랜잭션을 보내기 이전에 메인넷에 트랜잭션을 보낼 것인지, 테스트넷에 트랜잭션을 보낼 것인지 미리 고려해두어야 합니다. 트랜잭션은 아래와 같은 포맷을 통해 전송될 수 있습니다.

const response = await dapp.request('cosmos', {
method: 'dapp:signAndSendTransaction',
params: [HEX_STRING_TX_DATA],
});

1. Returns

해당 메소드는 단일 트랜잭션 뿐만 아니라 여러 개의 트랜잭션 전송이 가능하기 때문에, 트랜잭션 해시 값을 string 타입의 Promise 배열로 반환합니다.

Promise<string[]>;

2. Params

dapp:signAndSendTransaction 메소드는 트랜잭션을 HEX string 타입으로 변환한 값 HEX_STRING_TX_DATA을 인자로 받습니다. 하지만 Cosmos 계열의 네트워크는 트랜잭션 객체를 JSON String 타입으로 변환한 값을 인자로 전달할 수 있습니다.

interface TransactionParameters {
signerData: {
accountNumber: string;
sequence: string;
chainId: string;
};
fee: {
amount: [
{
denom: string;
amount: string;
},
];
gas: string;
};
memo: string;
msgs: [
{
typeUrl: '/cosmos.bank.v1beta1.MsgSend';
value: {
fromAddress: string;
toAddress: string;
amount: [{ denom: string; amount: string }];
};
},
];
sequence: string;
}
  • typeUrl의 종류와 실행하고자 하는 컨트랙트의 메소드에 따라서 value의 값이 달라집니다. 위의 파라미터는 다른 계정에게 코인을 보내는 트랜잭션 타입의 예시입니다.

3. Example

const sendTransaction = async () => {
// get accounts first
const accounts = await dapp.request('cosmos', { method: 'dapp:accounts' });
const sequence = '10';
const chainId = 'vega-testnet';
const transactionParameters = {
signerData: {
accountNumber: accounts,
sequence,
chainId,
},
fee: {
amount: [
{
denom: 'uatom',
amount: '10000',
},
],
gas: '180000', // 180k
},
memo: '',
msgs: [
{
typeUrl: '/cosmos.bank.v1beta1.MsgSend',
value: {
fromAddress: accounts,
toAddress: accounts, // send to yourself
amount: [{ denom: 'uatom', amount: '10000' }],
},
},
],
sequence: `${sequence}`,
};
// sending a transaction
try {
const response = await dapp.request('cosmos', {
method: 'dapp:signAndSendTransaction',
params: [JSON.stringify(transactionParameters)],
});
const txHash = response[0];
} catch (error) {
/*
{
message: 'User denied transaction signature',
code: 4001,
}
*/
}
};

아래의 예제를 통해 실제로 트랜잭션을 전송해 볼 수 있습니다. 트랜잭션을 보내기 위해선 테스트넷 토큰이 필요합니다. 지갑 내의 FAUCET 탭에서 faucet을 요청할 수 있습니다.

라이브 에디터
결과
Loading...