â–Ģī¸Creating pairs

To create pairs, you can follow the steps outlined in this section. There are two forms of pools that can be created (AZERO/PSP22 or PSP22/PSP22) on the protocol and they have distinct approaches.

Note that creating a pair for two tokens that already exists would lead to a panic!

Creating an AZERO/PSP22 Pair

To create an AZERO/PSP22 pair, we can use the following approach:

fn create_azero_pair(&self, psp22_token:AccountId) -> AccountId {
    let salt_int = ADDRESS_SALTING_INTEGER;
    let azero_pair: Result<Result<AccountId, LangError>, Error> = build_call::<DefaultEnvironment>()
        .call_type(Call::new().callee(ROUTER_ADDRESS))
        .exec_input(
            ExecutionInput::new(Selector::new(
                [0x23, 0xc6, 0xff, 0xad]
            ))
            .push_arg(psp22_token)
            .push_arg(salt_int)
        )
        .call_flags(CallFlags::default().set_allow_reentry(true)) //Ignore this line or set to false if it's not a reentrant call
        .returns::<Result<AccountId, LangError>>()
        .fire();
    
    match azero_pair {
        Err(_) => {
            panic!("Failed call")
        }
        Ok(Err(_)) => {
            panic!("Failed call")
        }
        Ok(Ok(_address)) => return _address
    }
}

Creating a PSP22/PSP22 Pair

To create a PSP22/PSP22 pair, we can use the following approach:

fn create_azero_pair(&self, psp22_token_a:AccountId, psp22_token_b:AccountId) -> AccountId {
    let salt_int = ADDRESS_SALTING_INTEGER;
    let psp22_pair: Result<Result<AccountId, LangError>, Error> = build_call::<DefaultEnvironment>()
        .call_type(Call::new().callee(ROUTER_ADDRESS))
        .exec_input(
            ExecutionInput::new(Selector::new(
                [0x50, 0x49, 0x5b, 0x96]
            ))
            .push_arg(psp22_token_a)
            .push_arg(psp22_token_b)
            .push_arg(salt_int)
        )
        .call_flags(CallFlags::default().set_allow_reentry(true)) //Ignore this line or set to false if it's not a reentrant call
        .returns::<Result<AccountId, LangError>>()
        .fire();
    
    match psp22_pair {
        Err(_) => {
            panic!("Failed call")
        }
        Ok(Err(_)) => {
            panic!("Failed call")
        }
        Ok(Ok(_address)) => return _address
    }
}

Last updated